【问题标题】:Stored Procedure Ownership Chaining存储过程所有权链接
【发布时间】:2010-09-14 01:40:29
【问题描述】:

我的数据库中有几个存储过程,用于从位于单独数据库中的数据集市加载数据。这些程序通常采用以下形式:


CREATE PROCEDURE load_stuff
WITH EXECUTE AS OWNER AS
INSERT INTO my_db.dbo.report_table
(
  column_a
)
SELECT
  column_b
FROM data_mart.dbo.source_table
WHERE
  foo = 'bar';

当我在 SQL Server Management Studio 中执行查询时,这些运行良好。当我尝试使用 EXEC load_stuff 执行它们时,程序失败并出现安全警告:

服务器主体“the_user”无法在当前安全上下文下访问数据库“data_mart”。

sproc 的 OWNER 是 dbo,即 the_user(为了我们的示例)。两个数据库的 OWNER 也是 the_user 并且 the_user 映射到 dbo(这是 SQL Server 应该做的)。

为什么我会在 SQL Server 中看到此错误?这是因为相关用户的别名为 dbo,我应该使用不同的用户帐户进行跨数据库数据访问吗?

编辑 我知道这是因为 SQL Server 默认禁用跨数据库所有权链接,这很好。但是,我不确定在这种情况下的最佳做法。如果有人对此方案的最佳实践有任何意见,我们将不胜感激。

编辑 2 最终的解决方案是在两个数据库上都设置 TRUSTWORTHY ON。这允许在两个数据库之间进行有限的所有权链接,而无需求助于完整的数据库所有权链接。

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    为什么不删除 EXECUTE AS OWNER?

    通常,执行 SP 的用户在两个数据库中都拥有适当的权限,而我根本不必这样做。

    【讨论】:

      【解决方案2】:

      无需创建登录,您只需在目标数据库中启用访客用户即可。

      授权连接到访客

      这允许执行用户在访客上下文下进入数据库,并且当“数据库链接为 ON 时,将不会在目标数据库中检查访问。

      【讨论】:

        【解决方案3】:

        其实DBO是一个角色(你可以把它看成是一组用户),而不是一个用户本身。 (除非您可以使用 dbo:passwordfordbo 连接到 SQL SERVER,否则它不是用户)。

        通常,在 SQL Server 的美妙世界中,如果您授予 userX 执行 storedprocY 的权限,那么 X 有权执行 Y 包含的所有任务,即使他没有对 Y 中使用的所有对象的所有权限.

        这是将业务逻辑封装在存储过程中的一个非常有用的功能。 (您的用户无权访问该表,但他们可以执行一个存储过程)。

        当我们谈论“所有权链接”时,它的含义如下(如果我错了,请纠正我) - 如果所有权链接被禁用:只要所有需要的对象都在同一个数据库中,执行procedureX的权利就会起作用 - 启用链接:该“特权”将扩展到所有数据库。

        希望对你有帮助,

        【讨论】:

        • 其实dbo是一个映射到实例级登录的用户(不是登录)。 db_owner 是你想的角色。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 2017-02-08
        • 1970-01-01
        • 2021-12-14
        • 2015-10-23
        • 1970-01-01
        • 2012-04-22
        相关资源
        最近更新 更多