Postgres-轨道更改
我想跟踪表中的历史记录更改,因为我创建了一个历史表,现在正在保存旧值和新值,但是我想从常规表中保存FK中的一列。
这是我的历史表:
CREATE TABLE IF NOT EXISTS sales.history (
history_id integer PRIMARY KEY NOT NULL,
mytable_id integer,
table_name varchar(30),
new_val json,
old_val json,
operation varchar(10),
CONSTRAINT "fk sales.mytable_id to history.mytable_id" FOREIGN KEY (mytable_id) REFERENCES sales.sales (mytable_id)
) TABLESPACE pg_default;
我创建了一个跟踪更新,插入和删除
CREATE TRIGGER t_history BEFORE INSERT OR UPDATE OR DELETE ON sales.sales
FOR EACH ROW EXECUTE PROCEDURE core.func_store_history_changes();
触发器
CREATE OR REPLACE FUNCTION core.func_store_history_changes() RETURNS trigger AS $$
BEGIN
IF TG_OP = 'INSERT'
THEN
INSERT INTO sales.history (tabname, schemaname, operation, new_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
INSERT INTO sales.history (tabname, schemaname, operation, new_val, old_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP,
row_to_json(NEW), row_to_json(OLD));
RETURN NEW;
ELSIF TG_OP = 'DELETE'
THEN
INSERT INTO sales.history (tabname, schemaname, operation, old_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));
RETURN OLD;
END IF;
END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;
的 我的历史表?
问候
I want to track the history changes from my table, for that I created one history table, right now is saving old and new values, but I want to save in one column the fk from my regular table.
This is my history table:
CREATE TABLE IF NOT EXISTS sales.history (
history_id integer PRIMARY KEY NOT NULL,
mytable_id integer,
table_name varchar(30),
new_val json,
old_val json,
operation varchar(10),
CONSTRAINT "fk sales.mytable_id to history.mytable_id" FOREIGN KEY (mytable_id) REFERENCES sales.sales (mytable_id)
) TABLESPACE pg_default;
I created a trigger to track update,insert and delete
CREATE TRIGGER t_history BEFORE INSERT OR UPDATE OR DELETE ON sales.sales
FOR EACH ROW EXECUTE PROCEDURE core.func_store_history_changes();
Now my function
CREATE OR REPLACE FUNCTION core.func_store_history_changes() RETURNS trigger AS $
BEGIN
IF TG_OP = 'INSERT'
THEN
INSERT INTO sales.history (tabname, schemaname, operation, new_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
INSERT INTO sales.history (tabname, schemaname, operation, new_val, old_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP,
row_to_json(NEW), row_to_json(OLD));
RETURN NEW;
ELSIF TG_OP = 'DELETE'
THEN
INSERT INTO sales.history (tabname, schemaname, operation, old_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));
RETURN OLD;
END IF;
END;
$ LANGUAGE 'plpgsql' SECURITY DEFINER;
As you can see my history table has mytable_id which is a foreign key and primary key from sales table, how i can get that value and insert into my history table?
Regards
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于您的特定问题,我想您可以使用
new.mytable_id
并在插入之后使用触发器 ...以下是一个例子,我只写了第一个if(插入)。
结果:
但是,也许您可以尝试为任何表使用此通用触发器。
https://github.com/2ndquadrant/audit-trigger
For you specific problem, I guess that you could use
NEW.mytable_id
and use triggerAFTER INSERT
...Here is a example, I've wrote only the first if (INSERT).
Result:
But, maybe, you could try to use this generic trigger for any table.
https://github.com/2ndQuadrant/audit-trigger