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

kou*_*des 2 sql-server security stored-procedures data-access-layer

所有,

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

RGDS,

MK

Rem*_*anu 9

正确的答案是NO,存储过程无权写入表.然而,由于所有权链,大多数用户错误地将其视为"是" :

当多个数据库对象按顺序相互访问时,该序列称为链.虽然这些链不是独立存在的,但当SQL Server遍历链中的链接时,SQL Server对组成对象的权限评估方式与单独访问对象时的权限不同.这些差异对管理安全性具有重要意义.所有权链接允许通过在一个对象(例如视图)上设置权限来管理对多个对象(例如多个表)的访问.

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

理解这些细节非常重要,因此您可以解决问题并理解为什么允许该过程写入表中.Erland Sommarskog对此主题进行了全面的综述:通过存储过程提供权限.本文详细介绍了所有可用的选项.代码签名是最好的选择,远比所有权链接好.

了解其工作原理也有助于理解动态SQL似乎"破坏"的原因:运行动态SQL是所有权链中的自动中断,这会导致所有"魔法"消失.它还有助于理解为什么这个"魔术"似乎不能在数据库外工作:交叉数据库所有权链接选项默认值为0.