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

Mar*_*got 6 postgresql triggers jdbc

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

- 执行了哪个操作

- 执行此操作时

-由谁。

我对最后一个要求有问题。当通过 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)
)
Run Code Online (Sandbox Code Playgroud)

存储“注释”表中每行更改的旧版本的表:

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)
)
Run Code Online (Sandbox Code Playgroud)

“注释”表的触发器:

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();
Run Code Online (Sandbox Code Playgroud)

触发器执行的过程:

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;
Run Code Online (Sandbox Code Playgroud)

Mar*_*got 5

根据评论中的 @Nick Barnes 提示,需要在 postgresql.conf 文件中声明一个变量:

...

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

custom_variable_classes = 'myapp'       # list of custom variable class names
myapp.user_id = 0
Run Code Online (Sandbox Code Playgroud)

并致电:

SET LOCAL customvar.user_id=<set_user_id_value_here>
Run Code Online (Sandbox Code Playgroud)

在应该触发的查询之前。

要处理触发器中的变量,请使用:

current_setting('myapp.userid')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,仅在 Postgres 9.1 及更早版本中才需要“postgresql.conf”条目;如今,您可以即时“设置”新变量。 (4认同)