0

下記のトリガーを使用して、監査の生産テーブルまたは変更ログテーブルの変更を追跡しています。私の問題は、追跡テーブルのフィールド名がtable1のフィールド名と異なることです。値は同じですが、列の名前が異なります。

問題は、あるフィールド名の値を取得して、それを追跡テーブルの別の名前のフィールドに挿入するために、トリガーの構文をどのように変更する必要があるかということです。

ありとあらゆる助けや提案をありがとう。

{{

CREATE OR REPLACE TRIGGER track_change_trg
AFTER INSERT OR UPDATE OR DELETE
ON table1
FOR EACH ROW
BEGIN
 
IF INSERTING THEN
    INSERT INTO tracking table  VALUES 
    (:new.pname, :new.p_id, :new.p_type, :new.t1name,
    'INSERTED', SYSDATE);
 
ESLIF UPDATING THEN
    INSERT INTO tracking table  VALUES 
    (:new.pname, :new.p_id, :new.p_type, :new.t1name,
    'UPDATED', SYSDATE);
     
ELSIF DELETING THEN
    INSERT INTO tracking table VALUES 
    (:old.pname, :old.p_id, :old.p_type, :old.t1name,
    'DELETED', SYSDATE);
     
    END IF;
END;
/

}

4

1 に答える 1

0

メインテーブルと監査テーブルで列名が異なっていても違いはありません。なぜそれが問題だと思うのかわかりません。エラーを表示すると、テーブルの定義とともに問題を明確にするのに役立つ可能性があります。スローされるのをすぐに確認できる唯一のエラーは、スペースがtracking table文字起こしの間違いであると想定して、列の順序が一致せず、列に間違ったタイプまたはサイズのデータ​​を入力している場合です。しかし、あなたが見ているものを推測するのは難しいです。

通常は列名をリストするステートメントのオプションの列セクションを省略しました。列名の明示的なリストがない場合、値は、またはでinsert示されているように、ターゲットテーブルの列の順序に基づいて割り当てられます。あいまいさを避けるために、列をリストすることをお勧めします。したがって、テーブル定義が変更された場合(たとえば、列が追加されたために十分な値がない場合)、または別の環境で列の順序が異なる場合(これは、適切なソース管理の下ではおそらく発生しないはずです)、問題はありません。 )。些細な間違いを見つけるのも簡単です。user_tab_columns.column_iddescribe

とにかく、挿入するテーブルの列名をリストするだけです。

INSERT INTO tracking_table (x_name, x_id, x_type, x_t1name, x_action, x_when)
VALUES (:new.pname, :new.p_id, :new.p_type, :new.t1name, 'INSERTED', SYSDATE);

x_name...などをからの実際の列名に置き換えますtracking_table

于 2012-11-02T15:36:25.540 に答える