【问题标题】:Should CONTROL permission be given on a Stored Procedure in SQL Server 2005?SQL Server 2005 中的存储过程是否应授予 CONTROL 权限?
【发布时间】:2010-09-30 13:16:08
【问题描述】:

我遇到了一个问题,即在 SQL Server 2005 中授予对特定存储过程的 EXECUTE 权限不起作用。一些测试人员弄乱了权限 - 并发现如果他们还授予存储过程的 CONTROL 权限 - 那么它运行良好。他们现在确信授予 CONTROL 权限是可行的方法。

我知道这不可能是真的——事实上我认为真正的问题是用户没有选择/插入/更新/删除存储过程所针对的表的权限。问题是,我似乎在网上找不到任何可以证明这一点的东西。

我说的对吗?有人知道任何有关此的文档吗?

提前致谢。

回复 cmets 的更多信息: 存储过程正在执行多次删除。它首先删除将被删除的“主”记录孤立的所有记录,然后最后删除父记录。

此外,我们看到的错误表明用户没有足够的权限 - 或者存储过程不存在。我们已经确认我们使用了正确的用户,并且已向该用户授予 EXECUTE 权限。

【问题讨论】:

  • 如果你给一个存储过程的执行权限,它可以做所有它想要的插入、更新和删除。你需要告诉我们这个 sp 还在做什么。
  • 哦,是的......对此感到抱歉。存储过程正在执行多次删除。它首先删除将被删除的“主”记录孤立的所有记录,然后最后删除父记录。
  • 另外,我们看到的错误表明用户没有足够的权限——或者存储过程不存在。我们已经确认我们使用的是正确的用户,并且已向该用户授予 EXECUTE 权限。

标签: sql sql-server sql-server-2005 permissions controls


【解决方案1】:

如果存储过程是使用 EXECUTE AS CALLER 创建的(我相信这是默认设置),那么调用者必须拥有执行存储过程所需的所有权限,除了对过程执行 EXECUTE。

来自 EXECUTE AS 的 SQL Server 文档:

CALLER 指定里面的语句 模块在上下文中执行 模块的调用者。用户 执行模块必须有 适当的权限不仅在 模块本身,也可以在任何 被引用的数据库对象 按模块。

请注意,由于 SQL Server 使用所有权链处理权限检查的方式,严格来说这并不总是正确的,而且我猜测在过程上授予 CONTROL(将所有权状态授予被授予者)会导致这些权限要绕过的检查。

如果您使用 EXECUTE AS OWNER 创建过程,那么您不需要授予该过程的 EXECUTE 以外的任何权限。

【讨论】:

    【解决方案2】:

    只需执行即可。

    存储过程是否在访问它所在的数据库之外的表?

    如果是这样,请尝试为存储过程在同一数据库之外使用的表设置适当的用户权限。

    【讨论】:

      【解决方案3】:

      如果您只需要能够执行存储过程,那么显然 CONTROL 权限不是要走的路。是的,它可以工作,就像在本地系统帐户下运行您的网站一样。

      如果 EXECUTE 权限的授予者也是受影响的表的所有者,那么执行 sp 应该没有问题。否则,您应该授予显式权限或考虑使用 ALTER AUTHORIZATION 语句调整所有权。

      为了便于管理,创建一个数据库角色来应用明确的权限,而不是直接将它们分配给用户。

      【讨论】:

        【解决方案4】:

        这可能已经解决了,但就我而言,我需要授予控制权限的原因(在测试服务器上,而不是实时服务器上)是因为存储过程的原始开发人员在设计时错过了 GO 语句所以 GRANT EXECUTE 行在存储过程中。我们在现场修复了该问题,但看起来该修复程序从未在测试中实施。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 2011-05-30
          • 1970-01-01
          • 2015-12-01
          • 2010-11-28
          • 1970-01-01
          相关资源
          最近更新 更多