Sql-Server
在儲存過程中選擇權限?
我已授予使用者執行使用動態 SQL 的儲存過程的權限。但是當他試圖執行它時,他得到了錯誤:
對象 ’ 的 SELECT 權限被拒絕
$$ table name $$’,數據庫’$$ database name $$’,模式’dbo’。
使用者是否需要被授予儲存過程使用的任何表的權限?那對我來說真的沒有任何意義。
好的,根據上述評論和我的懷疑 - 似乎您正在嘗試在儲存過程中執行動態 SQL。
您需要記住的是,當您執行此操作時,它不會在儲存過程的上下文中執行 - 它會在新會話中執行。正因為如此,在儲存過程中呼叫語句這一事實尚無定論,您需要對動態 SQL 正在使用的對象授予顯式權限。
如果您不想這樣做,我會重構您的儲存過程以不使用動態 SQL。
Microsoft 的以下連結應該可以幫助您解決問題:
PRB:儲存過程中動態 SQL 語句的安全上下文(Wayback Machine 存檔)
出現這種行為是因為動態執行查詢(sp_executesql 或 EXECUTE)在與主記憶體儲過程不同的上下文中執行;它在執行儲存過程的使用者的安全上下文中執行,而不是在儲存過程所有者的安全上下文中執行。
這也在(更新的)Microsoft Docs 文章中進行了討論:
在過程程式碼中執行動態創建的 SQL 語句會破壞所有權鏈,導致 SQL Server 針對動態 SQL 訪問的對象檢查呼叫者的權限。