SqlDependency wird sofort ausgelöst

8

Ich möchte SqlDependency verwenden, um Benachrichtigungen zu erhalten, wenn einige Daten von anderen Anwendungen geändert werden, die die Datenbank verwenden.

%Vor%

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:

%Vor%

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:

  • Die projizierten Spalten in der SELECT-Anweisung müssen explizit sein angegeben, und Tabellennamen müssen mit zweiteiligen Namen qualifiziert werden. Beachten das bedeutet, dass alle in der Anweisung referenzierten Tabellen sein müssen in der gleichen Datenbank. OK
  • Die Anweisung darf die Sternchen- () oder Tabellenname. -Syntax nicht verwenden Spalten angeben OK
  • Die Anweisung darf keine unbenannten Spalten oder doppelte Spaltennamen verwenden. OK
  • Die Anweisung muss auf eine Basistabelle verweisen. OK
  • Die projizierten Spalten in der SELECT-Anweisung dürfen nicht enthalten sein Aggregatausdrücke, es sei denn, die Anweisung verwendet GROUP BY Ausdruck. Wenn ein GROUP BY-Ausdruck bereitgestellt wird, wird die Auswahlliste ausgewählt kann die Aggregatfunktionen COUNT_BIG () oder SUM () enthalten. Jedoch, SUM () darf für eine Spalte, die NULL-Werte zulässt, nicht angegeben werden. OK
  • Die Anweisung darf HAVING, CUBE oder ROLLUP nicht angeben. Ein projizierter Spalte in der SELECT-Anweisung, die als einfacher Ausdruck verwendet wird darf nicht mehr als einmal erscheinen. OK
  • Die Anweisung darf keine PIVOT- oder UNPIVOT-Operatoren enthalten. OK
  • Die Anweisung darf die Operatoren INTERSECT oder EXCEPT nicht enthalten. OK
  • Die Anweisung darf nicht auf eine Ansicht verweisen. OK
  • Die Anweisung darf keines der folgenden Elemente enthalten: DISTINCT, COMPUTE oder COMPUTE BY oder INTO. OK
  • Die Anweisung darf nicht auf globale Servervariablen verweisen (@@Variablennamen). OK
  • Die Anweisung darf nicht auf abgeleitete Tabellen, temporäre Tabellen oder Tabellenvariablen. OK
  • Die Anweisung darf nicht auf Tabellen oder Sichten aus anderen Datenbanken verweisen oder Server. OK
  • Die Anweisung darf keine Unterabfragen, Outer-Joins oder enthalten Self-Joins. OK
  • Die Anweisung darf nicht auf die großen Objekttypen verweisen: text, ntext, und Bild. OK
  • Die Anweisung darf den CONTAINS- oder FREETEXT-Volltext nicht verwenden Prädikate. OK
  • Die Anweisung darf keine Rowset-Funktionen verwenden, einschließlich OPENROWSET und OPENQUERY. OK
  • Die Anweisung darf keine der folgenden Aggregatfunktionen verwenden: AVG, COUNT (*), MAX, MIN, STABW, STABW, VAR oder VARP. OK
  • Die Anweisung darf keine nichtdeterministischen Funktionen einschließlich Ranking- und Fensterfunktionen. OK
  • Die Anweisung darf keine benutzerdefinierten Aggregate enthalten. OK
  • Die Anweisung darf nicht auf Systemtabellen oder Sichten verweisen, einschließlich Katalogansichten und dynamische Verwaltungsansichten. OK
  • Die Anweisung darf keine FOR BROWSE-Informationen enthalten. OK
  • Die Anweisung darf nicht auf eine Warteschlange verweisen. OK
  • Die Anweisung darf keine bedingten Anweisungen enthalten, die nicht möglich sind ändern und kann keine Ergebnisse zurückgeben (z. B. WHERE 1 = 0). OK

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).

    
Antoine Esteve 01.04.2015, 13:44
quelle

2 Antworten

5

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.

    
Jon Tirjan 03.04.2015, 16:26
quelle
0

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.

    
dyatchenko 22.04.2015 04:32
quelle

Tags und Links