【问题标题】:Problems running a stored procedure owned by another user运行另一个用户拥有的存储过程时出现问题
【发布时间】:2010-11-10 16:34:20
【问题描述】:

我们有一个第 3 方应用程序想要使用 SQL 2005 风格的“模式”语法调用存储过程:

Customer.InsertNewOrder

不过,此数据库仍在 SQL 2000 上,因此我们试图使其“看起来”像 SQL 2005 架构,并且仍然可以正常工作(具有最低必要权限)。所以我们:

  1. 创建了一个名为“客户”的用户
  2. 创建了该用户拥有的存储过程
  3. 授予网络用户对存储过程的“执行”权限(通过角色)

授予我们的网络用户执行权限通常是运行 dbo 拥有的 procs 所需的全部内容(如“dbo.InsertOrder”)。我们通常不必对基础表授予显式权限。但在这种情况下它似乎不起作用。我们收到一个错误:

INSERT permission denied on object "Order"

那我做错了什么?

我怎样才能告诉 什么 用户在这里被拒绝了。是我的网络用户吗?或者它是作为 Customer 用户“执行”,而 Customer 用户需要额外的权限? (我尝试向客户用户(db_datareader 和 db_datawriter,甚至尝试 db_owner)授予额外的权限,但这似乎没有帮助。无论如何,db_owner 在生产中不是一个选项。)

我想我可以在必要的表上授予显式 INSERT 权限,但是为什么在这种情况下这是必要的,而对于 DBO 拥有的过程来说不是这种情况?

编辑:
为了这个问题,我已经简化了。实际上,我在两个不同的“模式”下有几十个存储过程,可以从许多表中插入、更新和选择。所以希望不必手动逐项列出所有权限,如果我能提供帮助的话......

【问题讨论】:

    标签: sql-server stored-procedures permissions sql-server-2000


    【解决方案1】:

    "当一个用户拥有源对象时 和所有目标对象,所有权 据说链条是不间断的。如果 不同的用户拥有目标 对象,所有权链是 破碎的。 SQL Server 依赖于状态 所有权链的确定 何时检查权限。
    (剪辑)
    如果 所有权链断了,SQL 服务器检查每个权限 由 a 拥有的链的分支 不同的用户。只有那些陈述 用户有必要的地方 权限将被执行,并且 剩余的语句将得到一个 “权限不足”错误。通过这种方式,SQL Server 允许对象所有者保留对权限的控制。”

    引自Using Ownership Chains

    要将其应用于当前场景,当 Customer.InsertOrder 过程尝试插入 dbo.Order 表时,这会破坏所有权链,并且 SQL 检查查看原始用户(本例中为WebUser)是否有权执行插入。

    因此,WebUser(不是客户)将需要插入 dbo.Order 的权限(显式地或通过 db_datawriter)。如果需要,可以从客户那里删除所有权限。

    【讨论】:

    • 明确授予用户 Customer 对表的插入权限。
    【解决方案2】:

    是客户用户。它需要对 Order 表的数据写入器访问权限。

    【讨论】:

    • 但是 Customer 用户已经是数据库级 db_datawriter 角色的成员。这还不够吗?
    • 如果从 InsertNewOrder sp 中将 Order 表引用为 dbo.Order 会发生什么?
    • 不确定。如果我不需要,不要这样做,因为这只是几十个过程中的一个(为了这个问题,我简化了)。不过,您是对的,存储过程不使用完全限定的表名。
    • 不。是 WebUser,而不是 Customer 用户。
    • Apols。我确信 sp 是在其所有者的用户上下文中运行的。我认为您可以阻止用户直接访问表,但可以通过 sp 访问某些数据。也许是呼叫连接和所有者的最低权限或其他什么..?但是真的没有意义……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多