Share via


Abilitazione di notifiche di query

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 delle notifiche di query

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

Documentazione di SQL Server

Abilitazione delle notifiche di query per l'esecuzione di 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 per le notifiche di 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.

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

private bool CanRequestNotifications()
{
    SqlClientPermission permission =
        new SqlClientPermission(
        PermissionState.Unrestricted);
    try
    {
        permission.Demand();
        return true;
    }
    catch (System.Exception)
    {
        return false;
    }
}
' Code requires directives to
' System.Security.Permissions and
' System.Data.SqlClient

Private Function CanRequestNotifications() As Boolean

    Dim permission As New SqlClientPermission( _
      PermissionState.Unrestricted)

    Try
        permission.Demand()
        Return True
    Catch ex As Exception
        Return False
    End Try

End Function

Scelta di un oggetto di notifica

L'API per la notifica di query fornisce due oggetti per l'elaborazione delle notifiche: SqlDependency e SqlNotificationRequest. In genere, la maggior parte delle applicazioni non ASP.NET dovrebbe usare l'oggetto SqlDependency. Le applicazioni ASP.NET dovrebbero usare il tipo SqlCacheDependency di livello più alto, che incapsula il tipo SqlDependency e fornisce un framework per l'amministrazione degli oggetti notifica e cache.

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 man mano che queste vengono inviate alla coda e analizza il messaggio Service Broker esponendo le informazioni come dati dell'evento dell'argomento. SqlDependency deve essere inizializzato chiamando il metodo Start per stabilire una dipendenza dal database. Si tratta di 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 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.

Vedi anche