Поделиться через


ALTER QUEUE (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

Изменяет свойства очереди.

Соглашения о синтаксисе Transact-SQL

Синтаксис

ALTER QUEUE <object>   
   queue_settings  
   | queue_action  
[ ; ]  
  
<object> : :=  
{ database_name.schema_name.queue_name | schema_name.queue_name | queue_name }
  
<queue_settings> : :=  
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 }  
          ) [ , ]]  
         [ POISON_MESSAGE_HANDLING (  
          STATUS = { ON | OFF } )  
         ]   
  
<queue_action> : :=  
   REBUILD [ WITH <query_rebuild_options> ]  
   | REORGANIZE [ WITH (LOB_COMPACTION = { ON | OFF } ) ]  
   | MOVE TO { file_group | "default" }  
  
<procedure> : :=  
{ database_name.schema_name.stored_procedure_name | schema_name.stored_procedure_name | stored_procedure_name }
  
<queue_rebuild_options> : :=  
{  
   ( MAXDOP = max_degree_of_parallelism )  
}  

Аргументы

database_name (объект)
Название базы данных, которая содержит изменяемую очередь. Если аргумент database_name не указан, по умолчанию используется текущая база данных.

schema_name (объект)
Имя схемы, которой принадлежит новая очередь. Если аргумент schema_name не указан, по умолчанию используется схема по умолчанию текущего пользователя.

queue_name
Имя изменяемой очереди.

STATUS (очередь)
Указывает, доступна очередь (ON) или нет (OFF). Когда очередь недоступна, нельзя ни добавлять в нее сообщения, ни удалять их из нее.

RETENTION
Указывает параметр хранения для очереди. Если указано RETENTION = ON, все сообщения, посылаемые или отправляемые во время диалогов, которые используют данную очередь, хранятся в очереди до окончания этих диалогов. Это позволяет сохранять сообщения для целей ревизии или для выполнения компенсирующих транзакций, если возникают ошибки

Примечание.

Установка RETENTION = ON может уменьшить производительность. Эта установка должна использоваться только тогда, когда необходимо достичь соглашения уровня службы для приложения.

АКТИВАЦИЯ
Указывает сведения о хранимой процедуре, которая активизируется для обработки сообщений, которые поступают в данную очередь.

STATUS (активация)
Указывает, активирует ли очередь хранимую процедуру. Если параметр STATUS = ON, то очередь запускает хранимую процедуру, указанную параметром PROCEDURE_NAME, если количество выполняемых в настоящий момент хранимых процедур меньше, чем значение MAX_QUEUE_READERS, и если сообщения прибывают в очередь быстрее, чем хранимые процедуры получают сообщения. Если параметр STATUS = OFF, очередь не активирует хранимую процедуру.

REBUILD [ WITH <queue_rebuild_options> ]
Область применения: SQL Server 2016 (13.x) и более поздних версий.

Перестраивает все индексы внутренней таблицы очереди. Используйте эту возможность в случае проблем с фрагментацией из-за высокой нагрузки. MAXDOP — это единственный поддерживаемый параметр перестройки очереди. Операция REBUILD всегда выполняется в автономном режиме.

