Как узнать, когда таблица Oracle была обновлена ​​в последний раз

Чтобы получить курсор, вы не можете использовать compiledStatement. Однако, если вы хотите использовать полностью подготовленный оператор SQL, я рекомендую адаптировать метод jbaez ... Используя db.rawQuery() вместо db.query().

23
задан Maximilian 5 November 2008 в 13:53
поделиться

11 ответов

Поскольку вы используете 10g, вы можете использовать псевдостолбец ORA_ROWSCN. Это дает вам верхнюю границу последнего SCN (номер изменения системы), который вызвал изменение в строке. Поскольку это возрастающая последовательность, вы можете сохранить максимум ORA_ROWSCN, который вы видели, а затем искать только данные с SCN больше этого

.

По умолчанию ORA_ROWSCN фактически поддерживается на уровне блока, поэтому изменение любой строки в блоке изменит ORA_ROWSCN для всех строк в блоке. Этого, вероятно, вполне достаточно, если целью является минимизация количества обрабатываемых строк несколько раз без изменений, если мы говорим о «нормальных» шаблонах доступа к данным. Вы можете перестроить таблицу с помощью ROWDEPENDENCIES, что приведет к отслеживанию ORA_ROWSCN на уровне строк, что дает вам более детальную информацию, но требует одноразовых усилий для перестройки таблицы.

Другой вариант - настроить что-то вроде Change Data Capture (CDC) и сделать ваше приложение OCI подписчиком изменений в таблице, но это также требует единовременных усилий по настройке CDC.

36
ответ дан Justin Cave 5 November 2008 в 13:53
поделиться

Я действительно опоздал на эту вечеринку, но вот как я это сделал:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

Это достаточно близко для моих целей.

44
ответ дан Paul 5 November 2008 в 13:53
поделиться
SELECT * FROM all_tab_modifications;
8
ответ дан grokster 5 November 2008 в 13:53
поделиться

Если аудит включен на сервере, просто используйте

SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()
2
ответ дан hui chen 5 November 2008 в 13:53
поделиться

Спросите своего администратора базы данных об аудите. Он может начать аудит с помощью простой команды, например:

AUDIT INSERT ON user.table

Затем вы можете запросить таблицу USER_AUDIT_OBJECT, чтобы определить, была ли вставка в вашу таблицу с момента последнего экспорта.

Google для Oracle аудита для получения дополнительной информации ...

9
ответ дан dub 5 November 2008 в 13:53
поделиться

Пожалуйста, используйте приведенное ниже утверждение

select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE'  and ao.OWNER = 'YOUR_SCHEMA_NAME'
-4
ответ дан Renjith 5 November 2008 в 13:53
поделиться

Вам нужно будет добавить триггер при вставке, обновлении, удалении, который устанавливает значение в другой таблице для sysdate.

Когда вы запускаете приложение, оно считывает значение и сохраняет его где-нибудь, чтобы при следующем запуске оно имело ссылку для сравнения.

Считаете ли вы, что «Special Admin Stuff»?

Было бы лучше описать, что вы на самом деле делаете, чтобы получить более четкие ответы.

1
ответ дан Osama Al-Maadeed 5 November 2008 в 13:53
поделиться

Oracle может наблюдать за изменениями в таблицах, а при их изменении может выполнять функцию обратного вызова в PL / SQL или OCI. Обратный вызов получает объект, который представляет собой набор таблиц, которые изменились, и который содержит коллекцию измененных строк и тип действия, Ins, upd, del.

Так что ты даже не идешь к столу, ты сидишь и ждешь вызова. Вы пойдете, только если есть изменения, чтобы написать.

Это называется Уведомление об изменении базы данных . Как упоминал Джастин, это намного проще, чем CDC, но оба требуют некоторой фантазии администратора. Хорошая часть заключается в том, что ни один из них не требует изменений в заявке.

Предостережение заключается в том, что CDC подходит для больших таблиц, а DCN - нет.

4
ответ дан 5 November 2008 в 13:53
поделиться

Если кто-то еще ищет ответ, он может использовать функцию уведомления об изменении базы данных Oracle , поставляемую с Oracle 10g. Требуется CHANGE NOTIFICATION системная привилегия. Вы можете зарегистрировать слушателей, когда вызывать уведомление обратно в приложение.

0
ответ дан TMtech 5 November 2008 в 13:53
поделиться

Сколько времени занимает пакетный процесс для записи файла? Возможно, проще всего позволить ему пойти дальше, а затем сравнить файл с копией файла из предыдущего прогона, чтобы убедиться, что они идентичны.

1
ответ дан Tony Andrews 5 November 2008 в 13:53
поделиться

Не могли бы вы выполнить какую-либо контрольную сумму результата и сохранить ее локально? Затем, когда ваше приложение запрашивает базу данных, вы можете сравнить ее контрольную сумму и определить, следует ли ее импортировать?

Похоже, что вы можете использовать функцию ORA_HASH для этого.

Обновление: Еще один полезный ресурс: Функция 10RA ORA_HASH для определения того, равны ли данные двух таблиц Oracle

7
ответ дан mwilliams 5 November 2008 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: