Как удалить все триггеры в базе данных Firebird 1.5
В целях отладки мне нужно отправить кому-то 1 таблицу из существующей базы данных Firebird 1.5.
Вместо отправки всего БД я хочу отправить только БД только с этой таблицей - без триггеров, без ограничений. Я не могу скопировать данные в другую базу данных, потому что мы просто хотим проверить, почему эта таблица вызывает проблемы.
Мне просто интересно, есть ли способ отбросить все триггеры, все ограничения и все, кроме одной таблицы (используя какой-то хитрый трюк с системными таблицами или около того)?
3 ответа
Используя инструмент GUI (лично я предпочитаю IBExpert), выполните следующую команду:
select 'DROP TRIGGER ' || rdb$trigger_name || ';' from rdb$triggers
where (rdb$system_flag = 0 or rdb$system_flag is null)
Скопируйте результат в буфер обмена, затем вставьте и выполните его в окне скрипта.
Если ваша резервная копия базы данных может переключиться на Firebird 2.1, в gbak и isql есть некоторые переключатели.
Некоторые инструменты командной строки Firebird были снабжены новыми переключателями для подавления автоматического запуска триггеров базы данных:
gbak -nodbtriggers isql -nodbtriggers nbackup -T
Эти ключи могут использоваться только владельцем базы данных и SYSDBA.
Вы можете удалить все триггеры, непосредственно удалив их из системной таблицы, например так:
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 по вашему выбору.