Activation des notifications de requête (ADO.NET)
Les applications qui utilisent des notifications de requête ont un ensemble commun d'exigences. Votre source de données doit être correctement configurée pour prendre en charge les notifications de requête SQL et l'utilisateur doit disposer des autorisations appropriées côté client et côté serveur.
Pour utiliser des notifications de requête, vous devez :
Utiliser SQL Server 2005 ou SQL Server 2008.
Activer les notifications de requête pour votre base de données.
Veiller à ce que l'ID utilisateur utilisé pour se connecter à la base de données dispose des autorisations nécessaires.
Utiliser un objet SqlCommand pour exécuter une instruction SELECT valide avec un objet notification associé — SqlDependency ou SqlNotificationRequest.
Fournir le code permettant de traiter la notification en cas de modification des données surveillées.
Spécifications des notifications de requête
Les notifications de requête ne sont prises en charge que pour les instructions SELECT qui répondent à une liste de spécifications précises. Le tableau suivant présente des liens vers la documentation consacrée à Service Broker et aux notifications de requête dans la documentation en ligne de SQL Server.
Documentation en ligne de SQL Server 2005 |
Documentation en ligne de SQL Server 2008 |
---|---|
Considérations relatives à sécurité de Notifications Services |
|
Considérations sur la conception de la solution (Service Broker) |
|
Activation des notifications de requête pour exécuter l'exemple de code
Pour activer Service Broker sur la base de données AdventureWorks à l'aide de SQL Server Management Studio, exécutez l'instruction Transact-SQL suivante :
ALTER DATABASE AdventureWorks SET ENABLE_BROKER;
Pour que les exemples de notification de requête s'exécutent correctement, les instructions Transact-SQL suivantes doivent être exécutées sur le serveur de base de données.
CREATE QUEUE ContactChangeMessages;
CREATE SERVICE ContactChangeNotifications
ON QUEUE ContactChangeMessages
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
Autorisations de notifications de requête
Les utilisateurs qui exécutent des commandes nécessitant une notification doivent disposer d'une autorisation de base de données SUBSCRIBE QUERY NOTIFICATIONS sur le serveur.
Le code côté client exécuté dans une situation de confiance partielle requiert le SqlClientPermission.
Le code suivant crée un objet SqlClientPermission en affectant la valeur PermissionState à l'objet Unrestricted. La méthode Demand forcera un objet SecurityException au moment de l'exécution si l'autorisation n'a été accordée à aucun des appelants figurant plus haut dans la pile des appels.
' 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
// 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;
}
}
Sélection d'un objet notification
L'API des notifications de requête fournit deux objets pour traiter les notifications :SqlDependency et SqlNotificationRequest. En règle générale, la plupart des applications non ASP.NET doivent utiliser l'objet SqlDependency. Les applications ASP.NET doivent utiliser le SqlCacheDependency de niveau supérieur, qui enveloppe SqlDependency et fournit un cadre pour l'administration des objets notification et cache.
Utilisation de SqlDependency
Pour utiliser SqlDependency, Service Broker doit être activé pour la base de données SQL Server utilisée et les utilisateurs doivent disposer des autorisations nécessaires pour recevoir des notifications. Les objets Service Broker, tels que la file d'attente des notifications, sont prédéfinis.
De plus, l'objet SqlDependency lance automatiquement un thread de travail pour traiter les notifications à mesure qu'elles sont publiées dans la file d'attente ; il analyse également le message de Service Broker, en exposant les informations comme données d'argument d'événement. L'objet SqlDependency doit être initialisé par l'appel à la méthode Start afin d'établir une dépendance par rapport à la base de données. Il s'agit d'une méthode statique qui doit être appelée une fois durant l'initialisation de l'application pour chaque connexion requise à la base de données. La méthode Stop doit être appelée à la fin de l'application pour chaque connexion de dépendance établie.
Utilisation de SqlNotificationRequest
En revanche, SqlNotificationRequest requiert que vous implémentiez vous-même l'infrastructure d'écoute complète. En outre, tous les objets Service Broker tels que la file d'attente, le service et les types de message pris en charge par la file d'attente doivent être définis. Cette approche manuelle est utile si votre application requiert des messages ou des comportements de notification spéciaux, ou si votre application fait partie d'une application Service Broker plus large.