2016-04-20 12 views
1

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; 
+1

あなたが引き金に引数を渡すことはできませんが、あなたは確かにいくつかのテーブル内のいくつかの値(ユーザID)を格納し、持っているトリガーを取得し、することができますそれを記録する。 –

+1

Javaから 'set_config( 'myapp.userid'、)'を呼び出し、 'current_setting( 'myapp.userid')'を呼び出して、トリガー機能で ''を取得します。 –

答えて

1

コメントに@Nickバーンズヒントによると、postgresql.confファイル内の変数を宣言する必要がある:

... 

#---------------------------------------------------------------------------- 
# CUSTOMIZED OPTIONS 
#---------------------------------------------------------------------------- 

custom_variable_classes = 'myapp'  # list of custom variable class names 
myapp.user_id = 0 

およびコール:

SET LOCAL customvar.user_id=<set_user_id_value_here> 

トリガーする必要があります。

は、トリガー使用中の変数を処理するには、次の

current_setting('myapp.userid') 
+1

'postgresql.conf'エントリはPostgreSQL 9.1以前でのみ必要であることに注意してください。最近では、新しい変数をただちに 'SET'することができます。 –

+0

必要に応じて、詳細を自由に記入してください。私はあなたの答えを受け入れて、私のものを削除します。 –

+0

必要はありません、私はあなたがそれをかなりカバーしたと思います;) –

関連する問題