如何授予对所有过程的SELECT权限

时间:2013-07-05 12:18:53

标签: sql-server-2008 tsql

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

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

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

请帮助我!

5 个答案:

答案 0 :(得分:4)

没有用于为用户提供执行的内置功能。

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

CREATE ROLE db_executer
GRANT EXECUTE to db_executer
EXEC sp_addrolemember N'db_executer', N'<username>'

答案 1 :(得分:2)

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

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

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

如果要批量授予权限,可以在Schema级别而不是对象级别执行此操作 - 类似于:

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

之前我曾经使用它来大大简化我们角色的许多授权声明。对于更一般的角色,我们很少有覆盖,因此这有很大帮助。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

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