当表中没有访问权限时,存储过程访问

时间:2011-03-18 17:15:28

标签: sql-server security stored-procedures data-access-layer

全部,

在SQL Server中,存储过程(从用户运行)是否可以写入用户无权直接写入表的表?

RGDS,

MK

3 个答案:

答案 0 :(得分:9)

正确答案是 NO ,存储过程无权写入表。但是,由于Ownership Chains

,大多数用户错误地将其视为“是”
  

当多个数据库对象访问时   相继顺序,顺序   被称为连锁店。虽然如此   链不独立存在,   当SQL Server遍历链接时   一个链,SQL Server评估   组成对象的权限   不同于它的情况   单独访问对象。   这些差异很重要   对管理安全的影响。   所有权链接使管理成为可能   访问多个对象,例如   多个表,通过设置   对一个对象的权限,例如   视图。

因此,一个程序将能够写入一个表,如果用户构成一个所有权链,则该表无权写入。这意味着,如果包含该表的模式的所有者与包含该过程的模式的所有者相同,则会形成一个所有权链,并允许该过程写入该表。由于实践中部署的绝大多数对象属于dbo模式,因此几乎总是形成所有权链。

理解这些细节非常重要,因此您可以解决问题并理解为什么是允许写入表格的过程。 Erland Sommarskog在这个主题上有一篇非常全面的文章:Giving Permissions through Stored Procedures。本文详细介绍了所有可用的选项。最好的选择,比所有权链接好得多,是code signing

了解其工作原理还有助于理解为什么动态SQL似乎“破坏”:运行动态SQL是所有权链中的自动中断,这会导致所有“魔法”消失。它还有助于理解为什么这个“魔术”似乎无法在数据库外工作:cross db ownership chaining Option默认值为0.

答案 1 :(得分:0)

是的,如果用户对SP具有GRANTed EXEC权限,则允许在该数据库中执行任何操作。

转到另一个数据库将需要检查基础用户的权限。

此外,SP内置的动态SQL将要求底层用户拥有权限。

答案 2 :(得分:0)

简而言之,是的。

此场景中的主要限制是用户是否可以执行存储过程。


创建存储过程时,需要使用对相关表具有必要写入权限的登录/用户来完成。