Share via


Abilitazione di notifiche di query

Scarica ADO.NET

Le applicazioni che usano le notifiche delle query hanno un set di requisiti comune. L'origine dati dell'utente deve essere configurata correttamente per supportare le notifiche di query SQL e l'utente deve disporre delle autorizzazioni corrette sia sul lato client che sul lato server.

Per usare le notifiche delle query è necessario:

  • Abilitare le notifiche delle query per il database.
  • Verificare che l'ID utente usato per la connessione al database abbia le autorizzazioni necessarie.
  • Usare un oggetto SqlCommand per eseguire un'istruzione SELECT valida con un oggetto notifica associato, SqlDependency o SqlNotificationRequest.
  • Specificare il codice per elaborare la notifica se i dati monitorati cambiano.

Requisiti per le notifiche delle query

Le notifiche delle query sono supportate solo per le istruzioni SELECT che soddisfano alcuni requisiti specifici. Nella tabella seguente vengono specificati i collegamenti alla documentazione online di SQL Server relativa a Service Broker e alle notifiche delle query.

Documentazione di SQL Server

Abilitazione delle notifiche delle query per l'esecuzione del codice di esempio

Per abilitare Service Broker nel database AdventureWorks tramite SQL Server Management Studio, eseguire l'istruzione Transact-SQL seguente:

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

Per un'esecuzione corretta degli esempi di notifica delle query, è necessario eseguire le istruzioni Transact-SQL seguenti nel server di database.

CREATE QUEUE ContactChangeMessages;

CREATE SERVICE ContactChangeNotifications
  ON QUEUE ContactChangeMessages
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

Autorizzazioni delle notifiche delle query

Gli utenti che eseguono comandi che richiedono notifiche devono avere l'autorizzazione per il database SUBSCRIBE QUERY NOTIFICATIONS nel server.

Il codice lato client eseguito in una situazione di attendibilità parziale richiede SqlClientPermission.

Il codice seguente crea un oggetto SqlClientPermission, impostando PermissionState su Unrestricted. Demand forza un oggetto SecurityException in fase di esecuzione se tutti i chiamanti in posizioni superiori nello stack di chiamate non hanno l'autorizzazione.

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

    // Code requires directives to
    // System.Security.Permissions and
    // Microsoft.Data.SqlClient

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

Scelta di un oggetto per la notifica

L'API per la notifica di query fornisce due oggetti per l'elaborazione delle notifiche: SqlDependency e SqlNotificationRequest.

Uso di SqlDependency

Per usare SqlDependency, è necessario che Service Broker sia abilitato per il database SQL Server usato e gli utenti devono disporre dell'autorizzazioni appropriate per ricevere notifiche. Gli oggetti Service Broker, come ad esempio la coda delle notifiche, sono predefiniti.

Inoltre, SqlDependency avvia automaticamente un thread di lavoro per elaborare le notifiche quando vengono inserite nella coda. Analizza anche il messaggio di Service Broker, esponendo le informazioni come dati degli argomenti dell'evento. SqlDependency deve essere inizializzato chiamando il metodo Start per stabilire una dipendenza dal database. Start è un metodo statico che deve essere chiamato una sola volta durante l'inizializzazione dell'applicazione per ogni connessione al database richiesta. Il metodo Stop deve essere chiamato alla chiusura dell'applicazione per ogni connessione di dipendenza eseguita.

Uso di SqlNotificationRequest

Al contrario, SqlNotificationRequest richiede l'implementazione dell'intera infrastruttura di ascolto. È anche necessario definire tutti gli oggetti di Service Broker di supporto, ad esempio la coda, il servizio e i tipi di messaggi supportati dalla coda. Questo approccio manuale è utile se l'applicazione richiede messaggi di notifica o comportamenti di notifica speciali oppure se l'applicazione fa parte di un'applicazione Service Broker più grande.

Passaggi successivi