Реализация обратной совместимости никогда не бывает простой.Представьте, что у вас есть (версия 1):
CREATE TABLE T1 (
ID int not null primary key,
ColA varchar(10) not null
)
CREATE TABLE T2 (
ID int not null primary key,
T1ID int not null,
ColB varchar(10) not null,
constraint FK_T2_T1 FOREIGN KEY (T1ID) references T1
)
, а теперь, для версии 2, вы хотите ввести:
CREATE TABLE T1_T2 (
T1ID int not null,
T2ID int not null,
constraint PK_T1_T2 PRIMARY KEY (T1,T2),
constraint FK_T1_T2_T1 FOREIGN KEY (T1ID) references T1,
constraint FK_T1_T2_T2 FOREIGN KEY (T2ID) references T2
)
И, как я понимаю из вашего вопроса, вымыслительная активность на T1_T2
может поддерживать существующий столбец T1ID
в T2
для обратной совместимости.
Конечно, возможно , чтобы это произошло, но у вас есть целая нагрузкапроблемы для решения:
- Какое значение
T1ID
вы записываете в T2
, если в T1_T2
? - есть несколько строк, что должно произойти, что должно произойтив
T1ID
in T2
- установить NULL, выбрать другое значение? - Что если все строки, соответствующие
T2ID
, будут удалены из T1_T2
.Строка из T2
должна быть удалена?T1ID
установить NULL? - Если приложение версии 1 обновляет
T1ID
в T2
, а в T1_T2
нет строк, это ошибка или должна быть вставлена новая строка? - Может ли приложение версии 1 предположить, что оно может удалить строку из
T1
, если ни одна строка в T2
не имеет этого конкретного T1ID
Я уверен, что есть еще многоЧто ж.Вы можете решить все эти проблемы, но вам никогда не удастся идеально смоделировать старое поведение для 100% использования схемы Версии 1.
Если вы можете решить все вышеперечисленноепроблемы, к вашему удовлетворению, тогда да, вы можете выполнять эти задачи обслуживания с помощью триггеров.Как я уже сказал, это не будет 100%, поэтому вам, возможно, все же придется настроить приложения версии 1, чтобы исправить некоторые из их ожиданий.