3

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


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。这允许在两个数据库之间进行有限的所有权链接,而无需诉诸完整的数据库所有权链接。

4

3 回答 3

2

为什么不删除 EXECUTE AS OWNER?

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

于 2008-09-29T18:18:34.197 回答
1

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

授予连接到访客

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

于 2011-02-18T15:31:13.230 回答
0

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

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

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

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

希望有帮助,

于 2008-10-01T14:51:58.530 回答