2010-08-30 4 views
2

Для целей отладки мне нужно отправить кому-то одну таблицу существующей базы данных Firebird 1.5.Как удалить все триггеры в базу данных Firebird 1.5

Вместо отправки целого db, я хочу отправить только db только с этой таблицей - никаких триггеров, никаких ограничений. Я не могу скопировать данные в другой db, потому что это просто то, что мы хотим проверить - почему эта таблица столкнулась с проблемами.

Мне просто интересно, есть ли способ сбросить все триггеры, все ограничения и все, кроме одной таблицы (используя какой-то умный трюк с системными таблицами или около того)?

ответ

3

Использование графического инструмента (я лично предпочитаю IBExpert) выполнить следующую команду:

select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers 
    where (rdb$system_flag = 0 or rdb$system_flag is null) 

Скопировать результат в буфер обмена и вставить и выполнить в окне сценария исполнительной власти.

+0

K.: У вас есть больше этих предложений «выбрать ..»? Выбор всех видов ограничений f.i. ? – Edelcom

3

Если ваша резервная копия базы данных может переключиться на Firebird 2.1, есть переключатель в gbak and isql.

Некоторые Firebird инструменты командной строки, которые были снабжены новыми коммутаторами подавляют автоматический обжиг триггеров базы данных:

gbak -nodbtriggers 
isql -nodbtriggers 
nbackup -T 

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

3

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

delete from rdb$triggers 
    where (rdb$system_flag = 0 or rdb$system_flag is null); 

Обратите внимание, что обычный способ использования drop trigger, безусловно, предпочтительнее, но это может быть сделано.

Вы также можете отказаться от ограничений, выполнив инструкции DDL, но для перечисления ограничений и их сброса в сценарий SQL вам понадобится функциональность execute block, которой не обладает Firebird 1.5.

Существуют аналогичные утверждения для удаления других объектов базы данных, но фактически их выполнение может быть намного сложнее из-за зависимостей между объектами. Вы не можете удалить какой-либо объект, если от него зависит другой объект. Это может стать очень сложным из-за круговых ссылок, где два (или даже больше) объекта зависят друг от друга, образуя цикл, поэтому ни один из них не может быть отброшен первым.

Путь вокруг этого - разбить одну из зависимостей. Процедура, например, которая имеет зависимости от других объектов, может быть изменена, чтобы иметь пустое тело, после чего она больше не зависит от этих других объектов, поэтому они могут быть затем удалены. Удаление внешних ключей - это еще один способ устранения зависимостей между таблицами.

Я не знаю ни одного инструмента, реализующего такое частичное удаление объектов базы данных, ваш прецедент - это ИМО, далекий от общего. Тем не менее, вы можете взглянуть на FlameRobin source code, который имеет определенное количество обнаружения зависимостей в коде, который используется для создания сценариев DDL или операторов модификации для объектов базы данных. Вооружившись этой информацией, вы можете написать свой собственный инструмент для этого.

Если это одно время, этого может быть достаточно, чтобы сделать это вручную. Для этого используйте любой инструмент управления Firebird по вашему выбору.