查询以检查在 oracle 中的 table 上完成的最后一个 DML 的日期和时间

Query to Check date and time of Last DML done on a table in oracle

根据要求,我需要在搜索时以完整模式捕获表中的最后一个 DML 操作,我注意到两个资源

资源 1 https://dba.stackexchange.com/questions/115062/how-to-get-a-last-dml-operation-in-oracle-10g-11g

资源 2 https://oraclebykkbakshi.blogspot.com/2018/04/check-date-and-time-of-last-dml-done-on.html

在上面我已经尝试使用这两个查询

查询 1 - DBA_TAB_MODIFICATIONS

SELECT TABLE_OWNER,TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP AS LAST_CHANGE
FROM  DBA_TAB_MODIFICATIONS
WHERE TO_CHAR(TIMESTAMP,'DD.MM.YYYY') = TO_CHAR(sysdate,'DD.MM.YYYY') 
and table_owner='SCHEMA_NAME'
and table_name in ('MY LIST OF TABLES')

结果 - 它只获取了只获取了几个表的结果

Query2 - 非常慢

select max(ora_rowscn),SCN_TO_TIMESTAMP(max(ora_rowscn)) FROM 'MY LIST OF TABLES'

如果我使用查询 2 检查任何表,我会收到以下错误

错误查询 2

ORA-08181: specified number is not a valid system change number
ORA-06512: at "SYS.SCN_TO_TIMESTAMP", line 1
08181. 00000 -  "specified number is not a valid system change number"
*Cause:    supplied scn was beyond the bounds of a valid scn.
*Action:   use a valid scn.

如何一次检查所有表,因为如果我需要使用查询 2,我如何在一个查询中列出多个表?

所以我的问题是要搜索的正确查询是什么?

或任何其他更好的查找方法,有什么建议吗?

根据建议我尝试了运行查询

SELECT *
  FROM 'TABLE_NAME' t
MINUS
SELECT *
  FROM 'TABLE_NAME'
  AS OF timestamp systimestamp - interval '1' day t

AS OF timestamp systimestamp - 间隔“1”天 t - 我必须在此处使用的值是多少?

你可能会用到

  • AUDIT 单个模式的子句,例如 hr

    AUDIT ALL BY hr BY ACCESS;
    AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY hr BY ACCESS;
    

    以管理员身份连接到 SYS 后,以捕获 DML。

,或者您可以创建

  • 一些数据库会触发一些所需的 tables,您需要跟踪其中的 DML 数据,以便在自定义创建的新​​文件中保留日志 table(s).

为当前位置查询之前处理过的数据,可以用

  • 闪回查询

    AS OF timestamp systimestamp - INTERVAL '<int>' [year|month|day|hour|minute|second] 个人 table 的语法

    SELECT *
      FROM tab t
     WHERE t.id = :v_id
    MINUS
    SELECT *
      FROM tab
      AS OF timestamp systimestamp - interval '1' day t
     WHERE t.id = :v_id;
    

    哪returns前一天的数据相同 hour:minute:second 结合当前时间提供 undo_retention 数据库参数的值足以容纳 过去某个时间点的数据。 (对于这种情况,值应该 至少 86400(秒)