为了保护数据库交互,我创建了一个只能执行存储过程的受限用户。他没有任何查询任何表的权利。
这个场景我已经很好地实现了!现在的问题是,我的一个存储过程涉及动态SQL执行,它通过说我没有在表X上运行SELECT查询的权限而无法执行。
为避免这种情况,我需要为此类程序提供明确的SELECT权限。
请帮助我!
答案 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)
定义要以具有适当权限的用户执行的存储过程:
答案 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和表上拥有断开的所有权链?