动态SQL有这个限制。在存储过程中使用动态sql时,即使调用用户对存储过程具有权限,该用户也需要对动态sql中被调用的表/对象具有权限。
我有一个存储过程,我们在这里称它为Test
。
为了简单起见,我将SP代码修改为:
Select * from table A
我可以毫无问题地运行此SP。
现在,如果我使用动态SQL
@SQL='Select * from table A'
EXECUTE (@SQL)
I get
The SELECT permission was denied on the object 'A', database 'MyDb', schema 'dbo'.
这里有什么不同?
你有两个选项
- 根本不要使用动态sql
- 赋予调用用户对动态sql中正在使用的表的权限
当用户没有足够的权限时会出现此错误访问数据库中的表。请将特权授予用户,以便获得您想要的内容。
授予Select statement(or any other if you want)
的权限。