0

このプログラムの既存の設計では、すべての変更がタイムスタンプ付きの変更ログ テーブルに書き込まれます。アイテムの属性の現在の状態を取得するためにJOIN、changelog テーブルに移動し、最新のタイムスタンプを持つ行を取得します。

これは現在の値を追跡するのに厄介な方法ですが、現時点ではこの変更ログの設定を簡単に変更することはできません。

changelog テーブルに「IsMostRecent」ビットを追加して、動作を少し変更するつもりです。MAX()これにより、集約や再帰シークとは対照的に、そのビットが設定された行を簡単に取得できます。

ビットが常に適切に設定されるようにするには、どのような戦略を採用しますか? または、ロギングテーブルの現在の使用に影響を与えない代替案はありますか?

現在、他のすべての行のビットをオフにしてから、最新の行のビットをオンにするトリガーアプローチを検討しています。INSERT

4

3 に答える 3

2

これは、最近挿入されたレコード (ID とエンティティ ID) をトリガーから起動するだけの "MostRecentRecorded" テーブルを作成することで行ったことがあります。

このために追加の列を用意するのは正しくありません。トランザクションや既存のエントリの読み取りで問題が発生する可能性があります。

これの最初のバージョンでは、次の単純なケースでした

BEGIN TRANSACTION 
    INSERT INTO simlog (entityid, logmessage) 
           VALUES     (11, 'test'); 

    UPDATE simlogmostrecent 
    SET    lastid = @@IDENTITY 
    WHERE  simlogentityid = 11 
COMMIT 

MostRecent テーブルに SimLog の各レコードのエントリがあることを確認することはクエリで実行できますが、ISTR では、SimLog が参照するエンティティの作成中にそれを行いました (上記は最初のバージョンの私の記憶です - 私は知りません)コードを手元に用意してください)。

ただし、単純なバージョンでは、デッドロックまたはトランザクションの失敗を引き起こす可能性があるため、複数のライターで問題が発生しました。そのため、トリガーに移動しました。

于 2013-10-16T16:45:07.713 に答える
1

編集:リチャードハリソンが答える前にこの回答を開始しました、約束:)

以下のような構造の別のテーブルをお勧めします。

VersionID  TableName   UniqueVal  LatestPrimaryKey
1          Orders      209        12548
2          Orders      210        12549
3          Orders      211        12605
4          Orders      212        10694

VersionID -- being the tables key
TableName -- just in case you want to roll out to multiple tables
UniqueVal -- is whatever groups multiple rows into a single item with history (eg Order Number or some other value)
LatestPrimaryKey -- is the identity key of the latest row you want to use.

次に、このテーブルに単純JOINにアクセスして、最新の行のみを返すことができます。

changelog テーブルに行を挿入するトリガーが既にある場合は、次のように変更できます。

INSERT INTO [MyChangelogTable]
(Primary, RowUpdateTime)
VALUES (@PrimaryKey, GETDATE())

-- Add onto it:

UPDATE [LatestRowTable]
SET [LatestPrimaryKey] = @PrimaryKey
WHERE [TableName] = 'Orders'
AND [UniqueVal] = @OrderNo

または、挿入をキャプチャするためのマージとしても実行できます。

于 2013-10-16T17:20:55.273 に答える
0

頭に浮かぶことの 1 つは、面倒な MAX() クエリなどをすべてバックグラウンドで実行するためのビューを作成することです。次に、ビューに対してクエリを実行できるはずです。この方法では、現在の設定を変更する必要はありません。すべての混乱を 1 か所に移動するだけです。

于 2013-10-16T16:47:19.890 に答える