Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Lösen Sie bei der Tabellenaktualisierung eine Aktion in meinem .NET-Code aus

Sie müssen ein paar Fragen stellen.

Möchten Sie Ihre Geschäftslogik auf DB-Ebene? Offensichtlich könnte ein DB-Trigger dies tun (einige Aktionen ausführen, wenn ein Wert geändert wird, auch wenn nur ein sehr spezifischer Wert).

Ich habe einige Systeme gesehen, die db-triggerlastig sind. Ihre „Logik“ ist tief und stark mit der db-Plattform verbunden. Das hat einige Vorteile, aber die meisten würden wahrscheinlich sagen, dass die Nachteile zu groß sind (Kopplung, fehlende Kapselung/Wiederverwendbarkeit).

Abhängig von dem, was Sie tun und Ihren Neigungen, könnten Sie:

  1. Stellen Sie sicher, dass alle DAO/BusinessFunctoin-Objekte Ihr „Ereignis“ object.function aufrufen zu tun, was Sie wollen, wenn eine bestimmte Wertänderung auftritt.

  2. Verwenden Sie einen Trigger, um Ihr „Ereignis“ object.function aufzurufen wenn eine bestimmte Wertänderung auftritt.

  3. Dein Trigger macht alles.

Ich persönlich würde zu Option 2 tendieren, wo Sie einen minimalen Auslöser haben (der einfach den Ereignisaufruf an Ihre object.function auslöst ), sodass Sie Ihre Datenbank nicht tief an Ihre Geschäftslogik koppeln.

Option 1 ist in Ordnung, kann aber ein bisschen umständlich sein, es sei denn, Sie haben eine sehr enge Gruppe von BF/DAOs, die mit diesem DB-Tabellenfeld sprechen, das Sie beobachten möchten.

Option 3 ist meiner Meinung nach die schlechteste Wahl, da Sie Logik an Ihre Datenbank koppeln und deren Zugriff auf Ihre Geschäftslogikschicht einschränken.

Vor diesem Hintergrund finden Sie hier einige Informationen, wie Sie dies mit Option 2 erreichen können:

Verwenden Sie dieses Beispiel von MSDN:http://msdn.microsoft.com/en -us/library/938d9dz2.aspx .

Dies zeigt, wie ein Trigger ausgeführt und ein CLR-Objekt in einem Projekt aufgerufen wird.

Tatsächlich erstellen Sie in Ihrem Projekt einen Trigger und lassen ihn Ihre Klasse aufrufen.

Beachten Sie die Zeile:[SqlTrigger(Name="UserNameAudit", Target="Users", Event="FOR INSERT")]

Dies definiert, wann der Code ausgelöst wird, dann können Sie innerhalb des Codes Ihre Einschränkung überprüfen und dann den Rest der Methode auslösen (oder nicht) oder eine andere object.method aufrufen wie benötigt.

Der Hauptunterschied zwischen dem direkten Zugriff auf die Datenbank und dem Hinzufügen eines Triggers besteht darin, dass Sie dadurch Zugriff auf alle Objekte in Ihrem Projekt erhalten, wenn sie zusammen bereitgestellt werden.