2009-12-10 2 views
2

Я пытаюсь выяснить, как я могу опросить изменения, внесенные в таблицу Oracle без использования триггера. Единственные изменения, которые мне сейчас волнуют, это новые/вставленные записи. Любые предложения будут ценны.Опрос Oracle DB для изменений

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

Спасибо!

S

ответ

1

Вы можете использовать Oracle Change Data Capture.

Изменение данных Capture эффективно идентифицирует и захватывает данные, которые были добавлены, обновлены или удалены из реляционных таблиц базы данных Oracle и делает данные изменений доступными для использования приложениями.

Зачастую хранилище данных включает извлечение и транспортировку реляционных данных из одной или нескольких исходных баз данных в хранилище данных для анализа. Change Data Capture быстро идентифицирует и обрабатывает только измененные данные, а не целые таблицы, и делает данные изменений доступными для дальнейшего использования.

Изменение данных Захват не зависит от промежуточных плоских файлов для обработки данных вне реляционной базы данных. Он фиксирует данные изменений, полученные в результате операций INSERT, UPDATE и DELETE, выполненных в пользовательских таблицах. Данные изменения затем сохраняются в объекте базы данных, называемом таблицей изменений, и данные изменений становятся доступными для приложений контролируемым образом.

0

Я не уверен, если это то, что вы ищете, но вы можете проверить максимальную ROWID и определить, какие записи нового времени последней проверки. Это должно работать, если строки только вставлены и не удалены.

например: выберите MAX (rowid) from your_table; или выберите rowid from your_table где rowid> last_max;

+0

Я ... это в основном то, к чему я пришел. Просто заходите между рядами между моим последним притяжением. – scarpacci

+0

Уровень изоляции позволяет читать до фиксации - это далеко не идеальный способ проверки состояния таблицы. –

+1

MAX (ROWID) не говорит вам многого и здесь недостаточно. Следующая шкала таблицы не обязательно физически сохраняется после предшествующего уровня в файле данных, и вставки могут входить в существующие блоки. Плюсы ROWID могут меняться со временем. –

3

CDC вариант, но это может иметь тенденцию быть немного тяжелым, если вы просто пишете приложение, которое должно получать уведомления о новых данных, Data Change Notification может быть более подходящим решением. Это позволяет избежать необходимости опроса базы данных, так как база данных может уведомлять о применении изменений.

Вы также можете использовать потоки для отправки записей изменений в приложение.

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

0

Если вы создаете таблицу с помощью предложения ROWDEPENDENCIES, вы можете использовать псевдо столбку ORA_ROWSCN для идентификации измененных строк.

Вот таблица

SQL> create table t23 
    2 (name varchar2(10) 
    3 , id number 
    4 ) rowdependencies 
    5/

Table created. 

SQL> insert into t23 values ('SAM-I-AM', 1) 
    2/

1 row created. 

SQL> insert into t23 values ('KNOX', 2) 
    2/

1 row created. 

SQL> insert into t23 values ('FOX', 3) 
    2/

1 row created. 

SQL> insert into t23 values ('LORAX', 9) 
    2/

1 row created. 

SQL> select ora_rowscn, id, rowid from t23 
    2/

ORA_ROWSCN   ID ROWID 
---------- ---------- ------------------ 
        1 AAB72FAAEAAA+4cAAA 
        2 AAB72FAAEAAA+4cAAB 
        3 AAB72FAAEAAA+4cAAC 
        9 AAB72FAAEAAA+4cAAD 

SQL> commit 
    2/

Commit complete. 

SQL> select ora_rowscn, id, rowid from t23 
    2/

ORA_ROWSCN   ID ROWID 
---------- ---------- ------------------ 
    75288125   1 AAB72FAAEAAA+4cAAA 
    75288125   2 AAB72FAAEAAA+4cAAB 
    75288125   3 AAB72FAAEAAA+4cAAC 
    75288125   9 AAB72FAAEAAA+4cAAD 

SQL> 

Не нужно совершить, чтобы получить Row SCN. Теперь давайте SOEM дальнейшие изменения и использовать ORA_ROWSCN, чтобы определить, какие строки изменились ...

SQL> update t23 
    2 set name = 'MR KNOX' 
    3 where id = 2 
    4/

1 row updated. 

SQL> insert into t23 values ('SALLY', 6) 
    2/

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select ora_rowscn, id, rowid from t23 
    2 where ora_rowscn > 75288125 
    3/

ORA_ROWSCN   ID ROWID 
---------- ---------- ------------------ 
    75288182   2 AAB72FAAEAAA+4cAAB 
    75288182   6 AAB72FAAEAAA+4cAAE 

SQL> 

ORA_ROWSCN был введен в 10г. Find out more.

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

+0

Просто укажем, что ROWDEPENDENCIES не является обязательным условием для использования ORA_ROWSCN - это только делает его более точным. Ссылка: [ORA_ROWSCN для записи изменений на уровне строки] (http://www.orafaq.com/node/2194) [ORA_ROWSCN .... Новая 10-граммовая колонка] (http://robertgfreeman.blogspot.com/ 2005/06/orarowscn новый-10g-псевдо-column.html) –

Смежные вопросы