Iのようないくつかの追加のデータを別のテーブルに変更された行の古いバージョンを挿入するトリガーによって、いくつかのテーブルで行われた変更ログに記録する必要がありますpostgreSQLトリガにデータを渡すことはできますか?
-whenを行った-whichアクションこのアクションが実行されたが
-by who。
私は最後の要件に問題があります。 JDBCでjavaのどこかでSQLを実行しています。私はどうにかして、変更された行のすべての古いバージョンが格納されるpostgresテーブルに、変数に格納されているログに記録されたユーザーIDを渡す必要があります。
それは可能ですか? これは愚かな質問かもしれませんが、私は必死にそのようなデータをJavaに挿入することを避けようとしています。トリガーは私のためにいくつかの仕事をしましたが、私が必要とするものではありません。
以下実証コード(私はセキュリティ上の理由のためにいくつかのコードを切り取ってきました):
「ノート」の表:「ノート」テーブルで変更のすべての行の古いバージョンを格納
CREATE TABLE my_database.notes
(
pk serial NOT NULL,
client_pk integer,
description text,
CONSTRAINT notes_pkey PRIMARY KEY (pk)
)
表: "ノート" テーブルの
CREATE TABLE my_database_log.notes_log
(
pk serial NOT NULL,
note_pk integer,
client_pk integer,
description text,
who_changed integer DEFAULT 0, -- how to fill in this field?
action_date timestamp without time zone DEFAULT now(), --when action was performed
action character varying, --which action was performed
CONSTRAINT notes_log_pkey PRIMARY KEY (pk)
)
トリガー:
CREATE TRIGGER after_insert_or_update_note_trigger
AFTER INSERT OR UPDATE
ON database.notes
FOR EACH ROW
EXECUTE PROCEDURE my_database.notes_new_row_log();
トリガーによって実行手順:
CREATE OR REPLACE FUNCTION my_database.notes_new_row_log()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO my_database_log.notes_log(
note_pk, client_pk, description, action)
VALUES (
NEW.pk, NEW.client_pk, NEW.description, TG_OP);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION my_database.notes_new_row_log()
OWNER TO database_owner;
あなたが引き金に引数を渡すことはできませんが、あなたは確かにいくつかのテーブル内のいくつかの値(ユーザID)を格納し、持っているトリガーを取得し、することができますそれを記録する。 –
Javaから 'set_config( 'myapp.userid'、)'を呼び出し、 'current_setting( 'myapp.userid')'を呼び出して、トリガー機能で ''を取得します。 –