在Oracle中如何判断记录是否已更新?

5

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

3个回答

6

您是在谈论事务内部还是外部?

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

这些是临时解决方案。如果您想要主动监控,则需要实施某种形式的日志记录。使用触发器编写日志记录是一种常见的解决方案。如果您拥有企业版,则应考虑使用Fine Grained Auditing:Dan Morgan的库提供了一个有用的演示如何使用FGA跟踪更改


6

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


嗨,我已经使用了最后一个选项,添加一个默认值为sysdate的日期列。只是想知道还有哪些其他选项,谢谢! - R van Rijn

0

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

如果不使用触发器或物化日志(这将是一种完全的hack),我不知道有什么方法可以查看表中任何特定行何时已更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接