2015-11-05 109 views
0

我有一个存储过程,我们在这里将其称为Test带有Execute的SQL Server运行脚本导致权限错误

为了简单起见我修改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'. 

什么不同吗?

+1

应该是'Select * from [table A]' – wiretext

+0

在这种情况下这真的很重要吗? –

+0

我把括号,相同的权限错误。 –

回答

4

动态SQL具有此限制/限制。在存储过程中使用动态sql时,即使调用用户对存储过程具有权限,用户也需要在动态sql内部调用的表/对象上拥有权限。

你有两个选择

  1. 完全不使用动态SQL。
  2. 为动态sql内部使用的表提供调用用户权限。
+0

ahhh,有趣的,+1 –

+0

如果你选择选项2,给他们他们需要的最小权限。所以如果你只是从表中选择,只给予选择权限而不写或删除权限。 – HLGEM

+0

没有回应我想听到,因为我的SP会复杂得多!但事实是事实! –

0

当用户没有足够的权限 来访问数据库中的表时,会出现此错误。请授予 用户的特权,以获得您想要的。

Grant权限为Select statement(or any other if you want)

+0

问题是如果权限是问题,那么为什么非动态SQL工作和动态不起作用。权限方面有什么不同? –

+0

请参阅@ m.ali的回答,很好地解释。 –