Der Vollständigkeit halber gibt es einige andere Lösungen, die (meiner Meinung nach) orthodoxer sind als Lösungen, die auf den Klassen SqlDependency (und SqlTableDependency) basieren. SqlDependency wurde ursprünglich entwickelt, um das Aktualisieren verteilter Webserver-Caches zu vereinfachen, und wurde daher an andere Anforderungen angepasst, als wenn es als Event-Produzent konzipiert wäre.
Es gibt im Großen und Ganzen vier Optionen, von denen einige hier noch nicht behandelt wurden:
- Tracking ändern
- CDC
- Löst Warteschlangen aus
- CLR
Tracking ändern
Quelle: https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-tracking-sql-server
Änderungsverfolgung ist ein einfacher Benachrichtigungsmechanismus in SQL Server. Grundsätzlich wird bei jeder Änderung an Daten eine datenbankweite Versionsnummer erhöht. Die Versionsnummer wird dann mit einer Bitmaske einschließlich der Namen der geänderten Spalten in die Änderungsverfolgungstabellen geschrieben. Beachten Sie, dass die tatsächliche Änderung nicht beibehalten wird. Die Benachrichtigung enthält nur die Informationen, die eine bestimmte Datenentität geändert hat. Da die Versionierung der Änderungstabelle kumulativ ist, werden Änderungsbenachrichtigungen für einzelne Elemente nicht beibehalten und durch neuere Benachrichtigungen überschrieben. Dies bedeutet, dass bei einer zweimaligen Änderung einer Entität die Änderungsverfolgung nur über die letzte Änderung informiert ist.
Um diese Änderungen in c # zu erfassen, muss Polling verwendet werden. Die Änderungsverfolgungstabellen können abgefragt und jede Änderung überprüft werden, um festzustellen, ob sie von Interesse ist. Wenn es von Interesse ist, müssen Sie direkt zu den Daten gehen, um den aktuellen Status abzurufen.
Datenerfassung ändern
Quelle: https://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx
Die Änderungsdatenerfassung (CDC) ist leistungsfähiger, aber am kostspieligsten als die Änderungsverfolgung. Die Änderungsdatenerfassung verfolgt und benachrichtigt Änderungen basierend auf der Überwachung des Datenbankprotokolls. Aus diesem Grund hat CDC Zugriff auf die tatsächlich geänderten Daten und zeichnet alle einzelnen Änderungen auf.
Ähnlich wie bei der Änderungsverfolgung muss die Abfrage verwendet werden, um diese Änderungen in c # zu erfassen. Im Fall von CDC enthalten die abgefragten Informationen jedoch die Änderungsdetails, sodass es nicht unbedingt erforderlich ist, zu den Daten selbst zurückzukehren.
Löst Warteschlangen aus
Quelle: https://code.msdn.microsoft.com/Service-Broker-Message-e81c4316
Diese Technik hängt von den Triggern in den Tabellen ab, für die Benachrichtigungen erforderlich sind. Bei jeder Änderung wird ein Trigger ausgelöst, und der Trigger schreibt diese Informationen in eine Service Broker-Warteschlange. Die Warteschlange kann dann über C # mithilfe des Service Broker-Nachrichtenprozessors verbunden werden (Beispiel im obigen Link).
Im Gegensatz zu Change Tracking oder CDC sind Trigger für Warteschlangen nicht auf Abfragen angewiesen und bieten somit Echtzeit-Eventing.
CLR
Dies ist eine Technik, die ich gesehen habe, aber ich würde sie nicht empfehlen. Jede Lösung, die sich bei der externen Kommunikation auf die CLR stützt, ist bestenfalls ein Hack. Die CLR wurde entwickelt, um das Schreiben von komplexem Datenverarbeitungscode durch die Nutzung von C # zu vereinfachen. Es wurde nicht entwickelt, um externe Abhängigkeiten wie Messaging-Bibliotheken zu verkabeln. Darüber hinaus können CLR-gebundene Vorgänge in Clusterumgebungen auf unvorhersehbare Weise unterbrochen werden.
Das Einrichten ist jedoch recht einfach, da Sie lediglich die Messaging-Assembly bei CLR registrieren müssen und dann mithilfe von Triggern oder SQL-Jobs abrufen können.
Zusammenfassend...
Es hat mich immer wieder überrascht, dass Microsoft sich standhaft geweigert hat, diesen Problembereich anzusprechen. Das Ereignis von der Datenbank zum Code sollte eine integrierte Funktion des Datenbankprodukts sein. In Anbetracht der Tatsache, dass Oracle Advanced Queuing in Kombination mit dem Ereignis ODP.net MessageAvailable vor mehr als 10 Jahren ein zuverlässiges Datenbankereignis für C # bereitstellte, ist dies für MS bedauerlich.
Das Ergebnis ist, dass keine der für diese Frage aufgeführten Lösungen sehr nett ist. Sie alle haben technische Nachteile und erhebliche Einrichtungskosten. Microsoft, wenn Sie zuhören, klären Sie bitte diesen traurigen Zustand.