1

私はいくつかのテーブルを持っており、それらに変更が加えられたとき、変更が何であったか、誰が変更を加えたかをログに記録したいと思います。Postgresql 9.2

CREATE TABLE unitsref (
unitsrefid serial primary key,
units varchar,
unitname varchar,
inuse boolean,
systemuse varchar,
keynotes integer,
linkid integer
);

OLDを使用するためのベストプラクティスはありますか。*新しいものとは異なります。*?

CREATE TRIGGER log_unitsref
    AFTER UPDATE ON unitsref
    FOR EACH ROW
    WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_unitsref();

私は3つの分野にのみ本当に興味があります:

units varchar,
unitname varchar,
inuse boolean,

これらの変更を次のフィールドを含むテーブルイベントログに記録したいと思います。

recordtype varchar,
recordkey varchar,
changetype varchar,
personid integer,
changedate date,
changetime time,
changefrom varchar,
changeto varchar,

これを行うための関数を書くための最良の構文は何ですか?進行中のOpenedgeは私が書くだろう

create  EventLog.
assign  EventLog.PersonId    = glb-Personid
        EventLog.RecordType  = "UnitsRef"
        EventLog.RecordKey   = UnitsRef.Units
        EventLog.ChangeType  = "Create"
        EventLog.changeFrom  = ""
        EventLog.changeTo    = ""
        EventLog.changeDate  = today
        EventLog.changeTime  = time

しかし、Postgresqlでの最良の方法はわかりません

4

1 に答える 1

4

私は3つの分野にのみ本当に興味があります

次に、これらのフィールドに変更を加えた後にのみトリガーを呼び出す方が効率的です。


CREATE TRIGGER log_unitsref
AFTER UPDATE OF units, unitname, inuse
ON unitsref
FOR EACH ROW
WHEN (OLD.units, OLD.unitname, OLD.inuse) IS DISTINCT FROM
     (NEW.units, NEW.unitname, NEW.inuse)
EXECUTE PROCEDURE log_unitsref();

私はマニュアルCREATE TRIGGERを引用します:

UPDATE OF..。

リストされた列の少なくとも1つがUPDATEコマンドのターゲットとして言及されている場合にのみ、トリガーが起動します。

WHEN..。

トリガー関数が実際に実行されるかどうかを決定するブール式。

これらの2つの要素は密接に関連していますが、相互に排他的でも冗長でもないことに注意してください。

  • 関心のある列が含まれていない場合は、トリガーをまったく起動しない方がはるかに安価です。

  • 対象の列が実際に変更されていない場合は、トリガー関数を実行しない方がはるかに安価です。

ここまたはここに関連する回答...

于 2012-10-10T21:31:19.813 に答える