ALTER QUEUE (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Значок ссылки на раздел Cинтаксические обозначения в 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 }
          ) [ , ]]
         [ POISON_MESSAGE_HANDLING (
          STATUS = { ON | OFF } )
         ] 
  [ ; ]

<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, то очередь запускает хранимую процедуру, указанную параметром PROCEDURE_NAME, если количество выполняемых в настоящий момент хранимых процедур меньше, чем значение MAX_QUEUE_READERS, и если сообщения прибывают в очередь быстрее, чем хранимые процедуры получают сообщения. Если параметр STATUS = OFF, очередь не активирует хранимую процедуру.

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

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

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

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

  • MAX_QUEUE_READERS =max_reader
    Указывает максимальное число экземпляров хранимой процедуры активации, которые очередь одновременно может запустить. Значение аргумента max_readers должно быть из интервала от 0 до 32 767.

  • 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, не будет отключена после пяти последовательных откатов транзакций. Это позволяет приложению определить пользовательскую систему обработки опасных сообщений.

Замечания

Если очередь с указанной хранимой процедурой активации содержит сообщения, которые изменяют состояние активации с 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 ;

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

Следующий пример изменяет хранимую процедуру, которую запускает очередь. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию 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) ;

См. также

Справочник

CREATE QUEUE (Transact-SQL)

DROP QUEUE (Transact-SQL)

EVENTDATA (Transact-SQL)