0

OpenEdge データベースのテーブルに行バージョン戦略を実装しようとしています。

私が思いついた簡単な解決策は、iRowVersion各テーブルに整数フィールドを追加し、次のように書き込みトリガーを検証してフィールドをインクリメントすることです。

TRIGGER PROCEDURE FOR WRITE OF Customer OLD BUFFER oldCustomer.

IF Customer.iRowVersion < oldCustomer.iRowVersion THEN
  RETURN ERROR "RowVersion Out Of Date".

ASSIGN Customer.iRowVersion = Customer.iRowVersion + 1.

これにより、同時変更が上書きされるのを防ぐことができますが、行ごとに 1 つずつインクリメントするのが最適かどうかはわかりません。SQL ROWVERSION はデータベース全体でインクリメントされ、そのアプローチをエミュレートするには、代わりにシーケンスを使用します。

ASSIGN Customer.iRowVersion = NEXT-VALUE(rowVersionSequence).

多くのレコードが変更される大規模なデータベースでは、これによりシーケンスが非常に急速に増加する可能性があります。テーブルごとにシーケンスを持つことでこれを削減できますが、やり過ぎのように思われ、+1 アプローチによりシンプルに保たれます。

質問を明確にするために-行の最後のバージョンに基づいて行のバージョン番号をインクリメントする方が良いでしょうか、またはSQLのようなアプローチを採用して、すべての行バージョンをデータベースに固有にする必要があります。

さらに、SQL スタイルのルートを下る場合、作成トリガーは最初の行バージョンを割り当てる必要がありますか? (それ以外の場合、変更されていないすべての新しいレコードは 0 で初期化されます)。

4

1 に答える 1