我们希望保留某些表的编辑历史记录,并在必要时还原它们。例如,我们有以下表格。我们希望在执行插入/删除操作时审核emp表。除此之外,当版本字段更新发生时,我们还需要将相关emp_addr记录的副本保存到emp_addr_audit。当用户想要回滚到一个emp的特定版本时,我们需要从emp_audit和emp_addr_audit恢复记录。
我正在考虑使用触发器来执行审计工作以及执行还原工作的过程。我知道关键部分是如何在审计和恢复工作中维护父子表的完整性。我需要一些建议。谢谢。
create table emp (
emp_id integer primary key,
version varchar(50)
);
/* Address table */
create table emp_addr (
addr_id integer primary key,
emp_id integer, -- references table emp
line1 varchar(30),
);
/* Audit table for emp table */
create table emp_audit (
operation character(1),
updatetime timestamp,
emp_id integer,
version varchar(50)
);
/* Audit table for emp_addr table */
create table emp_addr_audit (
operation character(1),
addr_id integer,
emp_id integer,
line1 varchar(30),
);
答案 0 :(得分:1)
我建议将 id 字段作为主键添加到审核表中,因为在回滚到表时需要引用emp
表您还需要emp
来引用相应版本的emp_addr
。
因此,审计表DDL应如下所示:
/* Audit table for emp table */
create table emp_audit (
id bigserial,
operation character(1),
updatetime timestamp,
emp_id integer,
version varchar(50),
CONSTRAINT audit_emp_id PRIMARY KEY (id)
);
/* Audit table for emp_addr table */
create table emp_addr_audit (
id bigserial,
operation character(1),
addr_id integer,
emp_id integer,
line1 varchar(30),
CONSTRAINT fk_ audit_emp_id FOREIGN KEY emp_audit_id
REFERENCES emp_audit (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE;
);
接下来,您需要创建一个触发器来存储更改。请注意,您必须监视两个表中的更改并创建对相应存储记录的引用。
CREATE TRIGGER t_audit_emp_IUD
AFTER INSERT OR UPDATE OR DELETE -- probably u want only update. Not sure
ON emp
FOR EACH ROW
EXECUTE PROCEDURE emp_modified();
CREATE TRIGGER t_audit_emp_addr_IUD
AFTER INSERT OR UPDATE OR DELETE
ON emp_addr
FOR EACH ROW
EXECUTE PROCEDURE emp_addr_modified();
最后定义函数。注意,函数应该在触发器之前存储在数据库中,因为触发器引用了函数。
回滚功能应将emp_audit.id
作为输入,并根据审计表恢复状态。在回滚之前保存状态以防止可能的数据丢失是个好主意。
如果这不能回答您的问题,请说明您实际需要帮助的部分。