FireBird добавляет ограничение удаления - PullRequest
1 голос
/ 28 октября 2010

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

Как мне это сделать?

1 Ответ

2 голосов
/ 28 октября 2010

Чтобы сгенерировать скрипт, который по очереди отбрасывает все внешние ключи, используйте следующий скрипт в любом firebird> = 2.0 (возможно, он работает на pre 2.0, просто не могу вспомнить, изменился ли словарь данных в задействованной системной таблице):

--generate a script which drops all foreign keys
--by jachguate http://jachguate.wordpress.com
--             http://stackoverflow.com/users/255257/jachguate
select 'alter table '||c.rdb$relation_name||' drop constraint '||c.rdb$constraint_name||';' script_lines
  from rdb$relation_constraints c
 where c.rdb$constraint_type = 'FOREIGN KEY';

Редактировать

Чтобы сгенерировать скрипт для повторного создания всех внешних ключей, этот скрипт сделает свое дело (для firebird> = 2.0).Не забудьте запустить это до фактического удаления внешних ключей.

select 'alter table '||trim(c.rdb$relation_name)
       ||' add constraint '||trim(c.rdb$constraint_name)
       ||' foreign key ('
       ||(select list(trim(imast.rdb$field_name)) from rdb$index_segments imast where rdb$index_name = c.rdb$index_name)
       ||') references '||trim(uqc.rdb$relation_name)
       ||' ('
       ||(select list(trim(idet.rdb$field_name)) from rdb$index_segments idet where rdb$index_name = uqc.rdb$index_name)
       ||');'
  from rdb$relation_constraints c
       inner join rdb$ref_constraints rc
          on rc.rdb$constraint_name = c.rdb$constraint_name
       inner join rdb$relation_constraints uqc
          on uqc.rdb$constraint_name = rc.rdb$const_name_uq;

С наилучшими пожеланиями.

...