Sql 存储过程所有权链接

Sql 存储过程所有权链接,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我的数据库中有几个存储过程,用于从单独数据库中的数据集市加载数据。这些程序通常采用以下形式: 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'; 当我在SQLServerManagementStudi

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


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';
当我在SQLServerManagementStudio中执行查询时,它们运行良好。当我尝试使用EXEC load_stuff执行它们时,该过程失败并发出安全警告:

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

存储过程的所有者是dbo,它是_用户(为了我们的示例)。这两个数据库的所有者也是_用户,并且_用户映射到dbo(这是SQLServer应该做的)

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

编辑 我知道这是因为SQLServer默认情况下禁用了跨数据库所有权链接,这很好。然而,我不确定这种情况下的最佳实践。如果有人对该场景的最佳实践有任何意见,我们将不胜感激

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

为什么不删除EXECUTE AS OWNER

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

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

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

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

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


希望对您有所帮助,

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

授予连接到来宾的权限

这允许执行用户在来宾上下文下输入DB,并且当“DB链接打开”时,将不会在目标DB中检查。实际上,dbo是一个映射到实例级登录的用户(而不是登录名)。DB_所有者是您考虑的角色。