2010-01-28 75 views

回答

6

从监视的角度(不打算查找以前的更改),您有几个选项,包括但不限于触发器,流和具有默认值sysdate的列。只要记录发生变化(插入,更新,删除),触发器将允许您执行一些编程逻辑(直接存储在触发器中或外部数据库对象中)。通过监视重做日志,可以使用流来跟踪更改。最简单的一种可能是添加一个默认值为sysdate的日期列。

+0

嗨,我已经使用最后一个选项,添加一个默认值为sysdate的日期列。想知道还有其他的选择,谢谢! – 2010-01-28 14:36:31

0

您可以通过查询user_objects视图中的last_ddl_time来查看表定义是否已更改。

没有使用触发器或物化日志(这可能是一个彻头彻尾的黑客),我无法知道在表中的任何特定行何时被更新。

4

你是在谈论交易还是外部?

在我们的计划,我们可以使用的东西像SQL%ROWCOUNT看到我们的DML是否成功......

SQL> set serveroutput on size unlimited 
SQL> begin 
    2  update emp 
    3  set job = 'SALESMAN', COMM=10 
    4  where empno = 8083; 
    5  dbms_output.put_line('Number of records updated = '||sql%rowcount); 
    6 end; 
    7/
Number of records updated = 1 

PL/SQL procedure successfully completed. 

SQL> 

另外,我们可能会测试SQL%FOUND(或SQL%NOTFOUND)。

从事务外部我们可以监视ORA_ROWSCN来查看记录是否已经改变。

SQL> select ora_rowscn from emp 
    2 where empno = 8083 
    3/

ORA_ROWSCN 
---------- 
    83828715 

SQL> update emp 
    2  set comm = 25 
    3  where empno = 8083 
    4/

1 row updated. 

SQL> commit 
    2/

Commit complete. 

SQL> select ora_rowscn from emp 
    2 where empno = 8083 
    3/

ORA_ROWSCN 
---------- 
    83828780 

SQL> 

默认情况下ORA_ROWSCN设置在块级别。如果您想在较低级别跟踪它,则需要使用ROWDEPENCIES关键字创建表。

这些是临时解决方案。如果你想主动监控,那么你需要实现某种形式的日志记录。使用触发器编写日志记录是一种常见的解决方案。如果你有企业版,你应该考虑使用细粒度审计:丹摩根的图书馆有一个useful demo of how to use FGA to track changes

+0

嗨APC,感谢您的网址:) – 2010-01-28 14:48:04

相关问题