2016-12-06 7 views
0

テーブルの特定の列が更新を受け取った場合に目を離したい場合は、その変更を監査テーブルに挿入します。 ANY列が変更された場合、または列が特定の値に変更された場合、何らかの理由でold.column_x!= new.column_xを比較しようとしたときに更新を記録していないときに、このトリガーを書き込むことができました。私はコードのいくつかのバリエーションを試しましたが、これは私が試みた最新のものです。PLSQLのトリガーは、監査テーブルの更新をColumn_Xの更新の場合に記録します。

CREATE OR REPLACE TRIGGER audit_table 
AFTER UPDATE ON table_1 
FOR EACH ROW 
WHEN (new.column_x != old.column_x) 
BEGIN 
INSERT INTO audit_table (
    column_1, 
    old_column_x, 
    new_column_x, 
    auditdtm 
    ) 
VALUES (
    :old.column_1, 
    :old.column_x, 
    :new.column_x, 
    SYSDATE); 
END 
+0

いいえ、エラーなしでコンパイルされます。 WHEN行を[WHEN(new.column_x IS NULL)]に変更すると、トリガーが動作し、レコードのその列をNULLにすると、更新が記録されます。 – sandsawks

+0

column_xがnullになると思いますか? – GurV

+0

はい、私のアプリケーションの関数は、その列をNULLまたは01/01/3000に設定します。 – sandsawks

答えて

0

ありがとうGurwinder Singh、私はこれがあなたに試してみたいと思っていると思います。これは、私のデータが常にNULLステータスに/から行くことを考慮して動作しますが、おそらくそれを書き込むためのよりきれいな方法があります。

CREATE OR REPLACE TRIGGER audit_table 
AFTER UPDATE ON table_1 
FOR EACH ROW 
WHEN ((new.column_x IS NULL AND old.column_x IS NOT NULL) OR (new.column_x IS NOT NULL AND old.column_x IS NULL)) 
BEGIN 
INSERT INTO audit_table (
    column_1, 
    old_column_x, 
    new_column_x, 
    auditdtm 
    ) 
VALUES (
    :old.column_1, 
    :old.column_x, 
    :new.column_x, 
    SYSDATE); 
END 
関連する問題