CREATE QUEUE (Transact-SQL)

Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği

Bir veritabanında yeni bir kuyruk oluşturur. Kuyruklar mesajları depolar. Bir hizmet için mesaj geldiğinde, Service Broker mesajı hizmetle ilişkili kuyruğa koyar.

Transact-SQL söz dizimi kuralları

Syntax

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 }

Arguments

database_name (nesne)

Yeni kuyruğun oluşturulacağı veritabanının adıdır. database_name mevcut veritabanının adını belirtmelidir. database_name sağlanmadığında, kuyruk mevcut veritabanında oluşturulur.

schema_name (nesne)

Yeni kuyruğun ait olduğu şemanın adıdır. Şema, ifadeyi çalıştıran kullanıcı için varsayılan şemaya göre varsayılan olarak kullanılır. Eğer bu ifade, CREATE QUEUEdatabase_name tarafından belirtilen veritabanındaki sabit sunucu rolünün bir üyesi veya db_dbowner veya db_ddladmin sabit veritabanı rolünün bir üyesi tarafından yürütülüyorsa, schema_name mevcut bağlantının girişiyle ilişkilendirilen şema dışında bir şema belirtebilir. Aksi takdirde, schema_name ifadeyi çalıştıran kullanıcı için varsayılan şema olmalıdır.

queue_name

Oluşturulacak kuyruğun adı bu. Bu isim, SQL Server tanımlayıcıları için gereken yönergelere uygun olmalıdır.

DURUM (Kuyruğu)

Kuyruğun kullanılabilir (ON) veya KAPALı olup olmadığını belirtir. Kuyruk kullanılamazsa, kuyruğa mesaj eklenemez veya kuyruğun içinden çıkarılamaz. Kuyruğu, mesajların kuyruğun içine ulaşmasını önlemek için kullanılabilir olmayan bir durumda oluşturabilirsiniz, ta ki kuyruk bir ALTER QUEUE ifadeyle kullanılabilir hale getirilene kadar. Bu madde çıkarılırsa, varsayılan ONUR'dur ve kuyruk kullanılabilir olur.

TUTMA

Kuyruk için saklama ayarını belirler. RETENTION = ONİyse, bu kuyruğu kullanan konuşmalarda gönderilen veya alınan tüm mesajlar, konuşmalar sona erene kadar kuyrakta tutulur. Bu, mesajları denetim amacıyla saklamanızı veya hata olursa telafi işlemleri gerçekleştirebilmenize olanak tanır. Bu madde belirtilmemişse, saklama ayarı varsayılan olarak OFF olur.

Note

RETENTION = ON olarak ayarlamak performansı düşürebilir. Bu ayar yalnızca uygulama için gerekliyse kullanılmalıdır.

ETKİNLEŞTİRME

Bu kuyruk içindeki mesajları işlemeye başlamak için hangi depolanmış prosedürün kaydedilmesi gerektiğine dair bilgileri belirtir.

DURUM (Aktivasyon)

Service Broker'ın depolanmış prosedürü başlatıp başlatmayacağını belirtir. STATUS = ON'da, kuyruk PROCEDURE_NAME ile belirtilen saklanan prosedürü başlatır; şu anda çalışan prosedür sayısı MAX_QUEUE_READERS'den az ve mesajlar kuyruğa daha hızlı ulaştığında, saklanan prosedürler mesaj aldığından daha hızlı gelir. STATUS = KAPALı olduğunda, kuyruk saklanan prosedürü başlatmaz. Bu madde belirtilmemişse, varsayılan AÇIKTIR.

PROCEDURE_NAME = <prosedür>

Bu kuyruk içindeki mesajları işlemeye başlamak için saklanan prosedürün adını belirtir. Bu değer bir SQL Server tanımlayıcısı olmalıdır.

database_name(prosedür) Depolanan prosedürü içeren veritabanının adıdır.

schema_name(prosedür) Depolanan prosedürü içeren şemanın adıdır.

procedure_name Saklanan prosedürün adıdır.

MAX_QUEUE_READERS =max_readers

Kuyruğun aynı anda başladığı aktivasyon depolanan prosedürün maksimum örneklerini belirtir. max_readers değeri 0 ile 32767 arasında bir sayı olmalıdır.

EXECUTE AS

