我的数据库中有几个存储过程,用于从位于单独数据库中的数据集市加载数据。这些程序通常采用以下形式:
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。这允许在两个数据库之间进行有限的所有权链接,而无需诉诸完整的数据库所有权链接。