私の仕事は、プログラマーがデータベースでトリガーを作成、変更、置換、または削除したときに起動するトリガーを作成することです。テーブルと同様に作成した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 のおかげで) 至りましたが、これを自動的に行うことを夢見ています。