Aktivasyon prosedürünün çalıştığı SQL Server veritabanı kullanıcı hesabını belirtir. SQL Server, kuyruk depolanan prosedür başladığında bu kullanıcının izinlerini kontrol edebilmelidir. Bir alan kullanıcısı için, prosedür başlatıldığında veya aktivasyon başarısız olduğunda sunucu alan alanına bağlı olmalıdır. Bir SQL Server kullanıcısı için sunucu her zaman izinleri kontrol edebilir.

SELF, saklanan prosedürün mevcut kullanıcı olarak çalıştığını belirtir. (Bu CREATE QUEUE ifadeyi yürüten veritabanı prüdürü.)

'user_name' Saklanan prosedürün çalıştırdığı kullanıcının adıdır. user_name parametresi, SQL Server tanımlayıcı olarak belirtilen geçerli bir SQL Server kullanıcısı olmalıdır. Mevcut kullanıcı, belirtilen user_name için KIMSE iznine sahip olmalıdır.

OWNER, saklanan prosedürün kuyruğun sahibi olarak çalıştırıldığını belirtir.

POISON_MESSAGE_HANDLING

Kuyruk için zehirli mesaj işlemenin etkin olup olmadığını belirtir. Varsayılan değer ON'dır.

Zehir mesajı işleme KAPALı olarak ayarlanmış bir kuyruk, beş ardışık işlem geri dönüşünden sonra devre dışı bırakılmaz. Bu, uygulama tarafından özel bir zehir mesajı işleme sisteminin tanımlanmasına olanak tanır.

DOSYA grubu | []DEFAULT

Bu kuyruğun oluşturulacağı SQL Server dosya grubunu belirtir. Dosya grubu parametresini bir dosya grubunu tanımlamak için kullanabilir veya tanımlayıcıyı hizmet brokeri veritabanı için varsayılan dosya grubunu kullanmak için kullanabilirsiniz DEFAULT . Bu madde bağlamında, DEFAULT anahtar kelime değildir ve tanımlayıcı olarak sınırlandırılmalıdır. Dosya grubu belirtilmediğinde, kuyruk veritabanı için varsayılan dosya grubunu kullanır.

Remarks

Bir kuyruk SELECT ifadesinin hedefi olabilir. Ancak, bir kuyruğun içeriği yalnızca Service Broker konuşmalarında çalışan ifadeler kullanılarak değiştirilebilir, örneğin SEND, RECEIVE, ve END CONVERSATION. Bir kuyruk, veya TRUNCATE ifadesinin INSERTUPDATEDELETEhedefi olamaz.

Bir kuyruk geçici bir nesne olmayabilir. Bu nedenle, kuyruk isimleri geçersiz # olur.

Aktif olmayan bir durumda kuyruk oluşturmak, mesajların kuyrukta alınmasına izin vermeden önce bir hizmet altyapısını kurmanızı sağlar.

Service Broker, kuyruk üzerinde mesaj olmadığında aktivasyon işlemlerini durdurmaz. Bir aktivasyon saklanan prosedür, kısa bir süre boyunca kuyruk üzerinde mesaj bulunmadığında çıkmalıdır.

Aktivasyon depolanan prosedürün izinleri, Service Broker depolanmış prosedürü başlattığında kontrol edilir, kuyruk oluşturulduğunda değil. Bu CREATE QUEUE ifade, maddede belirtilen kullanıcının EXECUTE AS NAME maddesinde belirtilen PROCEDURE saklanan prosedürü yürütme iznine sahip olup olmadığını doğrulamaz.

Bir kuyruk kullanılamazsa, Service Broker, veritabanı için iletim kuyruğunda kuyruğu kullanan servisler için mesajları tutar. Katalog görünümü, sys.transmission_queue iletim kuyruğunun görünümünü sunar.

Kuyruk şema sahibi bir nesnedir. Kuyruklar katalog görünümünde sys.objects görünür.

Aşağıdaki tablo, kuyruktaki sütunları listeler.

Sütun adı Veri türü Description
status tinyint İletinin durumu. Bu ifade RECEIVE , 1 durumuna sahip tüm mesajları döndürür. Mesaj tutma açıksa, durum 0 olarak ayarlanır. Mesaj tutma kapalıysa, mesaj kuyruğun üzerinden silinir. Kuyruk içindeki mesajlar aşağıdaki değerlerden birini içerebilir:

