Frage

Ich möchte einen Dienst (wahrscheinlich in c #) schreiben, die eine Datenbanktabelle überwacht. Wenn ein Datensatz in die Tabelle eingefügt wird, möchte ich den Service, um die neu eingefügten Daten zu packen, und führen Sie mit ihm einig komplexen Business-Logik (zu komplex für TSQL).

Eine Option ist der Dienst in regelmäßigen Abständen auf den Tisch zu haben, überprüfen Sie, ob neue Datensätze eingefügt wurden. Das Problem mit dem es auf diese Weise tut, ist, dass ich der Service möge über die Einsätze wissen, sobald sie passieren, und ich möchte nicht, die Datenbank-Performance töten.

eine wenig Forschung tun, scheint es, wie vielleicht einen CLR-Trigger schreiben könnte den Job. Ich kann Trigger in c # schreiben, die ausgelöst wird, wenn ein Einsatz stattfindet, und dann die neu eingefügten Daten an einen Windows- oder WCF-Dienst senden.

Was denken Sie, ist das eine gute (oder sogar möglich) Verwendung von SQL CLR auslöst?

Jede andere Ideen, wie dies zu erreichen?

War es hilfreich?

Lösung

Wahrscheinlich sollten Sie entkoppeln die Nachbearbeitung von Einfügen:

In dem Insert-Trigger, fügen Sie den PK Rekord in eine Warteschlange Tabelle.

In einem separaten Dienst, lesen aus der Warteschlange Tabelle und tun Sie Ihre komplexe Operation. Wenn Sie fertig sind, den Datensatz markieren, wie verarbeitet (zusammen mit Fehler / Status-Info) oder den Datensatz aus der Warteschlange gelöscht werden.

Andere Tipps

Was Sie beschreiben, ist manchmal eine Job Queue oder eine Message Queue genannt. Es gibt mehrere Threads über eine DBMS-Tabelle mit (wie auch andere Techniken), dies zu tun, die Sie suchen finden.

Ich würde alles dies mit einem Auslöser tun iike als eine unangemessene Verwendung einer Datenbank-Funktion ist, die in Schwierigkeiten geraten mit ohnehin einfach ist. Trigger werden am besten für Low-Overhead dbms strukturelle Funktionalität (zum Beispiel feinkörnige Referenzintegritätsprüfung) und müssen leicht und synchron sein. Es getan werden könnte, aber wahrscheinlich wäre keine gute Idee sein.

Ich würde vorschlagen, einen Trigger auf dem Tisch hat, die die SQL Server Service Broker , dass dann (asynchron) führt eine CLR gespeicherte Prozedur, die in einem anderen Thread alle Ihre Arbeit erledigt.

Ich habe einen Dienst, fragt die Datenbank jede Minute, es ist nicht so viele Performance-Probleme verursacht, und es ist eine saubere Lösung. Plus, wenn Ihre Dienstleistung oder anderer wcf Endpunkt nicht da ist Ihr Trigger fehlschlagen werden oder verloren gehen, und Sie werden sowieso später abzufragen haben.

Ich würde nicht empfehlen, einen CLR-Trigger verwenden, oder jede Art von Auslöser dafür. Sie öffnen sich ernsthafte Wartbarkeit und potenzielle Probleme mit Sperren zu haben. (Ein sehr einfacher Trigger, Sachen in eine Audit / Queue-Tabelle Futter kann akzeptabel sein, wenn Sie nicht über @@ identity nach Einsätzen kümmern und Sie werden nie die Prüfung / Queue-Tabelle nach oben verriegeln)

Stattdessen aus Ihrer Anwendung / orm Sie auslösen sollen Sachen in eine Warteschlange Tabelle einfügen und diese Warteschlange auf einer regelmäßigen Basis verarbeitet haben. Dies kann durch die mit einer Transaktion in Ihrem ORM oder kicking off eine gespeicherte Prozedur, die beginnt eine Transaktion schreibt die Änderung und Prüfung / Warteschlange atomar erfolgen. (Vorsicht mit Verriegelung hier)

Wenn Sie sofortige Maßnahmen benötigen, schauen Sie sich einen Job Laichen in die Warteschlange zu löschen, nachdem Sie ein insert / update tun / Löschen auf dem Tisch und

Auch sicherstellen, dass Sie doppelt sind, um die Warteschlange einmal pro Minute oder so, falls die Überprüfung des Hintergrundprozess wurde nicht ordnungsgemäß gestartet. Wenn es ein Web-App und Sie wollen Laichen Threads vermeiden, könnten Sie mit einem Hintergrundprozess kommunizieren, um die Warteschlange zu klären.

Warum der Einsatz in einer gespeicherten Prozedur nicht implementieren, und tut, um die Geschäftslogik in dem Verfahren nach dem Einsatz? Was ist so kompliziert, darüber, dass es nicht in T-SQL geschrieben werden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top