2015-11-05 105 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的回答,很好地解釋。 –