Ich möchte SqlDependency
verwenden, um Benachrichtigungen zu erhalten, wenn einige Daten von anderen Anwendungen geändert werden, die die Datenbank verwenden.
Also, mit einer einzigen Zeile kann ich einen Event-Handler registrieren:
%Vor%Aber mein Problem ist, dass die Benachrichtigung sofort ausgelöst wird:
%Vor% Deshalb habe ich AbonnementChanges
in meinem Event-Handler OnChanges
kommentiert (oder es wird endlos laufen).
Ich weiß nicht, woher das Problem kommt, weil ich die Benachrichtigungen zurückgesetzt habe ( { Notification = null }
) und meine Anfrage die Anforderungen erfüllt ( Ссылка ).
Bearbeiten: Ich möchte hinzufügen, dass select * from sys.dm_qn_subscriptions
nichts zurückgibt.
Bearbeiten: Es sieht so aus, als käme es von der Datenbankkonfiguration und nicht von meiner Implementierung, da ich eine andere Implementierung ausprobiert habe, die zu demselben Verhalten führt: Ссылка
Bearbeiten: Ich sehe nicht, wo es herkommt, da ich SA verwende, das Systemadministrator ist und alle Rechte hat, nicht wahr?
Bearbeiten: Ich habe versucht, eine andere Verbindung zur Datenbank zu definieren, die diesem Tutorial folgt: Ссылка
Also habe ich zwei Rollen erstellt:
%Vor% und dann habe ich den Benutzer ( production
) zu diesen Rollen hinzugefügt:
- Sicherstellen, dass meine Benutzer Mitglied der richtigen Rolle sind.
%Vor%Aber mit dieser Verbindung habe ich das gleiche Verhalten wie vorher. Benachrichtigungen werden sofort ausgelöst:
%Vor% Bearbeiten: Ich habe es mit einfacheren Anfragen wie: SELECT Nom, Prenom FROM dbo.Utilisateur
versucht.
Hier sind die Details der Tabelle, die überprüft werden sollte:
Wie wir sehen können, gibt es einige Spalten, die nicht angefordert werden können. Deshalb benutze ich es nicht.
Sehen wir uns nun SELECT Nom, Prenom FROM dbo.Utilisateur
an:
Aber das funktioniert immer noch nicht ... = (
Letzte Änderung - Lösung: Wie Jon Tirjan sagte, wurde dies durch meine berechnete Spalte NomComplet
verursacht, die nicht mit dem Service Broker gültig ist (auch wenn ich nicht darum ersucht habe, benachrichtigt zu werden Änderungen an dieser Spalte, die mir fremd ist).
Service Broker funktioniert nicht mit Tabellen mit berechneten Spalten. Sie müssen NomComplet
aus Ihrer Tabelle entfernen oder sie in eine tatsächliche Spalte ändern, die anders gefüllt ist (Trigger, Stored Procedure, etc.)
Die Benachrichtigung wird sofort ausgelöst, weil beim Einrichten der Warteschlange ein Fehler auftritt.
Danke George Stocker für das Löschen meiner vorherigen Antwort, aber ich hatte eine ernste Ausgabe mit SQL-Abhängigkeit und ich bestehe darauf:
Seien Sie vorsichtig bei der Verwendung der Klasse SqlDependency - sie enthält Probleme mit Speicherlecks.
Für mein Projekt habe ich Open-Source-Realisierung verwendet - SqlDependencyEx . Es verwendet einen Datenbankauslöser und eine native Service Broker-Benachrichtigung, um Ereignisse zu den Tabellenänderungen zu empfangen. Dies ist ein Anwendungsbeispiel:
%Vor% Mit SqlDependecyEx
können Sie INSERT
, DELETE
, UPDATE
separat überwachen und erhalten tatsächlich geänderte Daten ( xml
) im Ereignisargument. Hoffe diese Hilfe.
Tags und Links sql sql-server c#