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

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

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

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

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

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

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

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

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

 SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable; 

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

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

 AUDIT INSERT ON user.table 

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

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

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

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

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

 SELECT * FROM all_tab_modifications; 

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

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

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

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

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

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

Вы считаете, что «Special Admin Stuff»?

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

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

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

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

 select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE' and ao.OWNER = 'YOUR_SCHEMA_NAME' 
  • Строка на сегодняшний день в Oracle с миллисекундами
  • Подключение к Oracle Database через C #?
  • TNS-12505: TNS: слушатель в настоящее время не знает о SID, заданном в дескрипторе соединения
  • Можете ли вы использовать Microsoft Entity Framework с Oracle?
  • ORA-01461: может связывать значение LONG только для вставки в столбцы LONG. Происходит при запросе
  • В чем разница между представлениями и материализованными представлениями в Oracle?
  • Определение местоположения соответствующего файла tnsnames.ora
  • C # параметризованные запросы для Oracle - серьезная и опасная ошибка!
  • ORA-01882: область часового пояса не найдена
  • Обработка ExecuteScalar (), когда результаты не возвращаются
  • Как обратиться к ошибке «Получите минус один из чтения» при подключении к экземпляру Oracle Amazon RDS
  • Interesting Posts

    Не удается войти в Google Drive (пользовательский интерфейс пуст)

    Общее ограничение для сопоставления числовых типов

    Непоследовательное сетевое подключение к сети Windows 7

    Rsync –remove-source-файлы удаляет исходные файлы по одному или после завершения rsync?

    Как отключить сухари в Eclipse

    Ресурс был получен при подключенной трассировке стека, но не был выпущен. См. Java.io.Closeable для информации об избежании утечек ресурсов

    Окно просмотра AngularJS $ изменяет размер внутри директивы

    Как сделать захват экрана в Windows PowerShell?

    Скопированный профиль пользователя, теперь получите «невозможно получить доступ к устройствам … соответствующие разрешения» в системных файлах

    Поиск по известному набору целых ключей

    MSE v2.0.657.0 (последняя) ошибка установки 0x80070643

    Bios / Windows не может обнаружить мой плохой жесткий диск

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

    Как получить только время с даты-времени C #

    Как работает обозначение пути «PROGRA ~ 1»?

    Давайте будем гением компьютера.