Знаете, обновляется ли запись в Oracle? - PullRequest
4 голосов
/ 28 января 2010

Можно ли посмотреть, обновляется ли существующая таблица / запись из базы данных Oracle?

Ответы [ 3 ]

6 голосов
/ 28 января 2010

С точки зрения мониторинга (не предназначенного для поиска предыдущих изменений) у вас есть несколько вариантов, включая, но не ограничиваясь, триггеры, потоки и столбец со значением по умолчанию sysdate. Триггер позволит вам выполнять небольшую часть логики программирования (сохраняемой непосредственно в триггере или во внешнем объекте базы данных) при каждом изменении записи (вставка, обновление, удаление). Потоки могут быть использованы для отслеживания изменений путем мониторинга журналов повторов. Одним из самых простых может быть добавление столбца даты со значением по умолчанию sysdate.

5 голосов
/ 28 января 2010

Вы говорите в рамках транзакции или вне ее?

В нашей программе мы можем использовать такие вещи, как SQL% ROWCOUNT, чтобы увидеть, удалось ли нашему DML ...

SQL> set serveroutput on size unlimited
SQL> begin
  2       update emp
  3       set job = 'SALESMAN', COMM=10
  4       where empno = 8083;
  5      dbms_output.put_line('Number of records updated = '||sql%rowcount);
  6  end;
  7  /
Number of records updated = 1

PL/SQL procedure successfully completed.

SQL> 

В качестве альтернативы мы можем проверить на наличие SQL% FOUND (или SQL% NOTFOUND).

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

SQL> select ora_rowscn from emp
  2  where empno = 8083
  3  /

ORA_ROWSCN
----------
  83828715

SQL> update emp
  2      set comm = 25
  3      where empno = 8083
  4  /

1 row updated.

SQL> commit
  2  /

Commit complete.

SQL> select ora_rowscn from emp
  2  where empno = 8083
  3  /

ORA_ROWSCN
----------
  83828780

SQL>

По умолчанию ORA_ROWSCN устанавливается на уровне блока. Если вы хотите отслеживать его на нижнем уровне, вам нужно создать таблицу с ключевым словом ROWDEPENCIES.

Это специальные решения. Если вы хотите превентивного мониторинга, то вам нужно реализовать какую-либо форму ведения журнала. Использование триггеров для записи записей журнала является распространенным решением. Если у вас есть Enterprise Edition, вы должны рассмотреть возможность использования Fine Grained Auditing: в библиотеке Дэна Моргана есть полезная демонстрация того, как использовать FGA для отслеживания изменений .

0 голосов
/ 28 января 2010

Вы можете увидеть, изменилось ли определение таблицы, запросив last_ddl_time из представления user_objects.

Без использования триггеров или материализованных журналов (что было бы полным взломом), я не знаю, как узнать, была ли обновлена ​​какая-либо строка в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...