【问题标题】:How to find list of rows being affected in an update?如何查找更新中受影响的行列表?
【发布时间】:2015-01-15 02:46:14
【问题描述】:

昨天我在生产环境中对我的 Oracle 表进行了数据更正。但后来我发现我的选择命令获取了 62 行,显然在相同的条件下 64 行得到了更新。由于我没有在该更新中受到影响的行列表,因此我无法比较所选行的列表以及稍后更新的行列表。那么有没有办法找到在该表上的特定时间更新的行列表,比如从 16:20 到 16:21? Oracle 是否会跟踪给定表的哪些行更新的时间?

【问题讨论】:

  • 我知道在几乎所有表上创建了大量触发器的软件,以分别跟踪每条记录的更新。他们只是在这些表中添加一个 DATE 格式的列,然后将相同的代码添加到选定表的 UPDATE 触发器中。我不确定如何从默认数据库设置中了解类似的数据。我也很想知道,但鉴于我所说的第一件事,我怀疑它是否很容易检索。
  • 另外,我会检查 SELECT 和 UPDATE 语句。显然,WHERE 子句有所不同。知道您应该能够非常轻松地从任何 UPDATE 语句创建 SELECT 语句,只需将 UPDATE 和 SET 子句更改为 SELECT 和 FROM 子句。

标签: sql oracle


【解决方案1】:

如果您在数据库上启用了闪回,您可以在数据库中的特定时间检查数据。

SELECT * FROM table
AS OF TIMESTAMP 
TO_TIMESTAMP('2015-01-14 13:33:00', 'YYYY-MM-DD HH:MI:SS')
WHERE column = 'your value';

使用它,您可以检查您怀疑的记录之前和之后的数据。 如果找不到记录,则可以使用

SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM table where <<your condition>>

但是 SCN_TO_TIMESTAMP(ORA_ROWSCN) 只能针对最近更新的少数记录获得。您只能与系统维护的重做/闪回窗口中的 SCN 相互转换。一旦更改过期,映射就会丢失。

【讨论】:

    【解决方案2】:

    尝试使用 oracle FLASHBACK 功能(以防您的数据库根据闪回实用程序进行配置)

    如果启用,它将向您显示过去任何给定时间点的表格数据。

    更多详情请关注http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS01001

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 2020-10-30
      • 2014-12-08
      • 2019-11-20
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多