Geschichte Tabellen Vor-, Nachteile und gotchas - mit Trigger, sproc oder auf Anwendungsebene [geschlossen]

StackOverflow https://stackoverflow.com/questions/1250507

Frage

Ich spiele zur Zeit mit der Idee, Geschichte Tabellen für einige meiner Tabellen in meiner Datenbank um. Im Prinzip habe ich die Haupttabelle und eine Kopie dieser Tabelle mit einem Änderungsdatum und eine Aktionsspalte zu speichern, welche Maßnahmen wurde zB Aktualisierung vorgeformten, Löschen und Einfügen.

Bisher kann ich denke an drei verschiedenen Stellen, die Ihnen die Geschichte Tabelle Arbeit tun können.

  • auf der Haupttabelle Auslöser für Update, einfügen und löschen. (Datenbank)
  • Stored Procedures. (Datenbank)
  • Anwendungsschicht. (Anwendung)

Meine Hauptfrage ist, was sind die Vorteile, Nachteile und gotchas von in jeder dieser Schichten, die Arbeit zu tun.

Ein Vorteil ich den Auslöser Art und Weise denken kann ist, dass die Integrität immer, egal gehalten wird, welches Programm ist auf der Oberseite der Datenbank implmentated.

War es hilfreich?

Lösung

Ich würde es so sagen:

  • Gespeicherte Procs: sie sind, wenn Sie die Tabelle direkt ändern umgangen. Sicherheit auf der Datenbank kann steuern, diese
  • Anwendung: gleiche Sache. Auch wenn Sie mehrere Anwendungen, die möglicherweise in verschiedenen Sprachen, muss es in jedem Stapel implementiert werden, die etwas redundant ist; und
  • Trigger: für die Anwendung transparent und werden alle Änderungen erfassen. Dies ist meine bevorzugte Methode.

Andere Tipps

Trigger sind der schnellste und einfachste Weg, einfache Geschichte zu erreichen. Die folgenden Informationen übernimmt ein komplexeres Beispiel, wo die Geschichte Verarbeitung einige Geschäftsregeln enthalten kann und erfordern Protokollinformationen nicht in der Tabelle gefunden verfolgt.

Für diejenigen, die denken, dass Auslöser sind sicherer als sprocs, weil sie nicht umgangen werden, kann ich sie daran erinnern, dass sie die folgende Annahme machen:

!

) Rechte vorhanden ist, den Stopp-Benutzer von DISABLE TRIGGER Ausführung [aber dann existieren Berechtigungen könnten auch alle Zugriff auf die Datenbank zu beschränken, mit Ausnahme auf sprocs auszuführen, die für Enterprise-Anwendungen ein gemeinsames Muster ist] - daher muss man die richtigen Berechtigungen übernehmen und daher sprocs gleich Auslöser in Bezug auf die Sicherheit und die Fähigkeit, umgangen werden

!) Auf der Datenbank Abhängig kann es möglich sein Update-Anweisungen auszuführen, die Trigger nicht ausgelöst. Ich könnte den Vorteil des Wissens von verschachtelten Trigger-Ausführung Tiefe nehmen einen Trigger zu umgehen. Der einzig sichere Lösung umfasst die Sicherheit in der Datenbank und die Beschränkung des Zugangs zu Daten nur zugelassene Mechanismen -. Ob diese Trigger, sprocs oder Datenzugriffsebenen sein

Ich denke, die Entscheidungen klar sind hier. Wenn die Daten von mehreren Anwendungen zugegriffen wird dann wollen Sie die Geschichte von der kleinsten gemeinsamen Schicht steuern und dies wird die Datenbank bedeuten.

Nach der obigen Logik, die Wahl der Trigger oder gespeicherte Prozeduren hängt wiederum davon ab, ob die gespeicherte Prozedur die kleinste gemeinsame Schicht ist. Sie sollten die sproc über den Auslöser bevorzugen, wie Sie die Leistung steuern können, und die Nebenwirkungen besser und der Code ist leichter zu pflegen.

Trigger sind akzeptabel, aber versuchen, sicherzustellen, dass Sie Sperren nicht erhöhen, indem sie Daten außerhalb der Tabellen aktualisiert Lesen wird. Limit löst in den Log-Tabellen einfügt, melden Sie sich nur das, was Sie benötigen.

