跟踪PostgreSQL的修订
-
20-09-2019 - |
题
我要跟踪记录修订在表中。我所做的就是创建一个从第一继承并增加了一个修正计数器第二个表。
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
然后创建了一个触发器,将更新表B中每一个的时间被插入/更新。我无法弄清楚是如何使B.revision保持一个单独的“序列”每个ID。
实施例:表A具有2行,I&J结果。 我已经更新3次,并应具有3次修订版:(1,2,3),点击 j之后更新2次,并应具有两个修订:(1,2)
下面是我到目前为止,我也许会走上错误的道路,有人能帮帮我!
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision MAX(revision) FROM B WHERE id = NEW.id;
IF NOT FOUND THEN
last_revision := 0;
END IF;
INSERT INTO B SELECT NEW.*;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
FOR EACH ROW EXECUTE PROCEDURE table_update();
解决方案
如果你只需要订货的版本号,而没有特别需要他们是一个整数,通过为每个标识,这样做是使用序列的修订,只是让它的最简单的方法增加做到跟踪你:
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id)
);
CREATE TABLE B ( revision SERIAL NOT NULL) INHERITS (A);
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
BEGIN
INSERT INTO B SELECT NEW.*;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
FOR EACH ROW EXECUTE PROCEDURE table_update();
然后执行插入照例:
try=# insert into a (foo) values ('bar');
INSERT 0 1
try=# insert into a (foo) values ('bar');
INSERT 0 1
try=# update a set foo = 'you' where id = 1;
UPDATE 2
try=# select * from b;
id | foo | revision
----+-----+----------
2 | bar | 2
1 | you | 1
1 | you | 3
(3 rows)
所以,你可以得到所有的修订像这样给定的行:
try=# select * from b where id = 1 order by revision;
id | foo | revision
----+-----+----------
1 | you | 1
1 | you | 3
(2 rows)
其他提示
下面是我的建议:
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision coalesce(MAX(revision), 0) FROM B WHERE id = NEW.id;
INSERT INTO B SELECT NEW.*, last_revision + 1;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
我改变了“如果未找到”变成了聚结,这将挑选“0”,如果没有现有修订。然后,我在乙插入行,与所述递增修正。
小心你的产业,你将需要使用“唯一”关键词选择和更新的时候给自己限制在一个表,因为这样的:
select * from only A
update only A set foo = ... where id = ...
下面是一个功能丰富Aduit包postgres的,我已经在过去使用:审计触发一>。它跟踪更新的用于更新的类型(插入,更新,删除)以及之前和之后的值。
--THIS TABLE AUTOMATICALLY INCREMENT THE COLUMN VALUES USING TRIGGER
CREATE TABLE emp_table(
emp_id int not null,
emp_name varchar not null,
emp_rollno int not null,
primary key(emp_id)
);
--Now create table with three column and emp_id is primary key
--and emp_rollno both are automatically increment in trigger is fired
CREATE or REPLACE FUNCTION emp_fun() RETURNS TRIGGER AS $BODY$
--creating function emp_fun()
DECLARE
BEGIN
IF(tg_op='INSERT') THEN
NEW.emp_id=COALESCE((SELECT MAX(emp_id)+1 FROM emp_table), 1);
NEW.emp_rollno=COALESCE((SELECT MAX(emp_rollno)+1 FROM emp_table), 1);
--trigger is fired values is automatically increment
END IF;
IF tg_op='DELETE' THEN RETURN OLD; ELSE RETURN NEW; END IF;
END; $BODY$LANGUAGE PLPGSQL
CREATE TRIGGER emp_fun BEFORE INSERT ON
emp_table FOR EACH ROW EXECUTE PROCEDURE emp_fun();
INSERT INTO emp_table(emp_name) VALUES('BBB');
--insert the value tanle emp_table
SELECT * FROM emp_table
-- Check the result
不隶属于 StackOverflow