Sql-Server

在儲存過程中選擇權限?

  • November 27, 2018

我已授予使用者執行使用動態 SQL 的儲存過程的權限。但是當他試圖執行它時,他得到了錯誤:

對象 ’ 的 SELECT 權限被拒絕

$$ table name $$’,數據庫’$$ database name $$’,模式’dbo’。

使用者是否需要被授予儲存過程使用的任何表的權限?那對我來說真的沒有任何意義。

好的,根據上述評論和我的懷疑 - 似乎您正在嘗試在儲存過程中執行動態 SQL。

您需要記住的是,當您執行此操作時,它不會在儲存過程的上下文中執行 - 它會在新會話中執行。正因為如此,在儲存過程中呼叫語句這一事實尚無定論,您需要對動態 SQL 正在使用的對象授予顯式權限。

如果您不想這樣做,我會重構您的儲存過程以不使用動態 SQL。

Microsoft 的以下連結應該可以幫助您解決問題:

PRB:儲存過程中動態 SQL 語句的安全上下文(Wayback Machine 存檔)

出現這種行為是因為動態執行查詢(sp_executesql 或 EXECUTE)在與主記憶體儲過程不同的上下文中執行;它在執行儲存過程的使用者的安全上下文中執行,而不是在儲存過程所有者的安全上下文中執行。

這也在(更新的)Microsoft Docs 文章中進行了討論:

在 SQL Server 中編寫安全的動態 SQL

在過程程式碼中執行動態創建的 SQL 語句會破壞所有權鏈,導致 SQL Server 針對動態 SQL 訪問的對象檢查呼叫者的權限。

引用自:https://dba.stackexchange.com/questions/24555