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(对象)
    新队列所属架构的名称。如果未提供 schema_name,则默认为当前用户的默认架构。

  • queue_name
    要更改的队列的名称。

  • STATUS(队列)
    指定队列是可用 (ON) 还是不可用 (OFF)。如果队列不可用,则不能向队列添加消息或从队列中删除消息。

  • RETENTION
    指定队列的保持期设置。如果 RETENTION = ON,则在会话中使用此队列发送或接收的所有消息都将保持在队列中,直到会话结束为止。这样便可保留消息以用于审核,或在发生错误时执行补偿事务。

    注意注意

    设置 RETENTION = ON 会降低性能。仅当需要符合应用程序的服务级别协议时,才应使用此设置。

  • ACTIVATION
    指定有关存储过程的信息,该存储过程可被激活以处理到达此队列的消息。

  • STATUS(激活)
    指定队列是否激活存储过程。当 STATUS = ON 时,如果当前运行的过程数小于 MAX_QUEUE_READERS,并且消息抵达队列的速度比存储过程接收消息的速度快,则队列启动用 PROCEDURE_NAME 指定的存储过程。当 STATUS = OFF 时,队列不激活存储过程。

  • PROCEDURE_NAME = <procedure>
    指定当队列包含要处理的消息时,要激活的存储过程的名称。此值必须是一个 SQL Server 标识符。有关激活的详细信息,请参阅了解发生激活的条件

  • database_name (过程)
    包含存储过程的数据库的名称。

  • schema_name (过程)
    拥有存储过程的架构的名称。

  • 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,则会阻止代理激活存储过程的实例,但不会停止正在运行的存储过程实例。

修改队列以添加激活存储过程时,不会更改该队列的激活状态。更改队列的激活存储过程时,也不会影响当前正在运行的激活存储过程实例。

激活过程中,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) ;