0=Alınan mesaj saklandı
1=Kabul etmeye hazır
2=Henüz tamamlanmadı
3=Gönderilen mesajı tutuldu
priority tinyint Bu mesaja atanan öncelik seviyesi.
queuing_order bigint Kuyruk içindeki mesaj sipariş numarası.
conversation_group_id uniqueidentifier Bu mesajın ait olduğu konuşma grubunun tanımlayıcısı.
conversation_handle uniqueidentifier Bu mesajın parçası olduğu konuşma için kullanıcı adı.
message_sequence_number bigint Konuşmadaki mesajın sıra numarası.
service_name nvarchar(128) Konuşmanın yapılacağı hizmetin adı.
service_id int Konuşmanın yapıldığı hizmetin SQL Server nesne tanımlayıcısı.
service_contract_name nvarchar(128) Konuşmanın takip ettiği sözleşmenin adı.
service_contract_id int Konuşmanın takip ettiği sözleşmenin SQL Server nesne tanımlayıcısı.
message_type_name nvarchar(128) Mesajı tanımlayan mesaj türünün adı.
message_type_id int Mesajı tanımlayan mesaj tipine ait SQL Server nesne tanımlayıcısı.
validation nchar(2) Mesaj için kullanılan doğrulama.
E=Boş
N=Yok
X=XML
message_body varbinary(max) İletinin içeriği.
message_enqueue_time datetime Mesajın sıraya girdiği zaman.

Permissions

Kuyruk oluşturma izni, sabit veritabanı rollerinin üyelerini db_ddladmindb_owner veya sysadmin sabit sunucu rolünü kullanır.

REFERENCESKuyruk için izin, varsayılan olarak kuyruğun sahibine, sabit veritabanı rollerinin db_owner üyelerine db_ddladmin veya sabit sysadmin sunucu rolünün üyelerine aitti.

RECEIVE Kuyruk için izin, varsayılan olarak kuyruğun sahibine, sabit db_owner veritabanı rolünün üyelerine veya sabit sysadmin sunucu rolünün üyelerine verilir.

Examples

A. Parametresiz bir kuyruk oluştur

Aşağıdaki örnek, mesajları almak için kullanılabilir bir kuyruk oluşturur. Kuyruk için herhangi bir aktivasyon kaydedilmiş prosedürü belirtilmemiştir.

CREATE QUEUE ExpenseQueue;

B. Erişilmez bir kuyruk oluştur

Aşağıdaki örnek, mesaj almak için kullanılamayan bir kuyruk oluşturur. Kuyruk için herhangi bir aktivasyon kaydedilmiş prosedürü belirtilmemiştir.

CREATE QUEUE ExpenseQueue WITH STATUS=OFF;

C. Bir kuyruk oluşturun ve iç aktivasyon bilgilerini belirtin

Aşağıdaki örnek, mesajları almak için kullanılabilir bir kuyruk oluşturur. Kuyruk saklanan prosedürü expense_procedure bir mesaj kuyruğa girdiğinde başlatır. Saklanan prosedür kullanıcı ExpenseUserolarak çalıştırılır. Kuyruk depolanan prosedürün maksimum 5 örneklerini başlatır.

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

D. Belirli bir dosya grubunda kuyruk oluşturun

Aşağıdaki örnek, dosya grubunda ExpenseWorkFileGroupbir kuyruk oluşturur.

CREATE QUEUE ExpenseQueue
    ON ExpenseWorkFileGroup;

E. Birden fazla parametreli bir kuyruk oluşturun

Aşağıdaki örnek, dosya grubunda DEFAULT bir kuyruk oluşturur. Kuyruk kullanılamaz. Mesajlar, ait oldukları konuşma sona erene kadar kuyrukta tutulur. Kuyruk ile ALTER QUEUEerişilebilir hale getirildiğinde, kuyruk mesajları işlemek için saklanan prosedürü AdventureWorks2022.dbo.expense_procedure başlatır. Saklanan prosedür, ifadeyi CREATE QUEUE çalıştıran kullanıcı olarak çalıştırılır. Kuyruk depolanan prosedürün maksimum 10 örneklerini başlatır.

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