Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отключение триггеров в Оракл


evvcom ©   (2005-07-26 10:02:00) 

Народ, пытался ли кто делать такое.
Есть база на сервере 1 (С1). Написаны триггера, которые через dblink вызывают процедуры/функции или делают insert/update таблиц на удаленном сервере 2 (С2). В случае обновления этих объектов на С2, триггера на С1 приобретают статус INVALID, но не сразу, а после любого обращения к измененным объектам на С2. Естественно, в этом случае вставка/обновление данных на С1 становится невозможной. Думаю, излишне говорить, что на рабочих ответственных базах с немалым количеством пользователей такое недопустимо. Так вот, задумал я в случае подобной ошибки дизэйблить эти триггера автоматом. Хотел написать это в триггере after SERVERERROR on schema. Ошибка нормально ловится, но на
execute immediate 'alter trigger TRIGGER_NAME disable';
получаю ошибку 'ORA-30511: invalid DDL operation in system triggers'. Думаю, написать теперь на каждую таблицу, для которой написаны триггера on each row, триггера уровня оператора и в них после проверки флага о подобной ошибке вызывать процедуру с отключением всех этих on each row триггеров. Но тоже это не особо удобно. Чтобы потом обновить эту процедуру, опять придется сначала отключать statement триггера, обновлять, перекомпилить триггера, потом включать.
Может кто предложит более элегантный способ решения этой проблемы?


evvcom   (2005-07-26 14:11:00) [1]

С динамическим SQL все отлично получилось. Еще раз спасибо за идею.


evvcom   (2005-07-26 11:03:00) [2]


> Если просто перекомпилить, то проблем-то нет.
> Но их же сначала править надо.

Иногда править, иногда просто перекомпиляции достаточно. Сейчас с динамическим SQL попробую.


Reindeer Moss Eater   (2005-07-26 10:56:00) [3]

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

Если просто перекомпилить, то проблем-то нет.
Но их же сначала править надо.


evvcom   (2005-07-26 10:54:00) [4]


> Какой смысл их дисэйблить, если они все равно инвалидные
> и ничего не делают?

Они-то ничего не делают, но и данные не вставляются/обновляются. У клиента сразу ошибка валится 'ORA-04098: trigger trigger_name is invalid and failed re-validation'
А дропать их нельзя, потому как надо их просто перекомпилировать, и чтобы дальше работали.

> Организуй вставку через динамический SQL c обработкой исключений.

Вот это вроде дельная мысль. Сейчас подумаю, попробую. Спасибо.


Reindeer Moss Eater   (2005-07-26 10:26:00) [5]

Организуй вставку через динамический SQL c обработкой исключений.
Триггера при этом не будут зависеть от объектов второго сервера.


Reindeer Moss Eater   (2005-07-26 10:20:00) [6]

Какой смысл их дисэйблить, если они все равно инвалидные и ничего не делают?
Дропай их.


Наверх

Титульная страница Поиск, карта сайта Написать письмо