Oracle查询只显示更改的记录?

时间:2015-04-27 17:16:47

标签: sql oracle audit

是否有任何灵巧的方法在Oracle中创建SQL语句以仅显示已更改的字段?我们有一个Data表和一个相关的Audit表,它们具有相同的字段名。我可以在正确的关键字段上加入它们,然后我可以单独检查每个字段的变化:

    SELECT
    t.FIELD1,
    a.FIELD1 AUDIT_FIELD1,
    t.FIELD2,
    a.FIELD2 AUDIT_FIELD2,
    t.FIELD3,
    a.AUDIT_FIELD3,
    etc
    ...
    FROM
    DATA_TABLE t
    INNER JOIN
    AUDIT_TABLE a
    ON
    a.EMP_ID = t.EMP_ID
    ...
    WHERE 
    a.FIELD1 <> t.FIELD1
    OR
    a.FIELD2 <> t.FIELD2
    OR
    a.FIELD3 <> t.FIELD3
    etc etc..

我最后得到X行,其中每行至少有一个更改的字段,但我必须仔细检查所有结果以找出哪些字段已更改。

似乎我应该能够进行某种基本上表示&#34;对于表中的每个字段的查询,如果它不匹配其他表显示字段名称和值。&#34;

这一切都需要在SQL中完成,因为公司要求我们使用单独的查询/报告工具,该工具无法在Oracle后端数据库上创建任何对象(表,视图,触发器,SP等)

3 个答案:

答案 0 :(得分:0)

以下情况会怎样?它会指示哪些字段已更改为每个字段的Y / N列,因为多个字段可能已更改。

SELECT 
    CASE WHEN a.FIELD1 <> t.FIELD1 THEN 'Y' ELSE 'N' END AS FIELD1CHANGED,
    CASE WHEN a.FIELD2 <> t.FIELD2 THEN 'Y' ELSE 'N' END AS FIELD2CHANGED,
    CASE WHEN a.FIELD3 <> t.FIELD3 THEN 'Y' ELSE 'N' END AS FIELD3CHANGED,
...

答案 1 :(得分:0)

更传统的方法是推动自己的审核。在表中添加一个触发器,伪代码

 when insert, update or delete for each row

 IF inserting then
 Insert into your_table_audit (fields) Values(:old.id,...,...'INSERT');
 Elsif updating then
 Case
 ..compare all field values to find changed values
 End
 Insert into your_table_audit (fields) Values(:old.id,...,...'Changed '||:old.value||' to '||:new.value);
 Else
 Insert into your_table_audit (fields) Values(:old.id,...,...'DELETE');

这可以封装在一个包中,并将一些工作应用于任何表。您必须从Oracle元数据中访问列的名称,然后使用动态SQL在运行时构造代码。

答案 2 :(得分:0)

检查这可能有用

create table tab1 (
col1 varchar(10),
col2 varchar(10),
col3 Number(10)
);

insert into Tab1 values ('xxx','xxx',99);
insert into Tab1 values ('aaa','aaa',98);
insert into Tab1 values ('bbb','bbb',97);

create table tab2 (
col1 varchar(10),
col2 varchar(10),
col3 Number(10)
);

insert into Tab2 values ('xxx','xxx',99);
insert into Tab2 values ('aaaA','aaa',98);
insert into Tab2 values ('bbb','bbbB',97);

commit;

select col1,col2,col3 from tab2
minus 
select col1,col2,col3 from tab1

---------- ---------- ----------------------    
COL1       COL2       COL3                   
---------- ---------- ---------------------- 
aaaA       aaa        98                     
bbb        bbbB       97     


--drop table tab1;
--drop table tab2;