監査ログを保持するテーブルにトリガーを作成しました。新しいエントリが挿入されたら、新しいレコードをテーブル内の最新の既存のレコード (一致する ID) と列ごとに比較したいと考えています。1 つの列の値が変更された場合、insert ステートメントを別のテーブルに実行したいと考えています。次の PL SQL プロシージャを作成しました。
CREATE OR REPLACE
TRIGGER PROJECT_BASELINE_ATTR_AUD_BI BEFORE INSERT
ON PROJECT_BASELINE_ATTR_AUD
FOR EACH ROW
DECLARE
tab_name constant varchar2(32) := 'PROJECT_BASELINE_ATTR_AUD';
col_name varchar2(32);
v_latest_row PROJECT_BASELINE_ATTR_AUD%rowtype;
BEGIN
-- get the record to compare with
EXECUTE IMMEDIATE 'select * from '||tab_name||
' where rev = (select max(rev) from '||tab_name||' where id = '|| :new.ID ||')' into v_latest_row;
FOR x IN (SELECT DISTINCT(COLUMN_NAME) FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = upper(tab_name))
LOOP
BEGIN
col_name := x.column_name;
-- do insert if the values are unequal
-- IF :new.col_name <> v_latest_row.col_name
-- INSERT INTO AUD_CHANGE_LOG VALUES (AUD_CHANGE_LOG_ID_SEQ.nextVal, :new.ID, :new.REV, tab_name, col_name);
END;
END LOOP;
END;
私はこれを実際の列名で実装できることを知っています。
IF :new.FOO <> v_latest_row.FOO
IF :new.BAR <> v_latest_row.BAR
...
しかし、そうでなければカスケードする場合、これは長くなります。何か案は?