Wenn die Anwendung eine gemeinsame logische Zugriffsschicht verwendet, und es ist unwahrscheinlich, dass diese im Laufe der Zeit ändern, würde ich es vorziehen würde die Logik hier zu implementieren. Verwenden Sie eine Zuständigkeitskette-Muster und eine Plug-in-Architektur, treiben diese von Dependency Injection für alle Arten der Verarbeitung in Ihnen Geschichte Modul zu ermöglichen, einschließlich der Protokollierung völlig verschiedene Arten von Technologie, verschiedene Datenbanken, eine Geschichte Service oder irgendetwas anderes, dass Sie vorstellen kann.

Haben Sie den Auslöser basierten Ansatz seit Jahren verwendet und es hat funktioniert auf jeden Fall gut für uns, aber dann haben Sie die folgenden Punkte nachzudenken über:

  1. Trigger für eine stark frequentierte (sagen wir, ein Multi-Tenant-SaaS-basierte Anwendung) könnte extrem teuer sein

  2. In einigen Szenarien einige Felder können redundante erhalten. Trigger sind nur gut, wenn man kristallklar auf den Feldern protokolliert werden; obwohl eine Anwendung verwendet, könnte man eine Interceptor Schicht haben, die Sie bestimmte Felder auf der „Konfiguration“ auf der Grundlage log könnte helfen; wenn auch mit seinem eigenen Anteil der Gemeinkosten

  3. Ohne ausreichende Datenbanksteuerung, könnte eine Person, die Auslöser leicht deaktivieren, um die Daten zu ändern und die Auslöser zu ermöglichen; alle ohne Alarme

  4. Anhebung
  5. Bei Web-Anwendungen, bei denen die Verbindungen aus einem Pool eingerichtet sind, die tatsächlichen Benutzer-Tracking, die die Änderungen vorgenommen langwierig sein können. Eine mögliche Lösung wäre, das „EditedBy“ Feld in jeder Transaktionstabelle zu haben.

An einem späten aber es fügt einige weitere Optionen, die berücksichtigt werden können.

Change Data Capture: Diese Funktion ist in SQL Server 2008 R2 + zur Verfügung, aber nur in der Enterprise Edition. Es erlaubt Ihnen, Tabellen, die Sie verfolgen und SQL Server auszuwählen wird die Arbeit für Sie tun. Es funktioniert durch das Transaktionsprotokoll zu lesen und bevölkern Geschichte Tabellen mit Daten.

Lese Transaktionsprotokoll: Wenn Datenbank in voller Recovery-Modus ist dann Transaktionsprotokoll lesen und Details über fast Transaktionen werden kann gefunden werden können.

Nachteil ist, dass diese nicht standardmäßig unterstützt wird. Die Optionen sind auf Transaktionsprotokoll mit undokumentierte Funktionen wie fn_dblog oder Tools von Drittanbietern wie ApexSQL Log zu lesen.

Trigger: funktioniert gut für kleine Anzahl von Tabellen, in denen es nicht zu viele Auslöser zu verwalten. Wenn Sie eine Menge von Tabellen haben Sie überwachen wollen, dann sollten Sie einige Drittanbieter-Tool für diese in Betracht ziehen.

All diese Arbeit auf Datenbankebene und sind vollständig transparent Anwendung.

Trigger sind die einzige zuverlässige Methode, um Änderungen zu erfassen. Wenn Sie es in Stored Procs oder die App tun, können Sie immer in und SQL eine Änderung weg, die Sie nicht ein Protokoll (inadvertantly) haben. Natürlich jemand, der kein Protokoll verlassen will kann Auslöser deaktivieren. Aber Sie lieber jemanden zwingen, die Protokollierung zu deaktivieren als hoffen, dass sie sich daran erinnern, es zu schließen.

In der Regel, wenn Sie die Anwendungsschicht wählen, können Sie Ihre App-Code entwerfen die Protokollierung in einem einzigen Punkt zu tun, dass consistenly alle historischen Tisch behandelt. anders Auslöser sind ein komplizierter Ansatz zu halten, weil sie (in Abhängigkeit von der db-Technologie) werden für jede Tabelle repliziert: bei hundert von Tabellen die Menge an Code für den Trigger coud ein Problem sein.

Wenn Sie eine Support-Organisation, die den Code beibehalten werden Sie jetzt schreiben, und Sie wissen nicht, wer den Code halten wird (typisch für Großindustrie) Sie können nicht davon ausgehen, die das Qualifikationsniveau der Person, die tun fix auf Ihrer Anwendung, in diesem Fall ist es besser, meiner Meinung nach der historischen Tabelle Arbeitsprinzip so einfach wie möglich zu machen, und die Anwendungsschicht ist wahrscheinlich der beste Ort für diesen Zweck.

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