首页 > 解决方案 > 查看 AllData 表列的上次更新时间

问题描述

我是 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_name更改为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才能使其在同一天进行多次更改。

那么查询是我发现需要使用什么还是有其他适合我的问题的东西?

标签: javasqloracleoracle12c

解决方案


不,您不能all_tab_modifications用于此目的。从文档中:

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

所以你必须推出自己的一些解决方案。在我的头顶上:

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

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

如果DateLastMod实际上存储为 aVARCHAR2而不仅仅是以 DD-Mon-YY 格式显示DATE,如果可能,您绝对应该将其更改为 a 。这将为数据添加一个时间组件。


推荐阅读