CREATE QUEUE (Transact-SQL)
Область применения: SQL Server Управляемый экземпляр SQL Azure
Создает в базе данных новую очередь. Очереди служат для хранения сообщений. Когда сообщение поступает для службы, Компонент 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.queue_name | schema_name.queue_name | queue_name }
<procedure> ::=
{ database_name.schema_name.stored_procedure_name | schema_name.stored_procedure_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 может уменьшить производительность. Ее следует использовать только в том случае, если это требуется для приложения.
АКТИВАЦИЯ
Указывает сведения о хранимых процедурах, которые нужно активировать, чтобы начать обработку сообщений в этой очереди.
STATUS (активация)
Указывает, запускает ли компонент Service Broker хранимую процедуру. Если параметр STATUS = ON, то очередь запускает хранимую процедуру, указанную параметром PROCEDURE_NAME, если количество выполняемых в настоящий момент хранимых процедур меньше, чем значение MAX_QUEUE_READERS, и если сообщения прибывают в очередь быстрее, чем хранимые процедуры получают сообщения. Если параметр STATUS = OFF, то очередь не активирует хранимую процедуру. Если это предложение не указано, значение по умолчанию равно ON.
PROCEDURE_NAME = <procedure>
Указывает имя хранимой процедуры, которая должна быть активирована для обработки сообщений в данной очереди. Это значение должно быть идентификатором SQL Server.
database_name (процедура) — имя базы данных, которая содержит хранимую процедуру.
schema_name (процедура) — имя схемы, которая содержит хранимую процедуру.
procedure_name — имя хранимой процедуры.
MAX_QUEUE_READERS =max_readers
Определяет максимальное количество экземпляров хранимой процедуры активации, запускаемых очередью одновременно. Значение аргумента max_readers должно быть числом от 0 до 32 767.
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 | [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
.
Следующая таблица содержит столбцы в очереди.
Имя столбца | Тип данных | Description |
---|---|---|
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(128) | Имя службы, к которой относится диалог. |
service_id |
int | Идентификатор объекта SQL Server службы, в которую входит беседа. |
service_contract_name |
nvarchar(128) | Имя контракта, которому следует диалог. |
service_contract_id |
int | Идентификатор объекта SQL Server контракта, который следует беседе. |
message_type_name |
nvarchar(128) | Имя типа сообщения, который описывает сообщение. |
message_type_id |
int | Идентификатор объекта SQL Server типа сообщения, описывающего сообщение. |
validation |
nchar(2) | Проверка, используемая для сообщения:E =ПустаяN =NoneX =XML |
message_body |
varbinary(max) | Содержимое сообщения. |
message_enqueue_time |
datetime | Время постановки сообщения в очередь. |
Разрешения
Разрешение на создание службы имеют члены предопределенных ролей базы данных db_ddladmin
и db_owner
и предопределенной роли сервера sysadmin
.
Разрешение REFERENCES
на очередь по умолчанию имеет владелец очереди, члены предопределенных ролей db_ddladmin
или db_owner
базы данных, а также члены предопределенной роли сервера sysadmin
.
Разрешение RECEIVE
на очередь по умолчанию имеет владелец очереди, члены предопределенной роли db_owner
базы данных, а также члены предопределенной роли сервера sysadmin
.
Примеры
А. Создание очереди без параметров
В следующем примере создается очередь, готовая к приему сообщений. Для очереди не указана хранимая процедура активации.
CREATE QUEUE ExpenseQueue;
B. Создание недоступной очереди
В следующем примере создается очередь, недоступная для приема сообщений. Для очереди не указана хранимая процедура активации.
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' );
D. Создание очереди для указанной файловой группы
В следующем примере создается очередь на основании файловой группы ExpenseWorkFileGroup
.
CREATE QUEUE ExpenseQueue
ON ExpenseWorkFileGroup;
Е. Создание очереди с несколькими параметрами
В следующем примере создается очередь на основании файловой группы DEFAULT
. Очередь недоступна для приема сообщений. Сообщения хранятся в очереди до завершения диалога, которому они принадлежат. При переключении очереди в состояние готовности к приему сообщений с помощью инструкции ALTER QUEUE
в очереди активируется хранимая процедура AdventureWorks2022.dbo.expense_procedure
для обработки сообщений. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию CREATE QUEUE
. Очередь запускает не более 10
экземпляров хранимой процедуры.
CREATE QUEUE ExpenseQueue
WITH STATUS = OFF
, RETENTION = ON
, ACTIVATION (
PROCEDURE_NAME = AdventureWorks2022.dbo.expense_procedure
, MAX_QUEUE_READERS = 10
, EXECUTE AS SELF )
ON [DEFAULT];