2012-04-03 6 views
0

Ich habe drei Tabellen (viele in Wirklichkeit aber diese drei sind die, die ich habe jetzt gerade über Sorgen zu machen)Zerstörungs Updates, Versionierung Finanzdaten in SQL Server 2008

Eine Produktlinie Tisch wie ...

ProductLineId (pk) 
Name 
Description 
Price 
Finance Event (FK) 

und eine Finanzereignistabelle wie ...

EventId (pk) 
Event Description 

und ein Finanztransaktions Tisch wie ...

Wenn ein Verkauf verarbeitet wird, erzeugt Transaktionsaufzeichnungen auf der Grundlage der Finanz Veranstaltungen usw.

Die Frage ist; Wenn dann jemand im Admin eingeht und das Finance-Ereignis ändert, was die beste Möglichkeit ist, die Ereignistabelle zu versionieren, während der Primärschlüssel erhalten bleibt.

+2

Lassen Sie Finanztermine nicht ändern. Setzen Sie ein 'IsActive'-Feld auf das Finanzereignis, und wenn die Leute "ein Ereignis ändern" wollen, machen Sie es so, dass das alte deaktiviert und ein neues erstellt wird. Finanz-y-Leute werden verstehen, wie wichtig es ist, ein Audit beizubehalten. – AakashM

+0

Ich habe bereits ein Archived BIT hinzugefügt und das Auto-Inkrement beendet. Technisch gesehen müsste die Transaktionstabelle wissen, auf welcher der, möglicherweise vielen, Versionen der Daten basierend darauf basiert. –

+0

Sie können eine Audit-Tabelle erstellen und sie entweder über DML-Trigger verwalten oder indem Sie die Anweisung 'OUTPUT' zu Ihren DML-Anweisungen hinzufügen. Ich gab ein 'OUTPUT' Beispiel [hier] (http://stackoverflow.com/questions/9243389/sql-server-2005-knowing-new-record-is-inserted/9247000#9247000). –

Antwort

2

In der Regel haben Sie mehrere Möglichkeiten:

Erst wenn mit Zeitdaten handelt, sollten Sie die aktuellen Werte speichern nicht nur die IDs in der Transaktionstabelle. Dann dienen die anderen Tabellen als Nachschlagetabellen für die Erstellung neuer Datensätze, aber Sie wissen immer, was die realen Daten zum Zeitpunkt der Transaktionen waren. Dazu gehören Dinge, die sich im Laufe der Zeit ändern, wie Preis, Kundenname usw. Beachten Sie das Außerdem müssen Sie das ID-Feld speichern, falls Sie nachsehen müssen, was das aktuelle Äquivalent ist.

Oder Sie können Updates vollständig in Ihren Lookup-Tabellen verbieten und durch einen Trigger den aktuellen Datensatz deaktivieren und einen neuen einfügen, wenn jemand eine Update-Anweisung ausführt. Ihre untergeordneten Tabellen enthalten nun die Werte des Datensatzes, der zum Zeitpunkt der Datensatzerstellung aktiv war. Was Sie in diesem Szenario verlieren, ist die Fähigkeit, nachzuschlagen, was der aktuelle Wert wäre (weshalb Sie es vielleicht nicht für etwas wie Kundenname oder Preis tun möchten).

Für Daten, bei denen es nicht wichtig ist, ob sie sich im Laufe der Zeit ändern, aber die aktuellen Informationen widerspiegeln möchten, lassen Sie die Aktualisierungen zu, lassen Sie jedoch eine Audit- oder Verlaufstabelle durch Trigger aufrechterhalten; So können Sie jederzeit nachbilden, was der Wert zu der Zeit war, oder sehen, wer was wann geändert hat (manchmal eine gesetzliche Anforderung).

Welche dieser Optionen passt zu Ihrer aktuellen Situation, nur Sie würden es wissen.