我有一个具有应用程序角色的数据库。角色成员都属于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中的所有视图授予角色权限?
是的。
向该过程中添加EXECUTE AS CALLER子句,然后对存储过程进行 签名 ,并向 签名 授予所需的权限。这是100%安全,可靠和防弹的。请参阅带有证书的签名过程。