Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以检查上次在oracle表上执行DML的日期和时间_Sql_Oracle_Dml - Fatal编程技术网

Sql 查询以检查上次在oracle表上执行DML的日期和时间

Sql 查询以检查上次在oracle表上执行DML的日期和时间,sql,oracle,dml,Sql,Oracle,Dml,根据要求,在搜索时,我需要在完整模式的表中捕获最后的DML操作,我注意到了两个参考资料 资源1 资源2 在上述两种查询中,我都尝试过使用 查询1-DBA选项卡修改 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

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

资源1

资源2

在上述两种查询中,我都尝试过使用

查询1-DBA选项卡修改

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')
结果-它只获取了只获取了几个表的结果

查询2-速度非常慢

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

截至时间戳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

,或者您可以创建

  • 某些所需表的一些数据库触发器,您需要跟踪其中的 DML数据,以便将日志保留在自定义创建的新日志中 表(s)
对于查询先前处理数据的当前位置,您可以使用

  • 闪回查询


    从时间戳systimestamp-间隔“[年|月|日|小时|分钟|秒]
    单个表的语法

    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;
    
    返回具有相同数据的前一天的数据 小时:分钟:与提供的当前时间的第二个组合 undo_retentionDB参数的值足够大,可以容纳 过去时间点的数据。(对于这种情况,值应为 至少为86400(秒)

您可以使用

  • AUDIT
    子句,用于单个架构,例如
    hr

    AUDIT ALL BY hr BY ACCESS;
    AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY hr BY ACCESS;
    
    以管理员身份连接到SYS后,以捕获DML

,或者您可以创建

  • 某些所需表的一些数据库触发器,您需要跟踪其中的 DML数据,以便将日志保留在自定义创建的新日志中 表(s)
对于查询先前处理数据的当前位置,您可以使用

  • 闪回查询


    从时间戳systimestamp-间隔“[年|月|日|小时|分钟|秒]
    单个表的语法

    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;
    
    返回具有相同数据的前一天的数据 小时:分钟:与提供的当前时间的第二个组合 undo_retentionDB参数的值足够大,可以容纳 过去时间点的数据。(对于这种情况,值应为 至少为86400(秒)


,非常感谢我尝试使用闪回查询v_id的各种选项。我需要输入什么值?欢迎@rakesh,这只是建议您按
id
列进行筛选(如果您的表中存在此列)。您还可以完全删除WHERE条件。刚刚提出考虑限制数据,以便通过具有主键的列更快地获取。从时间戳systimestamp-间隔'1'天起,我尝试输入时间戳systimestamp-间隔'100'天起,它不工作,如果要比较2020年8月1日的数据,请阅读关于undo_retention@rakesh的解释,非常感谢我尝试使用闪回查询v_id的各种选项,我需要输入的值是什么?欢迎@rakesh,如果您的表中存在
id
列,则建议您按
id
列进行筛选。您还可以完全删除WHERE条件。刚刚提出考虑限制数据,以便通过具有主键的列更快地获取。从时间戳systimestamp-间隔'1'天起,我尝试输入时间戳systimestamp-间隔'100'天起,它不工作,如果要比较2020年8月1日的数据,请阅读关于undo_retention@rakesh的说明