共用方式為


SHOWPLAN 權限與 Transact-SQL 批次

Transact-SQL 批次是由一或多個陳述式組成。此主題描述當陳述式選項與 Transact-SQL 批次一起使用時,SQL Server 2005 如何檢查不同 Showplan SET 陳述式選項的 SHOWPLAN 權限。

包含 USE 或 SET 陳述式的批次

供任一個 Showplan 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 陳述式,都會檢查 AdventureWorks 資料庫上的 SHOWPLAN 權限。USE 陳述式中參考到 mastertempdb 資料庫上的 SHOWPLAN 權限則不會檢查。

SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks.Person.Address
USE master
SELECT * FROM AdventureWorks.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 陳述式,會檢查 AdventureWorks 資料庫的 SHOWPLAN 權限。EXEC 陳述式本身、tempdb 資料庫或 master 資料庫上,不會執行 SHOWPLAN 權限檢查。

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

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

SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks.Person.Address');
ms178086.note(zh-tw,SQL.90).gif附註:
參考舊版 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 輸出。

請參閱

概念

顯示計劃安全性

說明及資訊

取得 SQL Server 2005 協助