Узнайте, когда столбцы таблицы AllData были обновлены в последний раз - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в 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 -> Тестер на Шон (с датой 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 (с датой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 , чтобыпосмотрите, не изменилась ли предыдущая дата.Я также вижу, что мне понадобится Дата + Время , чтобы исправить его для нескольких изменений в один и тот же день.

Так что запрос, который я нашел, должен быть использован илиЕсть ли что-то еще, что подходит для моей проблемы?

1 Ответ

0 голосов
/ 08 марта 2019

Нет, вы не можете использовать all_tab_modifications для этой цели.Из документации :

Эти представления заполняются только для таблиц с атрибутом MONITORING.Они предназначены для сбора статистики в течение длительного периода времени.По соображениям производительности база данных Oracle не заполняет эти представления сразу же, когда происходят реальные изменения.

Так что вам придётся найти какое-то собственное решение.Вверху моей головы:

  1. Как и предлагалось a_horse_with_no_name, используйте уведомление об изменении, чтобы следить за изменениями в этой таблице и обновлять некоторые другие таблицы или поля с помощью отметки времени последнего обновления.Лично я нахожу CQN немного запутанным, поэтому избегаю этого.Вы также можете сделать это в триггере.
  2. Используйте MAX(DateLastMod) со своего стола.В зависимости от размера таблицы и того, сколько раз вам нужно будет проверить эту таблицу на наличие изменений, может быть полезно проиндексировать этот столбец.

Решение № 1 будет сериализовать изменения в вашей таблице,так что это может повлиять на производительность.

Если DateLastMod на самом деле хранится как VARCHAR2, а не просто отображается в формате DD-Mon-YY, вы должны полностью изменить его на DATE,если возможно.Это добавит компонент времени к данным.

...