我需要通过触发器记录在某些表中所做的任何更改,这会将旧版本的修改行插入另一个表,其中包含一些其他数据:
- 执行了哪些动作
- 执行此操作时
-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;
答案 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')