2012-04-03 18 views
0

は、私は3つのテーブルを持っている非破壊更新は、SQL Serverで財務データをバージョニング2008

製品ラインテーブルのような...

(現実には多くが、これらの3つは、私が今心配する必要はものです)
ProductLineId (pk) 
Name 
Description 
Price 
Finance Event (FK) 

と金融イベントテーブルのような...

EventId (pk) 
Event Description 

と金融取引表のような...

TransactionId (pk) 
FinanceEventId (fk) 
LotsOfSageReferencesAndOtherForeignKeys 

売却が処理されると、財務イベントなどに基づいて取引記録が作成されます。

質問は次のとおりです。管理者の誰かが参加し、Financeイベントを変更した場合、主キーを保持したまま、イベントテーブルをバージョン管理する最善の方法を教えてください。トランザクションテーブルの

まず時系列データを扱うとき、あなたは実際の値を格納する必要がないだけでIDS:一般的に

+2

ファイナンスイベントを変更しないでください。 financeイベントにIsActiveフィールドを置き、人々が「イベントを変更する」ことを望むときは、古いものを無効にし、新しいものを作成するようにします。財務担当者は、監査の維持の重要性を理解するでしょう。 – AakashM

+0

私は既にアーカイブされたBITを追加して、自動インクリメントを強制終了しました。技術的には、トランザクションテーブルは、作成されたデータのうち、おそらく多くのバージョンを基に作成されたものを知る必要があります。 –

+0

監査表を作成し、DMLトリガーまたはDML文にOUTPUTディレクティブを追加することで、監査表を維持できます。私は 'OUTPUT'の例[here](http://stackoverflow.com/questions/9243389/sql-server-2005-knowing-new-record-is-inserted/9247000#9247000)を与えました。 –

答えて

2

あなたはいくつかの選択肢があります。次に、他のテーブルは新しいレコードの作成のためのルックアップテーブルとして機能しますが、トランザクションの時点で実際のデータが何であったかを常に知っています。これには、価格、顧客名などの経時的に変化するものが含まれます。現在の同等物が何であるかを調べる必要がある場合に備えて、idフィールドを格納する必要もあります。

また、ルックアップテーブルとトリガーによって更新を完全に禁止することができます。現在のレコードを無効にし、誰かが更新ステートメントを実行したときに新しいレコードを挿入します。これで、子テーブルには、レコードが作成された時点でアクティブだったレコードの値が保持されます。このシナリオで失うものは、現在の価値が何であるかを調べる能力です(顧客名や価格などの理由でそれをしたくない理由です)。

時間の経過とともに変更されても現在の情報を反映したい場合は、更新を許可しますが、監査または履歴テーブルはトリガーによって維持されます。必要に応じてその時点で価値があったものを再現することができます。誰が何時何時(時には法的要件)を変更したかを見ることができます。

あなたの現在の状況に合ったこれらのオプションのうち、あなただけが知っているものはどれですか?

関連する問題