sql-server - 存储过程和权限 - EXECUTE 就足够了吗?

标签 sql-server stored-procedures permissions

我有一个 SQL Server 2008 数据库,其中对基础表的所有访问都是通过存储过程完成的。一些存储过程只是从表中选择记录,而其他存储过程则进行 UPDATE、INSERT 和 DELETE。

如果存储过程更新表,执行存储过程的用户是否也需要对受影响的表的 UPDATE 权限,或者他们对存储过程具有 EXECUTE 权限就足够了吗?

基本上,我想知道向用户授予对存储过程的 EXECUTE 权限是否足够,或者我是否需要向他们授予对表的 SELECT、UPDATE、DELETE 和 INSERT 权限才能使存储过程正常工作。谢谢。

[编辑] 在我的大多数存储过程中,确实看起来 EXECUTE 就足够了。但是,我确实发现在使用“执行 sp_Executesql”的存储过程中, EXECUTE 是不够的。所涉及的表需要具有在“sp_Executesql”中执行的操作的权限。

最佳答案

如果表和过程具有相同的所有者,则不会检查表的权限(包括 DENY)。它们也可以位于不同的架构中,只要架构具有相同的所有者即可。

参见Ownership chaining在 MSDN 上

根据已删除答案的评论进行编辑。

上下文始终是当前登录,除非使用EXECUTE AS:仅不检查引用的对象DML权限。在没有为引用表分配任何权限的存储过程中尝试 OBJECT_ID(referencedtable)。它给出 NULL。如果由存储过程的所有者执行,那么它将给出一个值,因为所有者拥有引用表的权限

关于sql-server - 存储过程和权限 - EXECUTE 就足够了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815411/

相关文章:

linux - 共享多个用户访问的 NFS4 挂载

azure - 无法以编程方式设置 Azure 存储中 blob 容器的权限

mysql - 如何获取Value列中连续数据的开始和结束ID?

sql-server - 为什么无法将我的 .net 核心容器连接到 SQL Server docker 容器?

sql - 在插入时在 SQL 中自动生成 uniqueidentifier 的问题

node.js - Node.js 中的权限

c# - 从Entity Framework Core调用 native SQL Server函数

mysql - 从mysql中的多个表中选择多列

php - 结果不与存储过程调用MySQL php绑定(bind)

Python:Pyodbc 执行带参数的存储过程