у меня есть процесс перемещения строк из одной базы данных в другую. Из-за некоторых круговых цепочек ссылок внешнего ключа я не могу удалить строки из старой базы данных и не могу вставить их в новую базу данных.
Поскольку вся операция происходит в транзакции1, я хочу, чтобы SQL Server игнорировал сбои ссылочной целостности, пока я не вызову COMMIT TRANSACTION
.
Например2:
Table: Turboencabulators Table: Marselvanes
========================= =======================
PK TurboencabulatorID int /-> PK MarselvaneID int
^ MarselvanesID int --/ HasGrammeter bit
| PantametricFan varchar(50)
+------------------------------- TurboencabulatorID int
Если я попытаюсь вставить turboencabulator в новую таблицу, произойдет сбой без уже существующего marselvane. Та же проблема с обратным порядком.
При попытке удалить старые строки я не могу удалить одну, пока не будет удалена другая.
я пробовал использовать n-этапную систему, где все строки вставляются с любыми столбцами, находящимися под ограничением внешнего ключа, установленным в null. Затем я обновляю все вставленные строки, помещая правильные отсутствующие значения. Затем, чтобы удалить исходные строки, я обнуляю все столбцы, затронутые FK, а затем удаляю фактические строки3.
Что бы я действительно предпочел, так это просто выполнять свои операции T-SQL, и чтобы SQL Server не сообщал мне, пока я не попытаюсь вызвать фиксацию.
Примечания
1распределенный
2надуманный гипотетический
3что я больше не делаю