ALTER QUEUE (Transact-SQL)

變更佇列屬性。

主題連結圖示Transact-SQL 語法慣例

語法

ALTER QUEUE <object> WITH
   [ STATUS = { ON | OFF } [ , ] ]
   [ RETENTION = { ON | OFF } [ , ] ]
   [ ACTIVATION (
       { [ STATUS = { ON | OFF } [ , ] ] 
         [ PROCEDURE_NAME = <procedure> [ , ] ]
         [ MAX_QUEUE_READERS = max_readers [ , ] ]
         [ EXECUTE AS { SELF | 'user_name'  | OWNER } ]
       |  DROP }
          ) ] 
[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ]
        queue_name
} 

<procedure> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ]
        stored_procedure_name
}

引數

  • database_name(物件)
    這是要變更之佇列所在的資料庫名稱。若未提供 database_name,預設為目前的資料庫。

  • schema_name (object)
    這是新佇列所屬的結構描述名稱。若未提供 schema_name,預設為目前使用者的預設結構描述。

  • queue_name
    這是要變更的佇列名稱。

  • STATUS (Queue)
    指定佇列是可以使用 (ON) 或無法使用 (OFF)。當佇列無法使用時,不能將訊息加入佇列或從佇列中移除。

  • RETENTION
    指定佇列的保留設定。如果 RETENTION = ON,使用這個佇列的交談所傳送或接收的所有訊息都會保留在佇列中,直到交談結束為止。這個選項可讓您保留訊息來進行稽核,或在錯誤發生時用來執行補償交易。

    [!附註]

    設定 RETENTION = ON 會降低效能。只有在必須符合應用程式的服務等級合約時,才應該使用這項設定。

  • ACTIVATION
    指定為了處理到達這個佇列的訊息而啟動之預存程序的相關資訊。

  • STATUS (Activation)
    指定佇列是否啟動預存程序。當 STATUS = ON 時,如果目前執行的程序數目低於 MAX_QUEUE_READERS,且訊息到達佇列的速度比預存程序接收訊息快,佇列便會啟動 PROCEDURE_NAME 所指定的預存程序。當 STATUS = OFF 時,佇列不會啟動預存程序。

  • PROCEDURE_NAME = <procedure>
    指定在佇列包含要處理的訊息時,將啟動的預存程序名稱。這個值必須是 SQL Server 識別碼。如需有關啟動的詳細資訊,請參閱<了解啟動何時發生>。

  • database_name (procedure)
    這是包含預存程序的資料庫名稱。

  • schema_name (procedure)
    這是擁有預存程序的結構描述名稱。

  • stored_procedure_name
    這是預存程序的名稱。

  • MAX_QUEUE_READERS = max_readers
    指定佇列同時啟動的啟動預存程序的最大執行個體數目。max_readers 的值必須是在 0 和 32767 之間的數字。

  • EXECUTE AS
    指定用來執行啟動預存程序的 SQL Server 資料庫使用者帳戶。當佇列啟動預存程序時,SQL Server 必須能夠檢查這個使用者的權限。如果是 Windows 網域使用者,SQL Server 必須連接這個網域,且在程序啟動或啟動失敗時,必須能夠驗證指定使用者的權限。如果是 SQL Server 使用者,伺服器一律可以檢查權限。

  • SELF
    指定以目前使用者的身分來執行預存程序。(執行此 ALTER QUEUE 陳述式的資料庫主體)。

  • 'user_name'
    這是指定用來執行預存程序的使用者名稱。user_name 必須是指定為 SQL Server 識別碼的有效 SQL Server 使用者。目前的使用者必須擁有指定的 user_name 之 IMPERSONATE 權限。

  • OWNER
    指定以佇列擁有者的身分來執行預存程序。

  • DROP
    刪除與佇列相關聯的所有啟動資訊。

備註

當含有指定的啟動預存程序之佇列包含訊息時,將啟動狀態 OFF 改成 ON 會立即啟動這個啟動預存程序。將啟動狀態 ON 改成 OFF 會使 Broker 停止啟動預存程序的執行個體,但並不會停止目前在執行中的預存程序之執行個體。

變更佇列來加入啟動預存程序,並不會變更佇列的啟動狀態。變更佇列的啟動預存程序,並不會影響目前在執行中的啟動預存程序的執行個體。

在啟動過程中,Service Broker 會檢查佇列的最大佇列讀取器數目。因此,變更佇列來增加最大佇列讀取器數目,可讓 Service Broker 立即啟動更多啟動預存程序的執行個體。變更佇列來減少最大佇列讀取器數目,並不會影響目前在執行中啟動預存程序的執行個體。不過,在啟動預存程序的執行個體數目低於設定的最大數目之前,Service Broker 並不會啟動新的預存程序執行個體。如需啟動處理序的詳細描述,請參閱<了解啟動何時發生>。

當佇列無法使用時,Service Broker 會保存使用資料庫傳輸佇列中的佇列之服務的訊息。sys.transmission_queue 目錄檢視會提供傳輸佇列的檢視。

如果 RECEIVE 陳述式或 GET CONVERSATION GROUP 陳述式指定無法使用的佇列,陳述式會因 Transact-SQL 錯誤而失敗。

權限

變更佇列的權限預設為佇列的擁有者、db_ddladmindb_owner 固定資料庫角色的成員,以及系統管理員 (sysadmin) 固定伺服器角色的成員。

範例

A. 使佇列無法使用

下列範例使 ExpenseQueue 佇列無法接收訊息。

ALTER QUEUE ExpenseQueue WITH STATUS = OFF ;

B. 變更啟動預存程序

下列範例會變更佇列啟動的預存程序。這個預存程序以執行 ALTER QUEUE 陳述式的使用者身分來執行。

ALTER QUEUE ExpenseQueue
    WITH ACTIVATION (
        PROCEDURE_NAME = new_stored_proc,
        EXECUTE AS SELF) ;

C. 變更佇列讀取器的數目

下列範例會將 Service Broker 為了這個佇列而啟動的最大預存程序執行個體數目設為 7。

ALTER QUEUE ExpenseQueue WITH ACTIVATION (MAX_QUEUE_READERS = 7) ;

D. 變更啟動預存程序和 EXECUTE AS 帳戶

下列範例會變更 Service Broker 啟動的預存程序。這個預存程序以 SecurityAccount 使用者的身分來執行。

ALTER QUEUE ExpenseQueue
    WITH ACTIVATION (
        PROCEDURE_NAME = AdventureWorks.dbo.new_stored_proc ,
        EXECUTE AS 'SecurityAccount') ;

E. 設定佇列來保留訊息

下列範例會設定佇列來保留訊息。佇列會保留使用這個佇列的服務所傳送和接收的所有訊息,直到包含訊息的交談結束為止。

ALTER QUEUE ExpenseQueue WITH RETENTION = ON ;

F. 從佇列中移除啟動

下列範例會從佇列中移除所有啟動資訊。

ALTER QUEUE ExpenseQueue WITH ACTIVATION (DROP) ;