Как отбросить все триггеры в базе данных Firebird 1.5

StackOverflow https://stackoverflow.com/questions/3599185

Вопрос

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

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

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

Это было полезно?

Решение

Использование инструмента 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 далеко не общим. Однако вы сможете взглянуть на Исходный код фламеробина Что имеет определенное количество обнаружения зависимостей в коде, который используется для создания сценариев DDL или отчетности модификации для объектов базы данных. Вооруженные с помощью этой информации вы можете написать свой собственный инструмент для этого.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top