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


ALTER QUEUE (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в 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.

Примеры

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 = AdventureWorks2008R2.dbo.new_stored_proc ,
        EXECUTE AS 'SecurityAccount') ;

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

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

ALTER QUEUE ExpenseQueue WITH RETENTION = ON ;

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

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

ALTER QUEUE ExpenseQueue WITH ACTIVATION (DROP) ;