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


CREATE QUEUE (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

CREATE 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 } 
            ) [ , ] ]
     [ POISON_MESSAGE_HANDLING (
       [ STATUS = { ON | OFF } )
    ]
     [ ON { filegroup | [ DEFAULT ] } ]
[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ]
        queue_name
} 

<procedure> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ]
        stored_procedure_name
} 

Аргументы

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

  • schema_name (объект)
    Имя схемы, которой принадлежит новая очередь. Значения по умолчанию для схемы по умолчанию текущего пользователя, выполняющего инструкцию. Если инструкция CREATE QUEUE выполняется членом предопределенной роли сервера sysadmin или членом предопределенных ролей базы данных db_dbowner или db_ddladmin в базе данных, указанной аргументом database_name, то аргумент schema_name может определять схему, не связанную с именем входа текущего соединения. Иначе указанная схема schema_name должна являться схемой по умолчанию для пользователя, выполняющего инструкцию.

  • queue_name
    Имя создаваемой очереди. Это имя должно соответствовать правилам для идентификаторов SQL Server.

  • STATUS (очередь)
    Указывает, доступна очередь (ON) или нет (OFF). Когда очередь недоступна, нельзя ни добавлять в нее сообщения, ни удалять их из нее. Можно создать очередь в состоянии недоступности, чтобы сообщения не поступали в очередь до тех пор, пока очередь не будет сделана доступной с помощью инструкции ALTER QUEUE. Если это предложение опущено, значение по умолчанию равно ON, и очередь доступна.

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

    ПримечаниеПримечание

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

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

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

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

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

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

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

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

  • EXECUTE AS
    Определяет учетную запись пользователя базы данных SQL Server, под которой выполняется хранимая процедура активации. SQL Server должен иметь возможность проверить разрешения для этого пользователя в момент, когда очередь активирует хранимую процедуру. Для пользователя домена сервер должен быть подключен к домену в момент активации процедуры, иначе произойдет ошибка активации. Для пользователя SQL Server сервер всегда в состоянии проверить разрешения.

  • SELF
    Указывает, что хранимая процедура выполняется как текущий пользователь. (участника базы данных, выполняющего эту инструкцию CREATE QUEUE).

  • 'user_name'
    Имя пользователя, от имени которого выполняется хранимая процедура. Аргумент user_name должен быть именем допустимого пользователя SQL Server, указанным в виде идентификатора SQL Server. Текущий пользователь должен иметь разрешение IMPERSONATE для указанного значения user_name.

  • OWNER
    Указывает, что хранимая процедура выполняется в контексте владельца очереди.

  • POISON_MESSAGE_HANDLING
    Определяет, включена ли обработка сообщений о сбое для очереди. Значение по умолчанию — ON.

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

  • ON filegroup | [ DEFAULT ]
    Указывает файловую группу SQL Server, на основании которой должна создаваться эта очередь. Можно использовать аргумент filegroup для идентификации файловой группы или идентификатор DEFAULT, чтобы использовать файловую группу по умолчанию для базы данных компонента Service Broker. В контексте данного предложения слово DEFAULT не является ключевым словом и должно быть отделено как идентификатор. Если файловая группа не задана, то очередь использует файловую группу по умолчанию для базы данных.

Замечания

Очередь может быть использована как целевой объект инструкции SELECT. Однако содержимое очереди может быть изменено только с помощью инструкций, которые выполняются в таких диалогах компонента Service Broker, как SEND, RECEIVE и END CONVERSATION. Очередь не может быть целевым объектом инструкций INSERT, UPDATE, DELETE и TRUNCATE.

Очередь не может быть временным объектом. Поэтому имена очередей, начинающиеся с символа #, недопустимы.

Создание очереди в неактивном состоянии позволяет службе получить ее структуру, прежде чем сообщения начнут поступать в очередь.

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

Разрешения для хранимых процедур активации проверяются во время их активации компонентом Service Broker, а не при создании очереди. Инструкция CREATE QUEUE не проверяет, имеет ли пользователь, указанный в предложении EXECUTE AS, разрешения на выполнение хранимой процедуры, указанной в предложении PROCEDURE NAME.

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

Очередь относится к объектам схемы. Очереди появляются в представлении каталога sys.objects.

