您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Oracle:如何查找模式中最后一次更新(任何表)的时间戳?

Oracle:如何查找模式中最后一次更新(任何表)的时间戳?

我不知道Oracle中有任何此类 功能 见下文。

我能想到的最好的解决方案是在每个表上创建一个触发器,以使用当前日期/时间更新单行表或上下文。这样的触发器可能在表级别(而不是行级别),因此它们所承担的开销不会像大多数触发器那样大。

顺便说一句,Oracle不能为每个架构保留一个事务ID,因为一个事务可能会影响多个架构。可能可以使用V $视图将事务跟踪回到受影响的对象,但这并非易事,而且几乎可以肯定它的性能要比触发方案差。

事实证明,如果您有10g,则可以使用Oracle的闪回功能获取此信息。但是,您需要启用闪回功能(这本身会带来一些开销),并且查询速度非常慢(大概是因为它并非真正用于此用途):

select max(commit_timestamp) 
from FLASHBACK_TRANSACTION_QUERY 
where table_owner = 'YOUR_SCHEMA' 
      and operation in ('INSERT','UPDATE','DELETE','MERGE')

为了避免将问题锁定在“上次更新”表中,您可能希望将该更新放入使用自主事务的过程中,例如:

create or replace procedure log_last_update as
pragma autonomous_transaction;
begin
   update last_update set update_date = greatest(sysdate,update_date);
   commit;
end log_last_update;

这将导致您的应用程序在某种程度上进行序列化:每个需要调用此过程的语句都需要等待,直到上一个语句完成为止。“上次更新”表也可能不同步,因为即使回滚激活了触发器的更新,该表上的更新也会保留。最后,如果您的交易特别长,则应用程序可能会在交易完成之前选择新的日期/时间,从而达不到目的。我对这个问题的思考越深,似乎就越不是一个好主意。

避免这些问题的更好解决方案是从触发器中插入一行。这不会锁定表,因此不会进行任何序列化,也不需要异步进行插入,因此它们可以与实际数据一起回滚(并且在应用程序不可见之前,对应用程序不可见)。数据也是可见的)。应用程序将获得最大值,如果该表已建立索引,则最大值将非常快(实际上,该表将是索引组织表的理想候选者)。唯一的缺点是,您需要定期运行的作业以清除旧值,因此它不会变得太大。

Oracle 2022/1/1 18:47:31 有407人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