更改队列的属性。
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 标识符。有关激活的详细信息,请参阅Understanding When Activation Occurs。
-
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 才会启动该存储过程的新实例。有关激活过程的更详细说明,请参阅Understanding When Activation Occurs。
队列不可用时,Service Broker 将在数据库的传输队列中保存使用该队列的服务的消息。sys.transmission_queue 目录视图提供传输队列的视图。
如果 RECEIVE 语句或 GET CONVERSATION GROUP 语句指定了不可用的队列,则该语句将失败,并出现 Transact-SQL 错误。
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) ;