CREATE QUEUE (Transact-SQL)
Crea una nuova coda in un database. Le code vengono utilizzate per archiviare messaggi. Quando viene recapitato un messaggio per un servizio, Service Broker inserisce il messaggio nella coda associata al servizio.
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
}
Una coda può essere la destinazione di un'istruzione SELECT. È tuttavia possibile modificare il contenuto di una coda solo tramite istruzioni che operano in conversazioni di Service Broker, quali SEND, RECEIVE e END CONVERSATION. Non è possibile specificare una coda come destinazione di un'istruzione INSERT, UPDATE, DELETE o TRUNCATE.
Una coda non può essere un oggetto temporaneo. Pertanto, i nomi di coda che iniziano con # non sono validi.
La creazione di una coda con stato inattivo consente di predisporre l'infrastruttura necessaria per un servizio prima di consentire la ricezione dei messaggi nella coda.
Service Broker non arresta le stored procedure di attivazione se non sono presenti messaggi nella coda. È consigliabile prevedere l'interruzione di una stored procedure di attivazione se nella coda non sono disponibili messaggi per un breve periodo di tempo.
Le autorizzazioni per la stored procedure di attivazione vengono controllate quando Service Broker avvia la stored procedure e non al momento della creazione della coda. L'istruzione CREATE QUEUE non verifica che l'utente specificato nella clausola EXECUTE AS disponga delle autorizzazioni per l'esecuzione della stored procedure specificata nella clausola PROCEDURE NAME.
Quando una coda non è disponibile, Service Broker mantiene i messaggi per i servizi che utilizzano tale coda nella coda di trasmissione per il database. La vista del catalogo sys.transmission_queue consente di visualizzare il contenuto della coda di trasmissione.
Una coda è un oggetto di proprietà dello schema. Le code sono incluse nella vista del catalogo sys.objects.
Nella tabella seguente vengono elencate le colonne di una coda.
Nome colonna | Tipo di dati | Descrizione |
|---|---|---|
status | tinyint | Stato del messaggio. L'istruzione RECEIVE restituisce tutti i messaggi con stato 1. Se la memorizzazione dei messaggi è attiva, lo stato viene quindi impostato su 0. Se la memorizzazione dei messaggi è disattivata, il messaggio viene eliminato dalla coda. I messaggi nella coda possono contenere uno dei valori seguenti: 0 = Messaggio ricevuto memorizzato 1 = Pronto per la ricezione 2 = Non ancora completo 3 = Messaggio inviato memorizzato |
priority | tinyint | Livello di priorità assegnato al messaggio. |
queuing_order | bigint | Numero progressivo del messaggio nella coda. |
conversation_group_id | uniqueidentifier | Identificatore del gruppo di conversazioni a cui appartiene il messaggio. |
conversation_handle | uniqueidentifier | Handle della conversazione di cui fa parte il messaggio. |
message_sequence_number | bigint | Numero di sequenza del messaggio nella conversazione. |
service_name | nvarchar(512) | Nome del servizio a cui è destinata la conversazione. |
service_id | int | Identificatore di oggetto di SQL Server del servizio a cui è destinata la conversazione. |
service_contract_name | nvarchar(256) | Nome del contratto rispettato dalla conversazione. |
service_contract_id | int | Identificatore di oggetto di SQL Server del contratto rispettato dalla conversazione. |
message_type_name | nvarchar(256) | Nome del tipo di messaggio che descrive il messaggio. |
message_type_id | int | Identificatore di oggetto di SQL Server del tipo di messaggio che descrive il messaggio. |
validation | nchar(2) | Convalida utilizzata per il messaggio. E=Vuoto N=Nessuno X=XML |
message_body | varbinary(MAX) | Contenuto del messaggio. |
message_id | uniqueidentifier | Identificatore univoco del messaggio. |
L'autorizzazione per la creazione di una coda viene assegnata ai membri del ruolo predefinito del database db_ddladmin o db_owner e ai membri del ruolo predefinito del server sysadmin.
L'autorizzazione REFERENCES per una coda viene assegnata per impostazione predefinita al proprietario della coda, ai membri del ruolo predefinito del database db_ddladmin o db_owner e ai membri del ruolo predefinito del server sysadmin.
L'autorizzazione RECEIVE per una coda viene assegnata per impostazione predefinita al proprietario della coda, ai membri del ruolo predefinito del database db_owner e ai membri del ruolo predefinito del server sysadmin.
A. Creazione di una coda senza parametri
Nell'esempio seguente viene creata una coda disponibile per la ricezione di messaggi. Per la coda non viene specificata alcuna stored procedure di attivazione.
CREATE QUEUE ExpenseQueue ;
B. Creazione di una coda non disponibile
Nell'esempio seguente viene creata una coda non disponibile per la ricezione di messaggi. Per la coda non viene specificata alcuna stored procedure di attivazione.
CREATE QUEUE ExpenseQueue WITH STATUS=OFF ;
C. Creazione di una coda e impostazione delle informazioni interne per l'attivazione
Nell'esempio seguente viene creata una coda disponibile per la ricezione di messaggi. La coda avvia la stored procedure expense_procedure quando un messaggio raggiunge la coda. La stored procedure viene eseguita con l'account ExpenseUser. La coda avvia al massimo 5 istanze della stored procedure.
CREATE QUEUE ExpenseQueue
WITH STATUS=ON,
ACTIVATION (
PROCEDURE_NAME = expense_procedure,
MAX_QUEUE_READERS = 5,
EXECUTE AS 'ExpenseUser' ) ;
D. Creazione di una coda in un filegroup specifico
Nell'esempio seguente viene creata una coda nel filegroup ExpenseWorkFileGroup.
CREATE QUEUE ExpenseQueue
ON ExpenseWorkFileGroup ;
E. Creazione di una coda con più parametri
Nell'esempio seguente viene creata una coda nel filegroup DEFAULT. La coda non è disponibile. I messaggi vengono memorizzati nella coda fino al termine della conversazione cui appartengono. Quando viene resa disponibile tramite ALTER QUEUE, la coda avvia la stored procedure 2008R2.dbo.expense_procedure per elaborare i messaggi. La stored procedure viene eseguita con l'account dell'utente che ha eseguito l'istruzione CREATE QUEUE. La coda avvia al massimo 10 istanze della stored procedure.
CREATE QUEUE ExpenseQueue
WITH STATUS = OFF,
RETENTION = ON,
ACTIVATION (
PROCEDURE_NAME = AdventureWorks2008R2.dbo.expense_procedure,
MAX_QUEUE_READERS = 10,
EXECUTE AS SELF )
ON [DEFAULT] ;
