我有一个 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/