SHOWPLAN 權限與 Transact-SQL 批次

Transact-SQL 批次是由一或多個陳述式組成。本主題描述當不同執行程序表 SET 陳述式選項搭配 Transact-SQL 批次一起使用時,SQL Server 如何檢查這些選項的 SHOWPLAN 權限。

安全性注意事項安全性注意事項

具有 SHOWPLAN、ALTER TRACE 或 VIEW SERVER STATE 權限的使用者可以檢視執行程序表輸出中所擷取的查詢。這些查詢可能會包含類似密碼的敏感資訊。因此,我們建議您只能將這些權限授與給有權檢視敏感資訊的使用者,例如 db_owner 固定資料庫角色的成員或是 sysadmin 固定伺服器角色的成員。我們也建議您只將執行程序表檔案或是包含與執行程序表相關之事件的追蹤檔案儲存到使用 NTFS 檔案系統的位置,並建議您將存取權限制為有權檢視敏感資訊的使用者。

包含 USE 或 SET 陳述式的批次

供任一個執行程序表 SET 選項 (SHOWPLAN_TEXT、SHOWPLAN_ALL、SHOWPLAN_XML、STATISTICS PROFILE 或 STATISTICS XML) 使用的 USE 或 SET 陳述式上,都不會執行 SHOWPLAN 權限檢查。除了為這些 Showplan SET 選項而執行的 USE database_name 陳述式之外,產生估計執行計畫輸出的 SHOWPLAN_TEXT、SHOWPLAN_ALL 與 SHOWPLAN_XML 都不會執行批次內的 Transact-SQL 陳述式。

SHOWPLAN 權限檢查範例

內容資料庫是使用 USE database_name 陳述式在批次內設定。檢查包含類似資料表或檢視等物件的資料庫 (這些物件會在 Transact-SQL 陳述式中參考),看看是否有 SHOWPLAN 權限。不過,除非 Transact-SQL 陳述式參考到內容資料庫的物件,否則不會檢查內容資料庫的 SHOWPLAN 權限。

如果批次包含 USE database_name 陳述式,而內容資料庫有所變更。在這種情況下,當批次中出現特定陳述式時,就不會檢查作用中內容資料庫的 SHOWPLAN 權限。

例如,以下批次中的兩個 SELECT 陳述式,都會檢查 AdventureWorks2008R2 資料庫上的 SHOWPLAN 權限。USE 陳述式中所參考的 master 或 tempdb 資料庫上則不會檢查 SHOWPLAN 權限:

SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks2008R2.Person.Address
USE master
SELECT * FROM AdventureWorks2008R2.Person.Address
GO

動態 SQL 的 SHOWPLAN 權限檢查

  • 對於 EXEC (command_string) 或 EXEC (character_string) 形式的動態 SQL 陳述式,包括內嵌字串在內的陳述式不會執行 SHOWPLAN 權限檢查。

  • 對於執行表單 EXEC dbo.my_stored_procedure 預存程序的動態 SQL 陳述式,EXEC 陳述式本身不會檢查 SHOWPLAN 權限。不過,因為整個預存程序主體產生一個 Showplan,所以預存程序內參考到包含物件資料庫的陳述式,會檢查 SHOWPLAN 權限。

以下範例顯示動態 SQL 陳述如何檢查 SHOWPLAN 權限。如果是 SELECT 陳述式,則會檢查 AdventureWorks2008R2 資料庫的 SHOWPLAN 權限。EXEC 陳述式本身、tempdb 資料庫或 master 資料庫上不會執行任何 SHOWPLAN 權限檢查:

SET SHOWPLAN_XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');

在以下範例中,使用了 SET STATISTICS XML,如果批次是傳送到 master 資料庫,SET 陳述式就不會檢查 SHOWPLAN 權限。USE tempdb 陳述式上不會檢查 SHOWPLAN 權限。不過,因為 USE 陳述式會檢查 CONNECT 權限,所以該使用者必須已存在於 tempdb 資料庫,而且擁有 tempdb 資料庫的 CONNECT 權限。因為 EXEC 陳述式未產生 Showplan,所以該陳述式不會檢查 SHOWPLAN 權限。USE master 陳述式上不會檢查 SHOWPLAN 權限。不過,SELECT 陳述式會檢查 AdventureWorks2008R2 資料庫的 SHOWPLAN 權限。

SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');

[!附註]

參考舊版 SQL Server 的查詢不會檢查 SHOWPLAN 權限。不過,在 SQL Server 2005 及之後的版本上執行的部分這類查詢會檢查 SHOWPLAN 權限。

包含錯誤的批次

如果其中一個 Showplan SET 陳述式選項與 Transact-SQL 批次一起使用,而該批次不是處理陳述式執行錯誤就是處理權限檢查錯誤,那麼會根據使用的 SET 選項模式判定內容資料庫,如下所示:

  • SHOWPLAN_TEXT、SHOWPLAN_ALL 與 SHOWPLAN_XML

    批次執行開始前已在作用中的內容資料庫,仍會處於作用中。如果發生任何陳述式執行或權限檢查錯誤,整個批次就不會產生 Showplan 輸出。所有權限檢查與陳述式必須都順利執行,否則就不會產生 Showplan 輸出。

  • STATISTICS PROFILE 與 STATISTICS XML

    順利執行上一個陳述式時已在作用中的內容資料庫,仍會處於作用中。可順利執行陳述式以及權限檢查成功的批次內的每個陳述式,都會產生 Showplan 輸出。可順利執行和權限檢查成功的批次內的每個陳述式,都會產生 Showplan 輸出。

請參閱

概念