全部,
在SQL Server中,存储过程(从用户运行)是否可以写入用户无权直接写入表的表?
RGDS,
MK
答案 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)
简而言之,是的。
此场景中的主要限制是用户是否可以执行存储过程。
当创建存储过程时,需要使用对相关表具有必要写入权限的登录/用户来完成。