Поменять поле типа ссылка, чтобы оно вместо одной таблицы ссылалось на другую, средствами Гедымина процесс длительный и непростой. Надо создать временное поле. Скопировать в него данные. Удалить исходное поле. Удалить домен. Создать новый домен. Создать новое поле. Перегнать в него исходные данные. Если к тому же поле участвует в триггере или процедуре, то придется предварительно перекомпилировать их с закоментированным текстом и восстановить в исходное состояние, после создания нового поля.
К счастью, для тех, кто знаком с устройством реляционной базы данных и не боится воспользоваться скальпелем и гвоздодёром, существует короткий обходной путь.
Предположим, в некоторой таблице
TABLE_A находится поле
USR$FIELD_A типа
USR$DFIELD_A, которое ссылается на таблицу
TABLE_B. Изменим его так, чтобы оно ссылалось на таблицу
TABLE_C. Поле
USR$NAME из
TABLE_C используется для отображения наименований объектов в выпадающих списках.
Идем Исследователь-Сервис-Атрибуты-Таблицы. Находим в списке нашу таблицу и открываем в диалоговом окне. Переходим на вкладку Скрипт.
Ищем строку вида: ALTER TABLE TABLE_A ADD CONSTRAINT USR$FKTABLE_ANN FOREIGN KEY (USR$FIELD_A) REFERENCES TABLE_B (ID) ON UPDATE CASCADE;
Из найденой строки узнаем имя ограничения. В нашем случае это USR$FKTABLE_ANN, где вместо NN будут какие-нибудь цифры.
Идем в окно SQL редактора и выполняем команду: ALTER TABLE TABLE_A DROP CONSTRAINT USR$FKTABLE_ANN
Там же набираем и выполняем команду: ALTER TABLE TABLE_A ADD CONSTRAINT USR$FKTABLE_ANN FOREIGN KEY (USR$FIELD_A) REFERENCES TABLE_C (ID) ON UPDATE CASCADE ON DELETE CASCADE Обратите внимание, что правила ON UPDATE и ON DELETE вы должны указать в соответствии с логикой вашей задачи.
Как вы поняли, первая команда удалила старую ссылку, а вторая создала новую. Остается сообщить об изменившейся ссылке Гедымину. Для начала следует в разделе Исследователь-Сервис-Атрибуты-Таблицы узнать идентификаторы таблицы TABLE_C и ее поля USR$NAME.
Узнать ИД проще простого: выделяем запись в гриде, правая кнопка мыши, команда Свойства...
Не выходя из формы просмотра с таблицами ищем TABLE_A и в ней поле USR$FIELD_A. Затем, правая кнопка мыши, комадна Свойства..., вкладка Данные:
DELETERULE -- прописываем правило для удаления записи, которое мы указали в команде создания FOREIGN KEY. Например, CASCADE, RESTRICT и т.д.
Идем Исследователь-Сервис-Атрибуты-Домены и находим тип USR$DFIELD_A. Правая кнопка мыши, комадна Свойства..., вкладка Данные:
REFTABLE -- Прописываем имя TABLE_C.
REFLISTFIELD -- Имя поля из таблицы TABLE_C, которое будет использоваться для отображения в выпадающих списках.
REFTABLEKEY -- ИД таблицы TABLE_C. Его мы определили выше.
REFLISTFIELDKEY -- ИД поля из таблицы TABLE_C, которое будет использоваться для отображения в выпадающих списка.
REFLNAME -- локализованное наименование таблицы справочника.
REFLISTLNAME -- локализованное наименование поля для отображения в выпадающих списках.
Нажимаем Ок для сохранения изменений.
В данном примере мы предполагаем, что тип
USR$DFIELD_A используется единственный раз только для нашего поля
USR$FIELD_A. В противном случае, следует создать новый тип, настроить его и вручную перевести на него ссылку, отредактировав запись для поля
USR$FIELD_A в таблице
AT_RELATION_FIELDS.
Комментариев нет:
Отправить комментарий