2016-12-12 8 views
0

私はpostgresqlのトリガを使用して監査テーブルを作成します。postgresqlを使用した監査テーブル

私の例:

CREATE OR REPLACE FUNCTION fn_editorial_audit() 
RETURNS trigger AS $$ 
BEGIN 
    IF (TG_OP = 'DELETE') THEN 
    INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp") 
      VALUES (OLD, OLD, 'D', USER, now()); 
    RETURN OLD; 
    ELSIF (TG_OP = 'UPDATE') THEN 
    INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp") 
      VALUES (NEW, NEW, 'U', USER, now()); 
    RETURN NEW; 
    ELSIF (TG_OP = 'INSERT') THEN 
    INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp") 
      VALUES (NEW, NEW, 'I', USER, now()); 
    RETURN NEW; 
    END IF; 
    RETURN NULL; 
END; 

$$ LANGUAGE 'plpgsql'; ; 

CREATE TRIGGER tb_editorial_tg_audit AFTER INSERT OR UPDATE OR DELETE 
ON tb_edit FOR EACH ROW EXECUTE PROCEDURE fn_edit_audit(); 

しかし、私は別の何かをしたい:私はそれが存在しない場合は、元の編集テーブルのデータとのデータのテーブルに行を挿入したい 、それ監査テーブル内にすでに存在する場合は監査テーブルで更新されます。それぞれの状態ではなく、常に最後の状態を保持する。

ありがとうございます!

+0

なぜ、実際のテーブル自体にタイムスタンプを格納しないのですか? –

+0

どうすればいいですか? –

答えて

0

なぜ、実際のテーブル自体にタイムスタンプを格納しないのはなぜですか?

CREATE TABLE AS (... myAuditTimestamp timestamp); 

か、そして、TRIGGERタイムスタンプフィールドUPDATEにを使用して、既存のテーブル

ALTER TABLE foo ADD COLUMN (myAuditTimestamp timestamp); 

に列を追加します。次に、実際に行にあるので、監査フィールドは常に最新の行データです。あなたはこのルートを下る場合も、あなたがSPImoddatetime()

F.34.5を使用することができ、PROCEDUREトリガー呼び出しを作成する必要はありません。 moddatetime - 最終変更時刻をトラッキングするための関数

moddatetime()は、現在の時刻をタイムスタンプフィールドに格納するトリガーです()。これは、テーブル内の特定の行の最終変更時刻を追跡する場合に便利です。使用するには、この関数を使用してBEFORE UPDATEトリガーを作成します。単一のトリガ引数を指定します。変更する列の名前です。列はタイムスタンプタイプまたはタイムゾーン付きタイムスタンプでなければなりません。 moddatetime.exampleに例があります。

+0

私はトリガーで行う必要があります –

+0

これはトリガーとです。 –

関連する問題