SQL跨架构存储过程权限问题

Thi*_*ost 1 sql t-sql sql-server

给定一个简化的存储过程

CREATE OR ALTER PROCEDURE [FooSchema].[Foo]
AS
SELECT
    B.*,
    FROM [BarSchema].[Bar] AS B
    WHERE [...]
Run Code Online (Sandbox Code Playgroud)

将 EXEC 授予 FooSchema 上的用户而不是 BarSchema 上的用户后,此存储过程将失败并显示消息

The SELECT permission was denied on the object 'Bar',
Run Code Online (Sandbox Code Playgroud)

有没有办法让用户访问 [FooSchema].[Foo] 而不暴露 [BarSchema].[Bar] 的整个数据集,因为存储过程已经过滤掉了与该用户相关的数据。

Gre*_*reg 5

最简单的选择是使用[WITH EXECUTE AS]语句,其中指定的用户名具有相关对象所需的确切权限。

CREATE OR ALTER PROCEDURE [FooSchema].[Foo]
WITH EXECUTE AS '<username>'
AS
SELECT
    B.*,
    FROM [BarSchema].[Bar] AS B
    WHERE [...]
Run Code Online (Sandbox Code Playgroud)