powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / нужно временно отключить все триггеры
14 сообщений из 14, страница 1 из 1
нужно временно отключить все триггеры
    #32578300
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне надо сделать репликацию базы. Как слить только обновленные версии записей - разобрался. Теперь надо их залить в рабочую базу, в которой активны дофига триггеров. Как бы их все временно отключить?

Сразу заранее оговорюсь: инструменты типа IB Expert - не подходят. Репликацию базы должна выполнять полностью моя программка, т.е. все делается только через SQL-запросы.

Можно сделать ALTER TRIGGER ... [IN]ACTIVE, но хотелось бы перед этим получить с помощью запроса (к системным таблицам) список всех триггеров к базе (чтобы вручную каждый не прописывать отдельным запросом).

Подскажите, пожалуйста, как это получше организовать?


P.S.
Сама выгрузка данных делается так:
1. Есть чистая БД (с аналогичной структурой рабочей базы).
2. Собираются в эту чистую БД с 1-й рабочей базы записи по всем табличкам, которые надо реплицировать во 2-ю (главную) базу.
3. Собранная информация бэкапится и высылается по e-mail в главный офис конторы.
4. Там полученная инфа разворачивается и ее необходимо залить во 2-ю (главную) базу (каждая запись помечена, что с ней нужно сделать - INSERT или UPDATE).
... при этом срабатывают триггеры, что недопустимо ...
... на этом у меня образовался затык ... :(
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32578328
doroshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я делал так.
1. Создал пользователя, скажем, REPLICANT и роль REPLICANT_ROLE програмулина, которая делает репликацию коннектиться к базе под пользователем REPLICANT.
2. В каждом "спорном" триггере пишем следующее

Код: plaintext
1.
2.
3.
4.
5.
begin
  if (USER <> 'REPLICANT') then begin
     ....
  end
end

Теперь если происходит репликация с помощбю этой программы, то триггеры срабатывать не будут. (Вернее будут, но не будут производить каких-либо действий.)
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32578329
Winni-Pooh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотри таблицу RDB$Triggers поля RDB$Trigger_name и RDB$Relation_name(имя таблицы)
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32578335
doroshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В догонку

Даниил
Можно сделать ALTER TRIGGER ... [IN]ACTIVE ....


В общем случае так делать нельзя, так как триггеры отключаются для всей базы, а не для какого-то пользователя или какой-то транзакции. Представь себе, что во время репликации в базе кто-то работает. Если ты отключишь все триггеры, то они не сработают и для того пользователя, для которого они должны были бы сработать. Что не есть гуд, иначе зачем они тогда вообще нужны...
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32578339
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 doroshka:
Идея интересная (разделять по пользователям). Только я не понял следующего:
doroshkaПредставь себе, что во время репликации в базе кто-то работает
Как это? Если данные заливаются в те же таблицы, которые правят юзеры, тогда фигня с данными получится...

Хотя, у меня надо делать репликацию только в одну сторону. В главном офисе работают "как-бы read-only". Хотя и могут чего-нибудь изменить, но это уже обратно в филиал не отправляется.
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32578345
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT 'ALTER TRIGGER '||G.Rdb$trigger_name||' INACTIVE;' FROM Rdb$triggers G
WHERE (G.Rdb$system_flag IS NULL OR G.Rdb$system_flag =  0 )
  AND (G.Rdb$trigger_type >=  1 ) AND (G.Rdb$trigger_type <=  4 )
  AND NOT EXISTS (SELECT  1  FROM Rdb$check_constraints C WHERE (C.Rdb$trigger_name = G.Rdb$trigger_name))
Поле Rdb$trigger_type определяет тип триггера.
1 - 'PRE_STORE'
2 - 'POST_STORE'
3 - 'PRE_MODIFY'
4 - 'POST_MODIFY'
5 - 'PRE_ERASE'
6 - 'POST_ERASE'
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32578943
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Мимопроходящий:
Огромное спасибо!

А почему триггеры для "..._ERASE" не надо отключать? У меня данные при случае и удалить надо будет при репликации. ID тех записей, которые надо удалить и из какой таблички - я знаю (они при удалении в архив складываются).
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32579223
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну раз надо и ERASE, то поставь в условии <= 6.
У меня в задаче удаление отсутствует как класс вообще.
Т.е. у записи есть доп.поле DELETED_ON (типа TIMESTAMP),
которое является признаком "удаления". Записи у которых
это поле IS NOT NULL, пользователю не показываются.
Код: plaintext
1.
2.
   - Видишь суслика?
   - Нет!
   - И я не вижу. А он есть!.. 
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32579258
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
update rdb$triggers 
set rdb$trigger_inactive= 1  
where rdb$trigger_name IN
 (select trigger_name from TriggerTemp where trigger_inactive= 0 );

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

Конечно, когда ещё кто-то работает с базой, то так не надо)))
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32579263
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Мимопроходящий:
"У меня в задаче удаление отсутствует"

А как же тогда с производительностью быть? Ведь выборки медленнее работать будут (из-за "нароста" информации в одной табличке)!
У меня удаленные сохраняются в отдельных табличках, но кроме того и "удаленные" и текущие записи проходят ежемесячно "чистку" (удаляется инфа старше 3-х месяцев). Для конторы это старье не нужно, зато база больше 50 метров не разрастается и все летает на стареньком серваке.

Большое спасибо тебе.

Думаю, что тема исчерпана...
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32579268
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Могун:
"записать текущее состояние триггеров туда"

Не-е-е, они у меня в рабочем состоянии - все включены
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32579277
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, 50 метров конечно не размер...
Задачи разные бывают.
Посему, делай так, как тебе удобно.
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32580445
doroshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даниил2 doroshka:
Идея интересная (разделять по пользователям). Только я не понял следующего:
doroshkaПредставь себе, что во время репликации в базе кто-то работает
Как это? Если данные заливаются в те же таблицы, которые правят юзеры, тогда фигня с данными получится...

Хотя, у меня надо делать репликацию только в одну сторону. В главном офисе работают "как-бы read-only". Хотя и могут чего-нибудь изменить, но это уже обратно в филиал не отправляется.


Ну например в главном офисе директор-трудоголик сидит себе ночью в офисе и лазит в базе. В этот момент запускается репликация. Для своих нужд репликация отрубает все триггеры. И тут директору вздумалось подправить/внести какую-то запись, он начинает молотить клаву, а триггеры то не работают... Вот в этом может быть проблема. Если директор будет работать под своим юзером, а репликация под своим, то таких проблем не будет.
У меня репликация из четырех филиалов происходит днем раз в час. При этом в главной базе - около 30 пользователей, которые активно смотрят, правят, вносят... Конфликты - разруливаю на уровне приложения (благо предметная область позволяет).
...
Рейтинг: 0 / 0
нужно временно отключить все триггеры
    #32580495
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Даниил:

http://www.ibase.ru/develop.htm, раздел репликация.

Удачи.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / нужно временно отключить все триггеры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]