私の仕事は、プログラマーがデータベースでトリガーを作成、変更、置換、または削除したときに起動するトリガーを作成することです。テーブルと同様に作成した2つのデータテーブルに変更を記録し、それらに変更をSYS.trigger$
加えたユーザーに関する追加情報を追加する必要があります。単純にするために、 GalaktikaまたはGalaxyという名前の ERP システムの既存の監査機能からロギングの原則をコピーしました。しかし、私は有名な問題に遭遇し、ORA-04089: no one can create triggers on system tables
それに固執しました。
現在、データベースのルールに従ってトリガーを穏やかに変更する方法を探しています。元のコードは次のとおりです。
CREATE OR REPLACE TRIGGER MRK_AlTrigger$
BEFORE DELETE OR INSERT OR UPDATE
ON SYS.TRIGGER$
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
Log_Rec MRK_TRIGGERS_LOG_HEADER.NREC%TYPE;
BEGIN
INSERT INTO MRK_TRIGGERS_LOG_HEADER (DATEOFCHANGE,
USERCODE,
OPERATION,
OBJ#)
VALUES (
SYSDATE,
UID,
CASE
WHEN INSERTING THEN 0
WHEN UPDATING THEN 1
WHEN DELETING THEN 2
END,
CASE
WHEN INSERTING OR UPDATING THEN :new.OBJ#
ELSE :old.OBJ#
END)
RETURNING NRec
INTO Log_Rec;
IF INSERTING OR UPDATING
THEN
INSERT INTO MRK_TRIGGERS_LOG_SPECIF (LOGLINK,
OBJ#,
TYPE#,
UPDATE$,
INSERT$,
DELETE$,
BASEOBJECT,
REFOLDNAME,
REFNEWNAME,
DEFINITION,
WHENCLAUSE,
ACTION#,
ACTIONSIZE,
ENABLED,
PROPERTY,
SYS_EVTS,
NTTRIGCOL,
NTTRIGATT,
REFPRTNAME,
ACTIONLINENO)
VALUES (Log_Rec,
:new.OBJ#,
:new.TYPE#,
:new.UPDATE$,
:new.INSERT$,
:new.DELETE$,
:new.BASEOBJECT,
:new.REFOLDNAME,
:new.REFNEWNAME,
:new.DEFINITION,
:new.WHENCLAUSE,
:new.ACTION#,
:new.ACTIONSIZE,
:new.ENABLED,
:new.PROPERTY,
:new.SYS_EVTS,
:new.NTTRIGCOL,
:new.NTTRIGATT,
:new.REFPRTNAME,
:new.ACTIONLINENO);
END IF;
EXCEPTION
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
RAISE;
END MRK_AlTrigger$;
/
DDLも提供できますがMRK_TRIGGERS_LOG_HEADER
、MRK_TRIGGERS_LOG_SPECIF
必要ないと思います。要約すると、ここに私が持っている質問があります:
- 上記のソースを構文に変更するにはどうすればよい
CREATE OR REPLACE TRIGGER ON DATABASE
ですか? - これを行う車輪を発明していますか?そのようなことを行う一般的な方法はありますか?(一部のテーブルにはロギング オプションがあることに気付きましたが、デバッグ目的であると考えてください)
どんな助けでも大歓迎です!
UPD:ソース管理に異なるバージョンのコードを保持し、DB にリビジョン番号のみを記録する方がよいという決定に (APC のおかげで) 至りましたが、これを自動的に行うことを夢見ています。