知道Oracle中是否更新了记录?

时间:2010-01-28 14:09:15

标签: oracle

是否可以选择查看Oracle数据库中的现有表/记录是否已更新?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

您是在谈论交易还是在交易之外?

在我们的程序中,我们可以使用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关键字创建表。

这些是临时解决方案。如果要进行主动监控,则需要实施某种形式的日志记录。使用触发器写入日志记录是一种常见的解决方案。如果您有Enterprise Edition,则应考虑使用细粒度审计:Dan Morgan的库具有useful demo of how to use FGA to track changes

答案 2 :(得分:0)

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

不使用触发器或物化日志(这将是一次彻底的黑客攻击),我无法知道何时更新表中的任何特定行。