Как удалить все триггеры в базе данных Firebird 1.5 - PullRequest
2 голосов
/ 30 августа 2010

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

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

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

Ответы [ 3 ]

3 голосов
/ 02 сентября 2010

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

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

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

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

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

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

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

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

3 голосов
/ 05 сентября 2010

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

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

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

3 голосов
/ 30 августа 2010

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

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

gbak -nodbtriggers
isql -nodbtriggers
nbackup -T

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

...