一尘不染

使用动态SQL的存储过程中的SQL Server权限

sql

我有一个具有应用程序角色的数据库。角色成员都属于Active
Directory中的组。我没有给角色授予从表中进行选择的权限,而是给角色赋予了对它需要调用的所有存储过程的执行权限。

除了我的存储过程之一,该过程可以建立一些动态SQL并调用sp_executesql之外,其他方法都可以正常工作。

动态sql看起来像这样:

SET @SQL = N'
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'

EXEC sp_executesql @SQL

具有此角色的用户无法调用存储过程。它给出了以下错误,这是我所预期的:

对对象“ uvView1”,数据库“ Foobar”,模式“ dbo”的SELECT权限被拒绝。

有没有一种方法可以让我的用户成功执行此proc而不给动态SQL中的所有视图授予角色权限?


阅读 131

收藏
2021-05-05

共1个答案

一尘不染

是的。

向该过程中添加EXECUTE AS CALLER子句,然后对存储过程进行 签名 ,并向 签名
授予所需的权限。这是100%安全,可靠和防弹的。请参阅带有证书的签名过程

2021-05-05