【发布时间】:2011-07-18 08:26:41
【问题描述】:
全部,
在 SQL Server 中,存储过程(从用户运行)可以写入用户无权直接写入表的表吗?
Rgds,
MK
【问题讨论】:
标签: sql-server security stored-procedures data-access-layer
全部,
在 SQL Server 中,存储过程(从用户运行)可以写入用户无权直接写入表的表吗?
Rgds,
MK
【问题讨论】:
标签: sql-server security stored-procedures data-access-layer
正确答案是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。
【讨论】:
简而言之,是的。
这个场景中的主要限制是用户是否可以执行存储过程。
创建存储过程时,需要使用对相关表具有必要写入权限的登录名/用户来完成。
【讨论】:
是的,如果用户在 SP 上被授予 EXEC 权限,则允许其采取的任何操作(在该数据库内)。
转到另一个数据库需要检查底层用户的权限。
此外,SP 中构建的动态 SQL 将要求底层用户具有权限。
【讨论】: