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


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 } 
            ) ]
    ]
     [ 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.

    ms190495.note(ru-ru,SQL.90).gifПримечание.
    Установка RETENTION = ON может уменьшить производительность. Ее следует использовать только в том случае, если это требуется для приложения. Дополнительные сведения см. в разделе Message Retention.
  • ACTIVATION
    Указывает сведения о хранимых процедурах, которые нужно активировать для обработки сообщений в этой очереди.
  • STATUS (Activation)
    Указывает, активирует ли компонент Service Broker хранимые процедуры. Если параметр STATUS = ON, то очередь запускает хранимую процедуру, указанную параметром PROCEDURE_NAME, если количество выполняемых в настоящий момент хранимых процедур меньше, чем значение MAX_QUEUE_READERS, и если сообщения прибывают в очередь быстрее, чем хранимые процедуры получают сообщения. Если параметр STATUS = OFF, то очередь не активирует хранимую процедуру. Если это предложение не указано, значение по умолчанию равно ON.
  • PROCEDURE_NAME = <procedure>
    Указывает имя хранимой процедуры, которая должна быть активирована для обработки сообщений в данной очереди. Это значение должно являться идентификатором SQL Server. Дополнительные сведения см. в разделе Understanding When Activation Occurs.
  • 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
    Указывает, что хранимая процедура выполняется в контексте владельца очереди.
  • 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=Полученное сообщение

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

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

Разрешения

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

Разрешение REFERENCES на очередь по умолчанию имеет владелец очереди, члены фиксированных ролей ddl_ddladmin или 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 в очереди активируется хранимая процедура AdventureWorks.dbo.expense_procedure для обработки сообщений. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию CREATE QUEUE. Очередь запускает не более 10 экземпляров хранимой процедуры.

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

См. также

Справочник

ALTER QUEUE (Transact-SQL)
CREATE SERVICE (Transact-SQL)
DROP QUEUE (Transact-SQL)
RECEIVE (Transact-SQL)
EVENTDATA (Transact-SQL)

Другие ресурсы

Очереди
Учебники по компоненту Service Broker
Создание приложений, работающих с компонентом Service Broker
Service Broker Activation
Internal Activation Context

Справка и поддержка

Получение помощи по SQL Server 2005