0

トリガーを起動すると、SQLサーバーで2つの一時テーブルが作成されます。1 つは、挿入または更新が発生したトリガーが属する元のテーブルの行を含む挿入テーブルです (:NEW 値が含まれます)。もう 1 つは削除されたテーブルで、同様に OLD 値が含まれています。

SQL Server では、これらのテーブルをトリガー内で使用して、OLD 値と NEW 値に関する情報を得ることができます。(簡単なサンプルを作成するには、トリガー内で「SELECT * FROM INSERTED」を作成して、更新が行われたすべての行または挿入の場合に挿入されたすべての行を選択することができます)。

これの素晴らしい点は、:NEW.value と :OLD.value を動的に呼び出すことが可能になることです。私の場合のように、同じトリガーを複数のテーブル (互いに異なる) で使用したい場合です。

Oracle pl sqlに似たものはありますか?

4

2 に答える 2

1

テーブルの監査に取り組んでいると思います。挿入、更新、削除の監査のトリガーを見つけてください

EDIT:phantom監査テーブルに挿入する前に、各列の新しい値と古い値を確認する必要があることを示唆しています。この方法で、どの列の値が変更されたかを達成できます。同じレコードの。

私の考えは、監査テーブルに更新/削除/挿入する前に、同じレコードのレプリカを作成することです.そして、変更が必要な場合は、source_action/source_rowidに基づいて監査テーブルの前のレコードと比較します

    CREATE TABLE table_for_audit
    (
       col1       NUMBER,
       col2       NUMBER,
       col3       NUMBER,
       cre_date   DATE,
       cre_user   VARCHAR2 (200)
    );

    CREATE TABLE audit_table
    (
       col1            NUMBER,
       col2            NUMBER,
       col3            NUMBER,
       cre_date        DATE,
       cre_user        VARCHAR2 (200),
       source_action   VARCHAR2 (1),
       source_rowid
    );

    CREATE OR REPLACE TRIGGER trg_table_audit
       BEFORE INSERT OR UPDATE OR DELETE
       ON table_for_audit
       REFERENCING NEW AS NEW OLD AS OLD
       FOR EACH ROW
    DECLARE
       v_source_action   VARCHAR2 (1);
    BEGIN
       IF INSERTING
       THEN
          v_source_action := 'I';
          v_source_rowid := :NEW.ROWID;
       ELSIF UPDATING
       THEN
          v_source_action := 'U';
          v_source_rowid := :OLD.ROWID;
       ELSIF DELETING
       THEN
          v_source_action := 'D';
          v_source_rowid := :OLD.ROWID;
       END IF;


       IF INSERTING OR UPDATING
       THEN
          INSERT INTO audit_table (col1,
                                   col2,
                                   col3,
                                   cre_date,
                                   cre_user,
                                   source_action,
                                   source_rowid)
               VALUES (:NEW.col1,
                       :NEW.col2,
                       :NEW.col3,
                       SYSDATE,
                       SYS_CONTEXT ('USERENV', 'CURRENT_USER'),
                       v_source_action,
                       v_source_rowid);
       ELSIF DELETING
       THEN
          INSERT INTO audit_table (col1,
                                   col2,
                                   col3,
                                   cre_date,
                                   cre_user,
                                   source_action,
                                   source_rowid)
               VALUES (:OLD.col1,
                       :OLD.col2,
                       :OLD.col3,
                       SYSDATE,
                       SYS_CONTEXT ('USERENV', 'CURRENT_USER'),
                       v_source_action,
                       v_source_rowid);
       END IF;
    END;
    /

私の理解が間違っている場合は修正してください。ありがとう

于 2013-03-26T12:56:42.340 に答える
0

referencingトリガーに句を使用したい。公式の図はこちらにありますが、こちらのページの方が説明がわかりやすいと思います。

基本的に、次のようにトリガーを作成します。

CREATE OR REPlACE TRIGGER trigger_name
AFTER DELETE OR INSERT OR UPDATE
ON table_name
REFERENCING OLD AS oldAlias AND NEW AS newAlias
...

これで、トリガー前とトリガー後の値を:oldAlias.column_nameおよびとして参照できます:newAlias.column_name

たとえば、これは、personal_type 値が 1 から 2 に更新されたかどうかを確認します。

IF :oldAlias.personnel_type = 1 AND :newAlias.personnel_type = 2 THEN 
  -- do something
END IF ;

私が収集できることから、複数のテーブルを監視するための単一のトリガーを作成したいようです。Oracleトリガーはそのようには機能しません。監視する各テーブルには、独自の個別のトリガーが必要です。ただし、次のいずれかを実行できます。

  • トリガーからプロシージャ/関数を呼び出し、問題の値を渡します (これを行う再帰的/変更トリガーでスタックしないように注意してください)
  • 独自のトリガーを使用して別の監査テーブルを作成します。ソース テーブルが更新されたら、変更/データ (テーブル名や列など) を監査テーブルにプッシュします。次に、監査テーブルのトリガーは、必要に応じてそれを処理できます。
于 2013-03-26T12:56:36.687 に答える