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

R v*_*ijn 5 oracle

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

小智 6

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


APC*_*APC 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> 
Run Code Online (Sandbox Code Playgroud)

或者,我们可以测试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>
Run Code Online (Sandbox Code Playgroud)

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

这些是临时解决方案.如果要进行主动监控,则需要实施某种形式的日志记录.使用触发器写入日志记录是一种常见的解决方案.如果你有企业版,你应该考虑使用细粒度审计:Dan Morgan的库有一个如何使用FGA跟踪变化有用演示.