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(процедура)
Имя базы данных, которая содержит хранимую процедуру.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_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 в очереди активируется хранимая процедура 2008R2.dbo.expense_procedure для обработки сообщений. Хранимая процедура выполняется в контексте пользователя, выполнившего инструкцию CREATE QUEUE. Очередь запускает не более 10 экземпляров хранимой процедуры.
CREATE QUEUE ExpenseQueue
WITH STATUS = OFF,
RETENTION = ON,
ACTIVATION (
PROCEDURE_NAME = AdventureWorks2012.dbo.expense_procedure,
MAX_QUEUE_READERS = 10,
EXECUTE AS SELF )
ON [DEFAULT] ;