找出上次更新AllData表列的时间

时间:2019-02-11 15:25:43

标签: java sql oracle oracle12c

我是Oracle SQL的新手(与我最接触的是MS SQL,MySQL),我试图弄清楚如何每秒或每两秒检查一次数据库,看看表列中的内容是否已更改

我目前具有这种类型的架构( AllData ):

ID | Script_name | Tester | DateLastMod | Tools 
-------------------------------------------------
1  | Script_1    | Bob    | 10-FEB-19   | Web
2  | Script_2    | Bob    | 10-FEB-19   | Web
3  | Script_3    | David  | 10-FEB-19   | Desktop
4  | Script_4    | Bill   | 10-FEB-19   | Web

我在此查询中发现了一些内容:

SELECT * FROM all_tab_modifications WHERE TABLE_OWNER = 'ME';

Table_owner | Table_name | Inserts | Updates | Deletes | TimeStamp
------------------------------------------------------------------
Me          | Alldata    | null    | 6       | 0       | 11-Feb-19

但是我不确定这是否是正确的查询,以查看自上次检查以来是否已更改Alldata表列?

粗略的流程是:

  

用户将 ID 3 -> Tester 更改为 Sean (日期为2月11日)。

ID | Script_name | Tester | DateLastMod | Tools 
-------------------------------------------------
1  | Script_1    | Bob    | 10-FEB-19   | Web
2  | Script_2    | Bob    | 10-FEB-19   | Web
3  | Script_3    | Sean   | 11-FEB-19   | Desktop
4  | Script_4    | Bill   | 10-FEB-19   | Web
     

(检查更新)

     

找到更新后的表数据,以便刷新jTable中的数据。

     

(检查更新)

ID | Script_name | Tester | DateLastMod | Tools 
-------------------------------------------------
1  | Script_1    | Bob    | 10-FEB-19   | Web
2  | Script_2    | Bob    | 10-FEB-19   | Web
3  | Script_3    | Sean   | 11-FEB-19   | Desktop
4  | Script_4    | Bill   | 10-FEB-19   | Web
     

没有变化。

     

(检查更新)

ID | Script_name | Tester | DateLastMod | Tools 
-------------------------------------------------
1  | Script_1    | Bob    | 10-FEB-19   | Web
2  | Script_2    | Bob    | 10-FEB-19   | Web
3  | Script_3    | Sean   | 10-FEB-19   | Desktop
4  | Script_4    | Bill   | 10-FEB-19   | Web
     

没有变化。

     

用户将 ID 1 -> 脚本名称更改为 Script_11 (日期为2月11日)。

ID | Script_name | Tester | DateLastMod | Tools 
-------------------------------------------------
1  | Script_11   | Bob    | 11-FEB-19   | Web
2  | Script_2    | Bob    | 10-FEB-19   | Web
3  | Script_3    | Sean   | 11-FEB-19   | Desktop
4  | Script_4    | Bill   | 10-FEB-19   | Web
     

(检查更新)

     

找到更新后的表数据,以便刷新jTable中的数据。

     

(检查更新)

ID | Script_name | Tester | DateLastMod | Tools 
-------------------------------------------------
1  | Script_11   | Bob    | 11-FEB-19   | Web
2  | Script_2    | Bob    | 10-FEB-19   | Web
3  | Script_3    | Sean   | 11-FEB-19   | Desktop
4  | Script_4    | Bill   | 10-FEB-19   | Web
     

没有变化。

     

等等等...

几乎所有我需要检查的是 DataLastMod ,以查看前一个日期是否更改。我还可以看到,我需要一个 Date + Time (日期+时间),以便在同一天对多个更改进行正确设置。

那么查询是我找到了需要使用的内容还是其他适合我的问题?

1 个答案:

答案 0 :(得分:0)

否,您不能为此使用MAX(DateLastMod)。来自documentation

  

这些视图仅针对具有MONITORING的表填充   属性。它们旨在长期收集统计信息   一段的时间。出于性能原因,Oracle数据库不会   实际修改发生后,立即填充这些视图。

因此,您必须自己制定一些解决方案。在我的头顶上:

  1. 如建议的a_horse_with_no_name一样,使用更改通知来监视对此表的更改,并使用上次更新的时间戳更新其他表或字段。就个人而言,我发现CQN有点令人困惑,所以我避免了这一点。您也可以在触发器中执行此操作。
  2. 使用表格中的DateLastMod。根据表的大小以及您需要检查该表以进行修改的次数,对这一列进行索引可能会有所帮助。

解决方案1将序列化对表的更改,这样可能会对性能产生影响。

如果VARCHAR2实际上存储为DATE,而不仅仅是以DD-Mon-YY格式显示,则应尽可能将其更改为{{1}}。这将为数据添加一个时间分量。