REORGANIZE [ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
Область применения: SQL Server 2016 (13.x) и более поздних версий.

Реорганизует все индексы внутренней таблицы очереди.
В отличие от операции REORGANIZE в пользовательских таблицах, операция REORGANIZE в очереди всегда выполняется в автономном режиме, потому что в очередях явно отключена блокировка на уровне страницы.

Совет

Как правило, реорганизация индекса становится нужной, когда фрагментация составляет от 5 % до 30 %. Если фрагментация больше 30 %, необходима перестройка индекса. Однако эти числа приводятся только в виде общих рекомендаций в качестве отправной точки для вашей среды. Чтобы определить степень фрагментации индекса, используйте sys.dm_db_index_physical_stats (Transact-SQL) — см. пример Ж в этой статье.

MOVE TO { file_group | "default" }
Область применения: SQL Server 2016 (13.x) и более поздних версий.

Перемещает внутреннюю таблицу очереди (с индексами) в указанную пользователем файловую группу. Новая файловая группа не должна быть доступной только для чтения.

PROCEDURE_NAME = <procedure>
Указывает имя активируемой хранимой процедуры, если очередь содержит сообщения, которые нужно обработать. Это значение должно быть идентификатором SQL Server.

database_name (процедура)
Имя базы данных, которая содержит хранимую процедуру.

schema_name (процедура)
Имя схемы, которой принадлежит хранимая процедура.

stored_procedure_name
Имя хранимой процедуры.

MAX_QUEUE_READERS =max_reader
Указывает максимальное число экземпляров хранимой процедуры активации, которые очередь одновременно может запустить. Значение аргумента 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. Текущий пользователь должен иметь разрешение IMPERSONATE на указанного аргументом user_name пользователя.

ВЛАДЕЛЕЦ
Указывает, что хранимая процедура выполняется в контексте владельца очереди.

DROP
Удаляет все сведения об активации, ассоциированные с очередью.

POISON_MESSAGE_HANDLING
Указывает, включена ли обработка сообщений о сбое. Значение по умолчанию — ON.

Очередь, в которой параметру обработки сообщений о сбое задано значение OFF, не будет отключена после пяти последовательных откатов транзакций. Это позволяет приложению определить пользовательскую систему обработки опасных сообщений.

Замечания

Если очередь с указанной хранимой процедурой активации содержит сообщения, которые изменяют состояние активации с OFF на ON, тут же активирует хранимую процедуру активации. Изменение состояния активации с ON на OFF прекращает активацию экземпляров хранимой процедуры брокером, но не останавливает экземпляры хранимой процедуры, которые уже запущены.

Изменение очереди для добавления хранимой процедуры активации не изменяет состояния активации очереди. Изменение хранимой процедуры активации для очереди не влияет на экземпляры хранимых процедур активации, которые уже запущены.

Service Broker проверяет максимальное количество средств чтения очередей для очереди в рамках процесса активации. Таким образом, изменение очереди для увеличения максимального количества средств чтения очередей позволяет Service Broker немедленно запускать дополнительные экземпляры хранимой процедуры активации. Изменение очереди с целью уменьшения максимального числа агентов чтения очереди не влияет на экземпляры хранимой процедуры активации, которые уже запущены. Однако Service Broker не запускает новый экземпляр хранимой процедуры до тех пор, пока число экземпляров хранимой процедуры активации не превышает настроенное максимальное число.

Если очередь недоступна, Компонент Service Broker содержит сообщения для служб, использующих очередь в очереди передачи для базы данных. Представление каталога sys.transmission_queue содержит представление очереди передачи.

Если инструкция RECEIVE или GET CONVERSATION GROUP указывает недоступную очередь, выполнение инструкции завершается ошибкой Transact-SQL.

Разрешения

По умолчанию разрешением на изменения значений очереди обладает владелец типа сообщений, члены предопределенной роли базы данных db_ddladmin или db_owner и члены предопределенной роли сервера sysadmin.

Примеры

А. Как сделать очередь недоступной

В этом примере очередь ExpenseQueue делается недоступной для приема сообщений.

ALTER QUEUE ExpenseQueue WITH STATUS = OFF ;  

B. Изменение хранимой процедуры активации

Следующий пример изменяет хранимую процедуру, которую запускает очередь. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию ALTER QUEUE.

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

В. Изменение числа агентов чтения очереди

В следующем примере устанавливается 7 максимальное количество экземпляров хранимых процедур, запускаемых для этой очереди.

ALTER QUEUE ExpenseQueue WITH ACTIVATION (MAX_QUEUE_READERS = 7) ;  

D. Изменение хранимой процедуры активации и учетной записи EXECUTE AS

В следующем примере изменяется хранимая процедура, которая запускается Service Broker. Хранимая процедура выполняется в контексте пользователя SecurityAccount.

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

Е. Настройка очереди на хранение сообщений

Следующий пример настраивает очередь на хранение сообщений. Очередь хранит все сообщения, отправленные службам или службами, которые используют эту очередь, до тех пор, пока не завершится диалог, который содержит сообщения.

ALTER QUEUE ExpenseQueue WITH RETENTION = ON ;  

F. Удаление активации из очереди

Следующий пример удаляет все сведения активации из очереди.

ALTER QUEUE ExpenseQueue WITH ACTIVATION (DROP) ;  

G. Перестроение индексов очереди

Область применения: SQL Server 2016 (13.x) и более поздних версий.

В следующем примере производится перестроение индексов очереди

ALTER QUEUE ExpenseQueue REBUILD WITH (MAXDOP = 2)   

H. Реорганизация индексов очереди

Область применения: SQL Server 2016 (13.x) и более поздних версий.

В следующем примере производится реорганизация индексов очереди

ALTER QUEUE ExpenseQueue REORGANIZE   

И. Перемещение внутренней таблицы очереди в другую файловую группу

Область применения: SQL Server 2016 (13.x) и более поздних версий.

ALTER QUEUE ExpenseQueue MOVE TO [NewFilegroup]   

См. также

CREATE QUEUE (Transact-SQL)
DROP QUEUE (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.dm_db_index_physical_stats (Transact-SQL)