【问题标题】:Get all table's row updated after a specific time在特定时间后更新所有表的行
【发布时间】:2017-03-24 15:10:47
【问题描述】:

背景: 我有一个 oracle 表,该表在表创建脚本时没有任何特定列作为时间戳。此表可以有数百万行。

例子:

Employee {Emp_No, Name, Manager,Division, Role, Region}

我的任务:如果通过该表上的作业发生任何更新,我能否知道所有行都更新了。 oracle 是否有我可以利用的每一行的任何内部时间戳。我可以在查询中使用它来获取所有记录吗?

原因:我需要向我的团队展示那些模棱两可的记录并没有被我们都怀疑的工作更新。

【问题讨论】:

  • 为什么不添加一个可为空的时间戳列并让作业在更新时填充它?这应该足够证明了。
  • 不能添加,是生产表。更改并非易事。
  • 如果这是一次性任务,ora_rowscn 是否会为您提供所需的信息?不清楚您是否需要它比允许的更明确...它可能会显示您感兴趣的行没有由最近的 SCN 更新。

标签: sql oracle sql-timestamp


【解决方案1】:

Oracle 有ORA_ROWSCN 伪列。此列返回对行或数据块进行的最后一个事务的“保守上限系统更改数 (SCN)”。这可以很好地估计块或行上次更改的时间。

如果您的表是使用ROWDEPENDENCIES 创建的,ORA_ROWSCN 会为行返回 scn。 NOROWDEPENDENCIES 是默认值,在这种情况下,Oracle 在块级别跟踪 SCN。

SCN_TO_TIMESTAMP 允许您将 scn 转换为时间戳,但对于旧 scn,它会引发异常。

【讨论】:

    【解决方案2】:

    大概的更新时间可以用SCN_TO_TIMESTAMP(ORA_ROWSCN)来获取

    对于每一行,ORA_ROWSCN 返回保守的上限系统 对行的最近更改的更改编号 (SCN)。这个 伪列可用于大致确定一行何时 最近更新时间。这不是绝对准确的,因为 Oracle 跟踪 SCN 按为该行所在的块提交的事务。

    https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns007.htm

    【讨论】:

    • 对于旧行,scn_to_timestamp 调用将失败(即可能未在此处更新的行);可能更好地在更新之前获取 SCN 一段时间,如果仍然可用,然后直接查看 ora_rowscn?我想如果您正在查看特定行,那么无论如何都会有异常告诉您。
    • 优秀。每天学习新东西。我不知道这个伪列的存在,也不知道时间戳转换函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多