我有一个相当大的Oracle PL / SQL脚本我正在测试,我想知道是否有可能看到自上次提交到数据库以来哪些记录被更新/删除/插入?我需要一种更快的方法来检查所有数据库操作是否正确完成。我可以访问命令行以及Oracle的自定义工具SQL Developer
。
答案 0 :(得分:4)
在Oracle 10g中(我认为从9i开始)你可以使用闪回查询。
通常情况下,当您需要查看前一段时间的数据时会使用闪回查询,但在您的情况下,闪回查询仅会看到已提交数据。
所以,这是一个简单的例子:
SQL> create table t1 as select level lev from dual connect by level < 100;
Table created.
SQL> select count(*) from t1;
COUNT(*)
----------
99
SQL> select count(*) from t1 as of timestamp systimestamp;
COUNT(*)
----------
99
SQL> update t1 set lev = -lev;
99 rows updated.
SQL> select max(lev) from t1 as of timestamp systimestamp;
MAX(LEV)
----------
99
SQL> select max(lev) from t1;
MAX(LEV)
----------
-1
SQL> commit;
Commit complete.
SQL> select max(lev) from t1 as of timestamp systimestamp;
MAX(LEV)
----------
-1
SQL>
UPD:甚至更好,您可以使用Flashback Version Query或闪回事务查询进行一些调整,以过滤除当前会话之外的所有会话所做的更改。
答案 1 :(得分:2)
如果您的环境允许,您可以为每个表添加触发器,从而创建某种审核日志。
oracle中有一个审核功能,您可以使用它。谷歌认为,这篇文章可能会有所帮助:http://www.securityfocus.com/infocus/1689
答案 2 :(得分:0)
我可能错了,但我认为没有一种简单的方法可以做到这一点。唯一想到的是检查重做日志,但没有用户检查操作的界面。你可以do it manually,但事情并非那么简单。
答案 3 :(得分:0)
您需要获取SCN,SYSTEM CHANGE NUMBER。它基本上是一个在提交后设置的自动收报机。
始终ASK_TOM
答案 4 :(得分:0)
您需要更好地定义您的问题 - 您是否正在编写一个PLSQL脚本,该脚本仅捕获自上次运行以来已更新的数据?您正在查看的记录集是否具有连续的唯一ID? 您是否可以选择可能的重复项并使用最终设置验证它们以确定它们是否确实重复并因此丢弃它们? 根据这些情况,您的解决方案的复杂性将会发生变化