2010-09-28 92 views
7

我有一個數據庫,其中所有訪問都由存儲過程控制。 DBA希望避免給用戶直接讀/寫訪問基礎表,我可以理解。因此,所有更新和選擇數據都是通過存儲過程完成的。基本上他創建了一個角色,對數據庫中的所有存儲過程具有EXECUTE權限,併爲用戶提供角色。使用「執行sp_Executesql」時的權限

問題是存儲過程之一動態構建SQl查詢並通過「執行sp_Executesql」執行它。沒有深入細節,查詢是動態構建的,因爲它根據許多用戶輸入參數而顯着變化。有問題的存儲過程只是一個SELECT sql語句,但是我發現只給予存儲過程EXECUTE權限是不夠的。存儲過程中引用的使用「Execute sp_Executesql」的基礎表需要被賦予「datareader」訪問權限,否則存儲過程將失敗。

有關如何解決此問題的任何想法?我真的想限制對錶格的訪問,但僅限於存儲過程,但我需要找到一種解決使用「Execute sp_Executesq」l的存儲過程的方法。謝謝。

+0

您可能會得到更好的avdice serverfault。我的建議 - 與dba交談並解釋情況。與他們合作以獲得正確的權限。 – 2010-09-28 19:58:16

回答

-3

真正的問題是,sp_Executesql在主數據庫中,而不一定是您工作的數據庫。您的DBA必須爲調用過程執行sp_Executesql權限。任何有權調用該過程的人都可以運行sp_Executesql。

+1

-1 sp_Executesql已公開執行。 「需要加入公共角色。」 http://msdn.microsoft.com/en-us/library/ms188001.aspx當您使用sp_executesql時,真正的問題是所有權鏈斷裂請參閱http://stackoverflow.com/questions/3815411 – gbn 2010-09-28 20:13:18

+1

如果您已經硬化數據庫鎖定公共角色,那麼@ MAW74656是正確的;例如,您創建了一個自定義角色來替換公共角色,並從公共角色中刪除所有權限。是的,這違背了文檔化的要求,但像AppDetective這樣的數據庫強化掃描系統(通過SQL Server STIG)將公共角色及其默認開放訪問作爲主要風險。 – Draghon 2016-01-05 17:33:43

+0

...此外,引用相同的MSDN文章,「運行時間編譯的Transact-SQL語句可以使應用程序遭受惡意攻擊。」這比「要求參與公共角色」聲明更顯着。 – Draghon 2016-01-08 20:10:34

12

在包裝PROC可以使用EXECUTE AS OWNEREXECUTE AS SomeuserWithNoLogin

這將改變登錄上下文的存儲的過程,它包括sp_executesql的的持續時間。

  • 如果您使用OWNER,它將起作用,因爲您已經在使用所有權鏈接。
  • 如果您的DBA(好男人!)不希望您以dbo身份運行,那麼請設置一個擁有完整閱讀但無權限的用戶。 EXECUTE AS <user>需要一個條目是sys.database_principals

像這樣:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN 
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin' 

欲瞭解更多信息,請參閱EXECUTE AS Clause on MSDNCREATE PROCEDURE