Следующая таблица содержит столбцы в очереди.

Имя столбца

Тип данных

Описание

status

tinyint

Состояние сообщения. Инструкция RECEIVE возвращает сообщения со значением состояния, равным 1. Если хранение сообщений включено, то значение состояния устанавливается в 0. Если хранение сообщений выключено, то сообщение удаляется из очереди. Сообщения в очереди могут иметь одно из следующих состояний:

0=Сохраненное полученное сообщение

1=Готовность к получению

2=Еще не завершено

3=Сохраненное отправленное сообщение

priority

tinyint

Уровень приоритета, назначенный для этого сообщения.

queuing_order

bigint

Порядковый номер сообщения в очереди.

conversation_group_id

uniqueidentifier

Идентификатор группы сообщений, которой принадлежит данное сообщение.

conversation_handle

uniqueidentifier

Дескриптор диалога, частью которого является данное сообщение.

message_sequence_number

bigint

Порядковый номер сообщения в диалоге.

service_name

nvarchar(512)

Имя службы, к которой относится диалог.

service_id

int

Идентификатор объекта службы SQL Server, к которой относится диалог.

service_contract_name

nvarchar(256)

Имя контракта, которому следует диалог.

service_contract_id

int

Идентификатор объекта контракта SQL Server, которому следует диалог.

message_type_name

nvarchar(256)

Имя типа сообщения, который описывает сообщение.

message_type_id

int

Идентификатор объекта типа сообщения SQL Server, который описывает сообщение.

validation

nchar(2)

Проверка, используемая для сообщения:

E = пустая

N = нет

X = XML

message_body

varbinary(MAX)

Содержимое сообщения.

message_id

uniqueidentifier

Уникальный идентификатор для сообщения.

Разрешения

Разрешение на создание службы имеют члены предопределенных ролей базы данных db_ddladmin и db_owner и предопределенной роли сервера sysadmin.

Разрешение REFERENCES на очередь по умолчанию имеет владелец очереди, члены предопределенных ролей db_admin или db_owner базы данных, а также члены предопределенной роли сервера sysadmin.

Разрешение RECEIVE на очередь по умолчанию имеет владелец очереди, члены предопределенной роли базы данных db_owner и члены предопределенной роли сервера sysadmin.

Примеры

А. Создание очереди без параметров

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

CREATE QUEUE ExpenseQueue ;

Б. Создание очереди, недоступной для приема сообщений

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

CREATE QUEUE ExpenseQueue WITH STATUS=OFF ;

В. Создание очереди с указанием внутренних сведений об активации

В следующем примере создается очередь, готовая к приему сообщений. При поступлении сообщения в очередь запускается хранимая процедура expense_procedure. Хранимая процедура выполняется в контексте пользователя ExpenseUser. Очередь запускает не более 5 экземпляров хранимой процедуры.

CREATE QUEUE ExpenseQueue
    WITH STATUS=ON,
    ACTIVATION (
        PROCEDURE_NAME = expense_procedure,
        MAX_QUEUE_READERS = 5,
        EXECUTE AS 'ExpenseUser' ) ;

Г. Создание очереди на основании указанной файловой группы

В следующем примере создается очередь на основании файловой группы ExpenseWorkFileGroup.

CREATE QUEUE ExpenseQueue
    ON ExpenseWorkFileGroup ;

Д. Создание очереди с несколькими параметрами

В следующем примере создается очередь на основании файловой группы DEFAULT. Очередь недоступна для приема сообщений. Сообщения хранятся в очереди до завершения диалога, которому они принадлежат. При переключении очереди в состояние готовности к приему сообщений с помощью инструкции ALTER QUEUE в очереди активируется хранимая процедура 2008R2.dbo.expense_procedure для обработки сообщений. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию CREATE QUEUE. Очередь запускает не более 10 экземпляров хранимой процедуры.

CREATE QUEUE ExpenseQueue
    WITH STATUS = OFF,
      RETENTION = ON,
      ACTIVATION (
          PROCEDURE_NAME = AdventureWorks2008R2.dbo.expense_procedure,
          MAX_QUEUE_READERS = 10,
          EXECUTE AS SELF )
    ON [DEFAULT] ;