有没有选项可以查看Oracle数据库中现有表/记录是否已更新?
您是在谈论事务内部还是外部?
在我们的程序中,我们可以使用诸如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跟踪更改。
从监控的角度来看(不是为了查找以前的更改),您有几个选项,包括但不限于触发器、流和带有sysdate默认值的列。触发器将允许您在记录更改(插入、更新、删除)时执行一些编程逻辑(存储在触发器中直接或外部数据库对象中)。可以使用流来通过监视重做日志来跟踪更改。最简单的方法之一可能是添加一个带有sysdate默认值的日期列。
您可以通过查询user_objects视图中的last_ddl_time来查看表定义是否已更改。
如果不使用触发器或物化日志(这将是一种完全的hack),我不知道有什么方法可以查看表中任何特定行何时已更新。