我们用的是
"1 audit table for each monitored Table"
emp(PARENT)
表有一个子表
emp_address
这也需要监控,所以我们有
emp_audit
和
emp_address_audit tables
.
postgresauditsql:如何连接父表和子表以进行报告。
/* Employee table */
create table emp (
emp_id integer primary key,
empnum integer,
empname varchar(50),
loginid varchar(20),
updatetime timestamp
);
/* Address table */
create table emp_addr (
addr_id integer primary key,
emp_id integer, -- references table emp
line1 varchar(30),
line2 varchar(30),
loginid varchar(20),
updatetime timestamp
);
/* Audit table for emp table */
create table emp_audit (
operation character(1),
emp_id integer,
empnum integer,
empname varchar(50),
loginid varchar(20),
updatetime timestamp,
txid bigint
);
/* Audit table for emp_addr table */
create table emp_addr_audit (
operation character(1),
addr_id integer,
emp_id integer,
line1 varchar(30),
line2 varchar(30),
loginid varchar(20),
updatetime timestamp,
txid bigint
);
我们使用hibernate(java)进行持久化,hibernate只更新那些列在更新操作中被修改的表。考虑到这一点,我可能在emp\u addr\u audit表中有多个(比如说,5个)记录用于1个emp\u audit表。
报表需要为每个事务(修改)设置一行。
报告将包含以下列
empnum,empname,line1,line2,operation(插入/删除/更新),loginid,updatetime
让我们考虑两个场景来了解需要什么:
-
emp
创建属性。然后在一个单独的事务中,在
emp_addr
已创建。所以,现在,我们有一排
环境管理计划审计
表和中的1行
emp_addr_audit
-
两者
电磁脉冲
和
emp\ U地址
属性是在单个事务中创建的。这将确保中有1行
和一排
emp地址审计
. 现在,报表将只有1行(因为两个表行都是在单个事务中创建的)。
事务#1:我在emp和emp#u addr中插入一行。这将在emp\u audit和emp\u addr\u audit中各产生一行
我尝试了下面的SQL#1,它按预期返回了3行;
SQL数据库#1
SELECT emp.*, addr.*
FROM emp_audit emp
FULL OUTER JOIN emp_addr addr USING(emp_id, txid);
但是,当我向SQL添加where子句时,它只返回2行。缺少的行是事务#3的结果,其中只有emp#u addr table行被更新,emp table行未被触及。
SQL数据库2
SELECT emp.*, addr.*
FROM emp_audit emp
FULL OUTER JOIN emp_addr addr USING(emp_id, txid);
WHERE emp.empnum = 20;
仍然是
能够为3个事务获取3行,这样我仍然可以根据empnum进行筛选?
谢谢您,