Given a simplified stored procedure
x
CREATE OR ALTER PROCEDURE [FooSchema].[Foo]
AS
SELECT
B.*,
FROM [BarSchema].[Bar] AS B
WHERE [ ]
After granting EXEC to a user on the FooSchema, but not on the BarSchema, this stored procedure will fail with the message
The SELECT permission was denied on the object 'Bar',
Is there a way to make the user access [FooSchema].[Foo] without exposing [BarSchema].[Bar]’s entire data set as the stored procedure already filters out data relevant to this user.
Advertisement
Answer
Easiest option is to use [WITH EXECUTE AS]
statement, where the username specified has the exact permissions needed for the objects in question.
CREATE OR ALTER PROCEDURE [FooSchema].[Foo]
WITH EXECUTE AS '<username>'
AS
SELECT
B.*,
FROM [BarSchema].[Bar] AS B
WHERE [ ]