为了保护数据库交互,我创建了一个只能执行存储过程的受限用户。他无权查询任何表。
这个场景我已经很好地实现了!现在的问题是,我的一个存储过程涉及动态 SQL 执行,它说我没有在表 X 上运行 SELECT 查询的权限而导致执行失败。
为避免这种情况,我需要为此类过程 NOT TO USERS 提供明确的 SELECT 权限。
请帮我!
为了保护数据库交互,我创建了一个只能执行存储过程的受限用户。他无权查询任何表。
这个场景我已经很好地实现了!现在的问题是,我的一个存储过程涉及动态 SQL 执行,它说我没有在表 X 上运行 SELECT 查询的权限而导致执行失败。
为避免这种情况,我需要为此类过程 NOT TO USERS 提供明确的 SELECT 权限。
请帮我!
没有内置函数可以让用户执行。
创建具有执行权限的角色并将该角色添加到用户。
CREATE ROLE db_executer
GRANT EXECUTE to db_executer
EXEC sp_addrolemember N'db_executer', N'<username>'
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;
我以前用它来大大简化我们角色的许多授权语句。对于更一般的角色,我们几乎没有覆盖,所以这很有帮助。
在 sql 抱怨您没有权限在表 X 上运行 SELECT 查询的 SP 上,您对该特定 SP 和表的所有权链是否损坏?
这是你想要的吗?
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
定义要作为具有适当权限的用户执行的存储过程: