sql server 2005 T-SQL ALTER QUEUE (Transact-SQL)

来源:互联网 发布:oracle和mysql的转换 编辑:程序博客网 时间:2024/04/27 07:52

更改队列的属性。

主题链接图标 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 标识符。有关激活的详细信息,请参阅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 错误。

默认情况下,队列的所有者、ddl_admindb_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) ;
 
原创粉丝点击