0

为了保护数据库交互,我创建了一个只能执行存储过程的受限用户。他无权查询任何表。

这个场景我已经很好地实现了!现在的问题是,我的一个存储过程涉及动态 SQL 执行,它说我没有在表 X 上运行 SELECT 查询的权限而导致执行失败。

为避免这种情况,我需要为此类过程 NOT TO USERS 提供明确的 SELECT 权限。

请帮我!

4

5 回答 5

4

没有内置函数可以让用户执行。

创建具有执行权限的角色并将该角色添加到用户。

CREATE ROLE db_executer
GRANT EXECUTE to db_executer
EXEC sp_addrolemember N'db_executer', N'<username>'
于 2013-07-05T13:35:59.153 回答
2

MNagel 对此有正确的链接,但重申一下,你想看看使用类似的东西:

CREATE PROC dbo.MyProc
WITH EXECUTE AS 'SomeUser'
AS
BEGIN --Proc
 --Do Stuff
END --Proc
GO

“执行为”在此过程中还有一些其他问题。您必须允许其他人模拟指定的用户,并且该用户需要对基础表具有适当的选择权限。

如果您想批量授予权限,您可以在架构级别而不是对象级别执行此操作 - 例如:

GRANT SELECT, EXEC ON Schema::dbo TO MyRole;

我以前用它来大大简化我们角色的许多授权语句。对于更一般的角色,我们几乎没有覆盖,所以这很有帮助。

于 2013-07-05T23:31:10.480 回答
0

在 sql 抱怨您没有权限在表 X 上运行 SELECT 查询的 SP 上,您对该特定 SP 和表的所有权链是否损坏?

于 2013-07-08T01:46:26.970 回答
0

这是你想要的吗?

USE DatabaseName
GO
-- 1 - db_executestoredprocedures
-- 1a - Create role
CREATE ROLE db_executestoredprocedures
GO
-- 1b - Grant permissions
GRANT EXECUTE TO db_executestoredprocedures
GO

-- 2 - db_selecttablevaluedfunctions
-- 2a - Create role
CREATE ROLE db_selecttablevaluedfunctions
GO
-- 2 - Create permissions
DECLARE @Function_Name nvarchar(250);
DECLARE @CMDEXEC1 nvarchar(2000);
DECLARE db_cursor CURSOR FOR  
SELECT [name]
FROM sys.objects
WHERE Type = 'TF'
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @Function_Name
WHILE @@FETCH_STATUS = 0   
BEGIN

 SET @CMDEXEC1 = 'GRANT SELECT ON [' + @Function_Name + '] TO db_selecttablevaluedfunctions;'
 --- SELECT @CMDEXEC1 
 EXEC(@CMDEXEC1)
 FETCH NEXT FROM db_cursor INTO @Function_Name
END
CLOSE db_cursor   
DEALLOCATE db_cursor
GO
于 2013-07-05T13:46:37.963 回答
0

定义要作为具有适当权限的用户执行的存储过程:

http://msdn.microsoft.com/en-us/library/ms188354.aspx

于 2013-07-05T12:28:34.133 回答