是否可以选择查看Oracle数据库中的现有表/记录是否已更新?
答案 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来查看表定义是否已更改。
不使用触发器或物化日志(这将是一次彻底的黑客攻击),我无法知道何时更新表中的任何特定行。