sql - 使用 "Execute sp_Executesql"时的权限

标签 sql sql-server permissions dynamic-sql sp-executesql

我有一个数据库,其中所有访问都由存储过程控制。 DBA 希望避免向用户提供对基础表的直接读/写访问权限,这一点我可以理解。因此,所有数据的更新和选择都是通过存储过程完成的。基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有 EXECUTE 权限,并向用户授予该角色。

问题在于其中一个存储过程动态构建 SQl 查询并通过“执行 sp_Executesql”执行它。无需详细说明,查询是动态构建的,因为它会根据许多用户输入参数而发生显着变化。有问题的存储过程只是一个 SELECT sql 语句,但是我发现仅授予存储过程 EXECUTE 权限是不够的。使用“执行 sp_Executesql”的存储过程中引用的基础表需要被授予“datareader”访问权限,否则存储过程将失败。

关于如何纠正这个问题有什么想法吗?我确实想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用“执行 sp_Executesq”的存储过程。谢谢。

最佳答案

在包装程序中,您可以使用 EXECUTE AS OWNEREXECUTE AS SomeuserWithNoLogin

这将更改存储过程(包括 sp_executesql)期间的登录上下文。

  • 如果您使用 OWNER,它将起作用,因为您已经在使用所有权链。
  • 如果您的 DBA(好人!)不希望您以 dbo 身份运行,那么请设置一个具有完全读取权限但没有权限的用户。 EXECUTE AS <user>需要输入的是 sys.database_principals

像这样:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin'

有关详细信息,请参阅 EXECUTE AS Clause on MSDN CREATE PROCEDURE

关于sql - 使用 "Execute sp_Executesql"时的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816520/

相关文章:

mysql - 如果一条数据记录不存在,则将其存储到另一个表中

mysql - 如何在 Rails 中表达多表连接

sql - 查找 SQL Server 中一天前发生的死锁详细信息

java - checkSelfPermission 总是返回 GRANTED

python - 锁定程序,使其无法访问外部文件,就像病毒扫描程序一样

Sql数据库与文档数据库?

mysql - UNION 与 HQL 中的排序依据

sql-server - 避免在 WHERE 子句中引用表两次

c# - GenericADOException 未处理无法插入

android - Android 6.0 未经许可抓拍图片