是否可以将数据传递给postgreSQL触发器?

时间:2016-04-20 10:18:38

标签: postgresql jdbc triggers

我需要通过触发器记录在某些表中所做的任何更改,这会将旧版本的修改行插入另一个表,其中包含一些其他数据:

- 执行了哪些动作

- 执行此操作时

-by who。

我对上一个要求有疑问。在JDBC中通过Java在某处执行SQL时。我需要以某种方式将存储在变量中的已记录用户ID传递给postgres表,其中将存储所有旧版本的已修改行。

甚至可能吗? 这可能是一个愚蠢的问题,但我拼命地试图避免在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 个答案:

答案 0 :(得分:1)

根据@Nick Barnes的评论提示,需要在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')