表中无访问时的存储过程访问

Posted

技术标签:

【中文标题】表中无访问时的存储过程访问【英文标题】:Stored Procedures access when no access in a table 【发布时间】:2011-07-18 08:26:41 【问题描述】:

全部,

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

Rgds,

MK

【问题讨论】:

【参考方案1】:

正确答案是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。

【讨论】:

对此赞不绝口!刚刚测试了这一点,这是真的。现在我必须更改我的一些架构的所有权....【参考方案2】:

简而言之,是的。

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

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

【讨论】:

【参考方案3】:

是的,如果用户在 SP 上被授予 EXEC 权限,则允许其采取的任何操作(在该数据库内)。

转到另一个数据库需要检查底层用户的权限。

此外,SP 中构建的动态 SQL 将要求底层用户具有权限。

【讨论】:

例外情况是如果您在 proc 中使用动态 SQL。那么权限必须在表或视图级别。 @HLGEM - 是的,这也是正确的,动态 SQL 将在调用用户的上下文中执行 @Remus 对不起——你说得对。在所有对象都不属于dbo的情况下,就没有这么简单了。 我很高兴读到这篇文章,因为我的印象是任何对一个模式具有 exec 权限的人都无法在我的另一个模式中执行任何操作,但这只是对了一半,架构需要有不同的所有者才能正常工作。

以上是关于表中无访问时的存储过程访问的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从存储过程访问 Azure Blob?

如何在 Python 中使用表值参数访问 SQL Server 2008 存储过程

实验八:存储过程

datagrips oracle编写存储过程

存储过程和权限 - EXECUTE 是不是足够?

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集