FOREIGN KEY на системные таблицы
Anjey aka PM
Дата: 06.10.2005 10:38:00
Столкнулся с проблемкой. Надо было мне в одной таблице дополнительным полем держать название процедуры. Также надо было чтобы при убиении оной запись каскадно удалялась. Лечше не спрашивайте зачем - так заказали добрые дяди :)
Решил сделать FK на RDB$PROCEDURES на поле RDB$PROCEDURE_NAME.
Пришлось для этого добавить индекс RDB$PROCEDURES_NAME уникальный ибо иначе внешний ключ делать не получалось.
Все бы ничего и работает прекрасно, но! После бэкапа припопытке восстановления БД слетает gbak при попытке восстановить вышеупомянутый внешний ключ. Насколько я заметил (если восстанавливать с отключенными индексами) индекс RDB$PROCEDURES_NAME либо не восстанавливается вообще либо восстанавливается ПОСЛЕ восстановления внешнего ключа (так и не понял от чего это зависит) что естественно приводит к ошибке когда восстанавливаешь с активными индексами.
пробовал на FB 1.5.2 и 1.5.3.
Может кто сталкивался с проблемой Б/Р индексов по системным таблицам?
Dik76
Дата: 06.10.2005 10:44:21
Сам я таким не занимался, но может достаточно было триггера на удаление?
--
Dik76
Posted via ActualForum NNTP Server 1.3
kdv
Дата: 06.10.2005 10:44:55
эта. процесс restore не восстанавливает базу из бэкапа, а СОЗДАЕТ ЕЕ точно так же как при create database. Потом - восстанавливает твои объекты, и заливает туда данные. Соответственно, НИКАКИЕ изменения системных таблиц просто не попадают в бэкап и не могут быть восстановлены из бэкапа, принципиально.
Обломись.
Anjey aka PM
Дата: 06.10.2005 10:46:11
Тригер насколько я помню не видит записи созданные в контексте других транзакций а внешний ключ видит. Но это не суть важно.
Честно говоря я уже даже не уверен отресторится ли тригер после бэкапа :)
Dik76
Дата: 06.10.2005 10:56:01
Anjey |
AaP> Честно говоря я уже даже не уверен отресторится ли тригер после бэкапа
|
В свете сказанного kdv видимо нет...
В принципе ничего не мешает сделать скрипт,
который будет модифицировать системные таблицы после успешного рестора.
--
Dik76
Posted via ActualForum NNTP Server 1.3
Anjey aka PM
Дата: 06.10.2005 11:03:31
да понятно что создает НО мой индекс он ведь не имеет флага "system" почему бы его не восстановить тоже?
kdv
Дата: 06.10.2005 11:03:31
может я несколько переборщил, и чего-то там добавленное снаружи остается, но именно в плане модификации системных таблиц - увы, все так как я сказал.
create database (и при restore) происходит из "болванки", потому что в rdb$relations упоминается rdb$relations, как минимум :-)
Anjey aka PM
Дата: 06.10.2005 11:04:14
в догонку: в бэкап он ведь ложится
Anjey aka PM
Дата: 06.10.2005 11:05:17
Блин, сори за спам... :)
и еще в догонку: ЗАЧЕМ тогда бэкапить внешний ключ? ;-)
kdv
Дата: 06.10.2005 11:09:53
у тебя индекс создан на системную таблицу. Это - модификация системной таблицы, грубо говоря. см. выше. А эачем бэкапить FK - так он же от твоей таблицы, а не от системной, но на системную. Отсюда и затык.
С точки зрения РСУБД ты не имеешь права к системным таблицам привязываться. То есть, для тебя это должно быть "черным ящиком".