Подтвердить что ты не робот

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

Могу ли я узнать, когда последний оператор INSERT, UPDATE или DELETE был выполнен в таблице в базе данных Oracle, и если да, то как?

Небольшой фон: версия Oracle - 10g. У меня есть пакетное приложение, которое работает регулярно, считывает данные из одной таблицы Oracle и записывает их в файл. Я бы хотел пропустить это, если данные не изменились с момента последнего запуска задания.

Приложение написано на С++ и общается с Oracle через OCI. Он регистрируется в Oracle с "обычным" пользователем, поэтому я не могу использовать какие-либо специальные материалы для администрирования.

Изменить: Хорошо, "Special Admin Stuff" не совсем хорошее описание. Я имею в виду: я не могу ничего сделать, кроме SELECT из таблиц и вызова хранимых процедур. Изменение чего-либо о самой базе данных (например, добавление триггеров), к сожалению, не является вариантом, если вы хотите сделать это до 2010 года.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

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

Ответ 3

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

AUDIT INSERT ON user.table

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

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

Ответ 4

SELECT * FROM all_tab_modifications;

Ответ 5

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

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

Обновление: Еще один хороший ресурс: 10gs ORA_HASH функция, чтобы определить, равны ли две таблицы таблиц Oracle

Ответ 6

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

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

Он называется Уведомление об изменении базы данных. Это намного проще, чем CDC, как упомянул Джастин, но оба требуют некоторых причудливых админов. Хорошая часть состоит в том, что ни одно из них не требует изменений в ПРИЛОЖЕНИИ.

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 10

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

SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()

Ответ 11

Пожалуйста, используйте инструкцию ниже

select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE'  and ao.OWNER = 'YOUR_SCHEMA_NAME'