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 )
}
Примечание
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
database_name (объект)
Название базы данных, которая содержит изменяемую очередь. Если аргумент database_name не указан, по умолчанию используется текущая база данных.
schema_name (объект)
Имя схемы, которой принадлежит новая очередь. Если аргумент schema_name не указан, по умолчанию используется схема по умолчанию текущего пользователя.
queue_name
Имя изменяемой очереди.
STATUS (очередь)
Указывает, доступна очередь (ON) или нет (OFF). Когда очередь недоступна, нельзя ни добавлять в нее сообщения, ни удалять их из нее.
RETENTION
Указывает параметр хранения для очереди. Если указано RETENTION = ON, все сообщения, посылаемые или отправляемые во время диалогов, которые используют данную очередь, хранятся в очереди до окончания этих диалогов. Это позволяет сохранять сообщения для целей ревизии или для выполнения компенсирующих транзакций, если возникают ошибки
Примечание
Установка RETENTION = ON может уменьшить производительность. Эта установка должна использоваться только тогда, когда необходимо достичь соглашения уровня службы для приложения.
ACTIVATION
Указывает сведения о хранимой процедуре, которая активизируется для обработки сообщений, которые поступают в данную очередь.
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 пользователя.
OWNER
Указывает, что хранимая процедура выполняется в контексте владельца очереди.
DROP
Удаляет все сведения об активации, ассоциированные с очередью.
POISON_MESSAGE_HANDLING
Указывает, включена ли обработка сообщений о сбое. Значение по умолчанию — ON.
Очередь, в которой параметру обработки сообщений о сбое задано значение OFF, не будет отключена после пяти последовательных откатов транзакций. Это позволяет приложению определить пользовательскую систему обработки опасных сообщений.
Remarks
Если очередь с указанной хранимой процедурой активации содержит сообщения, которые изменяют состояние активации с 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.
Примеры
A. Как сделать очередь недоступной
В этом примере очередь ExpenseQueue
делается недоступной для приема сообщений.
ALTER QUEUE ExpenseQueue WITH STATUS = OFF ;
Б. Изменение хранимой процедуры активации
Следующий пример изменяет хранимую процедуру, которую запускает очередь. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию ALTER QUEUE
.
ALTER QUEUE ExpenseQueue
WITH ACTIVATION (
PROCEDURE_NAME = new_stored_proc,
EXECUTE AS SELF) ;
В. Изменение числа агентов чтения очереди
Следующий пример устанавливает максимальное число экземпляров хранимых процедур, запускаемых компонентом Компонент Service Broker для этой очереди, равное 7
.
ALTER QUEUE ExpenseQueue WITH ACTIVATION (MAX_QUEUE_READERS = 7) ;
Г. Изменение хранимой процедуры активации и учетной записи EXECUTE AS
Следующий пример изменяет хранимую процедуру, которую запускает компонент Компонент Service Broker. Хранимая процедура выполняется в контексте пользователя SecurityAccount
.
ALTER QUEUE ExpenseQueue
WITH ACTIVATION (
PROCEDURE_NAME = AdventureWorks2012.dbo.new_stored_proc ,
EXECUTE AS 'SecurityAccount') ;
Д. Настройка очереди на хранение сообщений
Следующий пример настраивает очередь на хранение сообщений. Очередь хранит все сообщения, отправленные службам или службами, которые используют эту очередь, до тех пор, пока не завершится диалог, который содержит сообщения.
ALTER QUEUE ExpenseQueue WITH RETENTION = ON ;
Е. Удаление активации из очереди
Следующий пример удаляет все сведения активации из очереди.
ALTER QUEUE ExpenseQueue WITH ACTIVATION (DROP) ;
Ж. Перестроение индексов очереди
Область применения: SQL Server 2016 (13.x); и более поздних версий.
В следующем примере производится перестроение индексов очереди
ALTER QUEUE ExpenseQueue REBUILD WITH (MAXDOP = 2)
З. Реорганизация индексов очереди
Область применения: 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)