ALTER QUEUE (Transact-SQL)
Modifica le proprietà di una coda.
Convenzioni della sintassi Transact-SQL
Sintassi
ALTER 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 } ]
| DROP }
) [ , ]]
[ POISON_MESSAGE_HANDLING (
STATUS = { ON | OFF } )
]
[ ; ]
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
queue_name
}
<procedure> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
stored_procedure_name
}
Argomenti
database_name (oggetto)
Nome del database contenente la coda da modificare. Se non si specifica database_name, viene utilizzato per impostazione predefinita il database corrente.schema_name (oggetto)
Nome dello schema a cui appartiene la nuova coda. Se non si specifica schema_name, viene utilizzato per impostazione predefinita lo schema predefinito dell'utente corrente.queue_name
Nome della coda da modificare.STATUS (coda)
Specifica se la coda è disponibile (ON) o non disponibile (OFF). Quando la coda non è disponibile non è possibile aggiungere o rimuovere messaggi nella coda.RETENTION
Specifica l'impostazione di memorizzazione per la coda. Se RETENTION = ON, tutti i messaggi inviati o ricevuti per conversazioni che utilizzano la coda vengono memorizzati nella coda fino al termine delle conversazioni. Ciò consente di memorizzare i messaggi a scopi di controllo oppure di eseguire transazioni di compensazione se si verificano errori.[!NOTA]
L'impostazione di RETENTION = ON può ridurre le prestazioni. È consigliabile utilizzare questa impostazione solo se necessario per soddisfare il contratto di servizio per l'applicazione.
ACTIVATION
Specifica informazioni sulla stored procedure attivata per l'elaborazione dei messaggi che arrivano nella coda.STATUS (attivazione)
Specifica se la coda attiva la stored procedure. Se STATUS = ON, la coda avvia la stored procedure specificata con PROCEDURE_NAME quando il numero di procedure in esecuzione è minore di MAX_QUEUE_READERS e quando i messaggi arrivano nella coda più velocemente di quanto possano essere elaborati dalle stored procedure. Se STATUS = OFF, la coda non attiva la stored procedure.PROCEDURE_NAME = <procedure>
Specifica il nome della stored procedure da attivare quando la coda contiene messaggi da elaborare. Il valore deve essere un identificatore di SQL Server.database_name (procedura)
Nome del database contenente la stored procedure.schema_name (procedura)
Nome dello schema a cui appartiene la stored procedure.stored_procedure_name
Nome della stored procedure.MAX_QUEUE_READERS =max_reader
Specifica il numero massimo di istanze della stored procedure di attivazione che possono essere avviate simultaneamente dalla coda. Il valore di max_readers deve essere un numero compreso nell'intervallo da 0 a 32767.EXECUTE AS
Viene specificato l'account utente del database di SQL Server utilizzato per l'esecuzione della stored procedure di attivazione. Tramite SQL Server deve essere possibile controllare le autorizzazioni per tale utente nel momento in cui la stored procedure viene attivata dalla coda. Per un utente di dominio di Windows, è necessario che SQL Server sia connesso al dominio e sia in grado di convalidare le autorizzazioni dell'utente specificato quando viene attivata la procedura o l'attivazione ha esito negativo. Nel caso degli utenti di SQL Server, il server è sempre in grado di eseguire il controllo delle autorizzazioni.SELF
Specifica che la stored procedure viene eseguita con l'account dell'utente corrente (l'entità di database che esegue l'istruzione ALTER QUEUE).'user_name'
Nome dell'utente utilizzato per l'esecuzione della stored procedure. Il parametro user_name deve essere un utente di SQL Server valido specificato come identificatore di SQL Server. L'utente corrente deve disporre dell'autorizzazione IMPERSONATE per l'account user_name specificato.OWNER
Specifica che la stored procedure viene eseguita con l'account del proprietario della coda.DROP
Elimina tutte le informazioni di attivazione associate alla coda.POISON_MESSAGE_HANDLING
Specifica se la gestione del messaggio non elaborabile è abilitata. Il valore predefinito è ON.Una coda con la gestione di messaggi non elaborabili impostata su OFF non verrà disabilitata dopo cinque rollback di transazioni consecutivi. In questo modo è possibile che un sistema di gestione di messaggi non elaborabili venga definito dall'applicazione.
Osservazioni
Se una coda per cui viene specificata una stored procedure di attivazione contiene messaggi, la modifica dello stato di attivazione da OFF a ON comporta l'attivazione immediata della stored procedure di attivazione. La modifica dello stato di attivazione da ON a OFF impedisce a Service Broker di attivare altre istanze della stored procedure, ma non arresta le istanze della stored procedure già in esecuzione.
La modifica di una coda per l'aggiunta di una stored procedure di attivazione non modifica lo stato di attivazione della coda. La modifica della stored procedure di attivazione per la coda non influisce sulle istanze della stored procedure di attivazione già in esecuzione.
Service Broker controlla il numero massimo di lettori per una coda nell'ambito del processo di attivazione. Se quindi si modifica una coda per aumentare il numero massimo di lettori, Service Broker sarà in grado di avviare immediatamente più istanze della stored procedure di attivazione. La modifica di una coda per ridurre il numero massimo di lettori non influisce sulle istanze della stored procedure di attivazione già in esecuzione. In Service Broker, tuttavia, non viene avviata una nuova istanza della stored procedure fino a quando il numero di istanze per la stored procedure di attivazione non risulta inferiore al numero massimo configurato.
Quando una coda non è disponibile, i messaggi per i servizi che utilizzano tale coda vengono mantenuti da Service Broker nella coda di trasmissione per il database. La vista del catalogo sys.transmission_queue consente di visualizzare il contenuto della coda di trasmissione.
Se in un'istruzione RECEIVE o GET CONVERSATION GROUP viene specificata una coda non disponibile, l'istruzione ha esito negativo e viene generato un errore Transact-SQL.
Autorizzazioni
Le autorizzazioni per la modifica di una coda vengono assegnate 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.
Esempi
A.Impostazione di una coda come non disponibile
Nell'esempio seguente la coda ExpenseQueue viene resa non disponibile per la ricezione di messaggi.
ALTER QUEUE ExpenseQueue WITH STATUS = OFF ;
B.Modifica della stored procedure di attivazione
Nell'esempio seguente viene modificata la stored procedure avviata dalla coda. La stored procedure viene eseguita con l'account dell'utente che ha eseguito l'istruzione ALTER QUEUE.
ALTER QUEUE ExpenseQueue
WITH ACTIVATION (
PROCEDURE_NAME = new_stored_proc,
EXECUTE AS SELF) ;
C.Modifica del numero di lettori di coda
Nell'esempio seguente il numero massimo di istanze della stored procedure avviate da Service Broker per la coda viene impostato su 7.
ALTER QUEUE ExpenseQueue WITH ACTIVATION (MAX_QUEUE_READERS = 7) ;
D.Modifica della stored procedure di attivazione e dell'account EXECUTE AS
Nell'esempio seguente viene modificata la stored procedure avviata da Service Broker. La stored procedure viene eseguita con l'account utente SecurityAccount.
ALTER QUEUE ExpenseQueue
WITH ACTIVATION (
PROCEDURE_NAME = AdventureWorks2012.dbo.new_stored_proc ,
EXECUTE AS 'SecurityAccount') ;
E.Impostazione della coda per la memorizzazione dei messaggi
Nell'esempio seguente viene impostata la coda per la memorizzazione dei messaggi. Nella coda vengono memorizzati tutti i messaggi inviati ai servizi o provenienti dai servizi che utilizzano la coda fino alla fine della conversazione contenente il messaggio.
ALTER QUEUE ExpenseQueue WITH RETENTION = ON ;
F.Rimozione delle informazioni di attivazione da una coda
Nell'esempio seguente vengono rimosse tutte le informazioni di attivazione dalla coda.
ALTER QUEUE ExpenseQueue WITH ACTIVATION (DROP) ;