|
|
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Мне надо сделать репликацию базы. Как слить только обновленные версии записей - разобрался. Теперь надо их залить в рабочую базу, в которой активны дофига триггеров. Как бы их все временно отключить? Сразу заранее оговорюсь: инструменты типа IB Expert - не подходят. Репликацию базы должна выполнять полностью моя программка, т.е. все делается только через SQL-запросы. Можно сделать ALTER TRIGGER ... [IN]ACTIVE, но хотелось бы перед этим получить с помощью запроса (к системным таблицам) список всех триггеров к базе (чтобы вручную каждый не прописывать отдельным запросом). Подскажите, пожалуйста, как это получше организовать? P.S. Сама выгрузка данных делается так: 1. Есть чистая БД (с аналогичной структурой рабочей базы). 2. Собираются в эту чистую БД с 1-й рабочей базы записи по всем табличкам, которые надо реплицировать во 2-ю (главную) базу. 3. Собранная информация бэкапится и высылается по e-mail в главный офис конторы. 4. Там полученная инфа разворачивается и ее необходимо залить во 2-ю (главную) базу (каждая запись помечена, что с ней нужно сделать - INSERT или UPDATE). ... при этом срабатывают триггеры, что недопустимо ... ... на этом у меня образовался затык ... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2004, 18:37:11 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Я делал так. 1. Создал пользователя, скажем, REPLICANT и роль REPLICANT_ROLE програмулина, которая делает репликацию коннектиться к базе под пользователем REPLICANT. 2. В каждом "спорном" триггере пишем следующее Код: plaintext 1. 2. 3. 4. 5. Теперь если происходит репликация с помощбю этой программы, то триггеры срабатывать не будут. (Вернее будут, но не будут производить каких-либо действий.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2004, 19:03:16 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Смотри таблицу RDB$Triggers поля RDB$Trigger_name и RDB$Relation_name(имя таблицы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2004, 19:04:40 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
В догонку Даниил Можно сделать ALTER TRIGGER ... [IN]ACTIVE .... В общем случае так делать нельзя, так как триггеры отключаются для всей базы, а не для какого-то пользователя или какой-то транзакции. Представь себе, что во время репликации в базе кто-то работает. Если ты отключишь все триггеры, то они не сработают и для того пользователя, для которого они должны были бы сработать. Что не есть гуд, иначе зачем они тогда вообще нужны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2004, 19:14:25 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
2 doroshka: Идея интересная (разделять по пользователям). Только я не понял следующего: doroshkaПредставь себе, что во время репликации в базе кто-то работает Как это? Если данные заливаются в те же таблицы, которые правят юзеры, тогда фигня с данными получится... Хотя, у меня надо делать репликацию только в одну сторону. В главном офисе работают "как-бы read-only". Хотя и могут чего-нибудь изменить, но это уже обратно в филиал не отправляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2004, 19:22:36 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 1 - 'PRE_STORE' 2 - 'POST_STORE' 3 - 'PRE_MODIFY' 4 - 'POST_MODIFY' 5 - 'PRE_ERASE' 6 - 'POST_ERASE' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2004, 19:31:32 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
2 Мимопроходящий: Огромное спасибо! А почему триггеры для "..._ERASE" не надо отключать? У меня данные при случае и удалить надо будет при репликации. ID тех записей, которые надо удалить и из какой таблички - я знаю (они при удалении в архив складываются). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 07:44:40 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Ну раз надо и ERASE, то поставь в условии <= 6. У меня в задаче удаление отсутствует как класс вообще. Т.е. у записи есть доп.поле DELETED_ON (типа TIMESTAMP), которое является признаком "удаления". Записи у которых это поле IS NOT NULL, пользователю не показываются. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 11:51:32 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. создать временно таблицу TriggerTemp, записать текущее состояние триггеров туда, потом отключить их, залить данные, включить. Конечно, когда ещё кто-то работает с базой, то так не надо))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 12:01:37 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
2 Мимопроходящий: "У меня в задаче удаление отсутствует" А как же тогда с производительностью быть? Ведь выборки медленнее работать будут (из-за "нароста" информации в одной табличке)! У меня удаленные сохраняются в отдельных табличках, но кроме того и "удаленные" и текущие записи проходят ежемесячно "чистку" (удаляется инфа старше 3-х месяцев). Для конторы это старье не нужно, зато база больше 50 метров не разрастается и все летает на стареньком серваке. Большое спасибо тебе. Думаю, что тема исчерпана... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 12:03:17 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
2 Могун: "записать текущее состояние триггеров туда" Не-е-е, они у меня в рабочем состоянии - все включены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 12:05:08 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Ну, 50 метров конечно не размер... Задачи разные бывают. Посему, делай так, как тебе удобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 12:08:39 |
|
||
|
нужно временно отключить все триггеры
|
|||
|---|---|---|---|
|
#18+
Даниил2 doroshka: Идея интересная (разделять по пользователям). Только я не понял следующего: doroshkaПредставь себе, что во время репликации в базе кто-то работает Как это? Если данные заливаются в те же таблицы, которые правят юзеры, тогда фигня с данными получится... Хотя, у меня надо делать репликацию только в одну сторону. В главном офисе работают "как-бы read-only". Хотя и могут чего-нибудь изменить, но это уже обратно в филиал не отправляется. Ну например в главном офисе директор-трудоголик сидит себе ночью в офисе и лазит в базе. В этот момент запускается репликация. Для своих нужд репликация отрубает все триггеры. И тут директору вздумалось подправить/внести какую-то запись, он начинает молотить клаву, а триггеры то не работают... Вот в этом может быть проблема. Если директор будет работать под своим юзером, а репликация под своим, то таких проблем не будет. У меня репликация из четырех филиалов происходит днем раз в час. При этом в главной базе - около 30 пользователей, которые активно смотрят, правят, вносят... Конфликты - разруливаю на уровне приложения (благо предметная область позволяет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2004, 10:30:10 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32578328&tid=1578362]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 187ms |
| total: | 412ms |

| 0 / 0 |
