В документации указано, что выходная таблица может не участвовать в ограничениях внешнего ключа (или проверять ограничения, а также не может включать триггеры, определенные для нее - но эти случаи здесь не рассматриваются). Ошибка Msg 332 является проявлением этого.
( ЭТО НЕ РЕКОМЕНДУЕТСЯ. См. Обновление ниже)
Однако я обнаружил, что это ограничение подрывается, если ограничение внешнего ключа отключено и повторно включено с помощью NOCHECK/CHECK
даже после повторного включения ограничения . Другими словами: одного цикла отключения-включения достаточно, чтобы сделать ограничение FK «невидимым» для запрета «вывод в внешний ключ». Обратите внимание на модификацию ниже:
IF OBJECT_ID ('dbo.forn') IS NOT NULL
begin
alter table dbo.forn drop constraint FK_forn_prim
DROP TABLE dbo.forn;
end
IF OBJECT_ID ('dbo.prim') IS NOT NULL
DROP TABLE dbo.prim;
go
CREATE TABLE dbo.prim (c1 int PRIMARY KEY);
-- note change here:
CREATE TABLE dbo.forn (c1 int );
alter TABLE dbo.forn with nocheck add CONSTRAINT FK_forn_prim FOREIGN KEY (c1) REFERENCES dbo.prim(c1);
alter TABLE dbo.forn check CONSTRAINT FK_forn_prim ;
-- end change
go
INSERT INTO dbo.prim
OUTPUT inserted.c1 INTO dbo.forn
select 1;
Следующая ошибка (нарушение ограничения), так что вы знаете, что DRI все еще работает:
INSERT INTO dbo.prim
OUTPUT inserted.c1 + 1 INTO dbo.forn
select 2;
Учитывая запрет в документах, я допускаю, что это кажется сомнительным. У меня есть вопрос , ожидающий ответа на этот вопрос, хотя он не был хорошо принят.
UPDATE
Ранее упомянутый вопрос был ответил , и новая информация лишает законной силы этот ответ. Оставьте это как предупреждение для других, на случай, если они наткнутся на эту, казалось бы, случайную дыру.
В результате: alter TABLE dbo.forn check CONSTRAINT FK_forn_prim ;
повторно включает ограничение, но оставляет его в «недоверенном» состоянии, поэтому оно не может быть полностью использовано механизмом SQL для оптимизации индекса и тому подобного. Не рекомендуется Правильный способ повторного включения -
alter table dbo.forn with check check CONSTRAINT FK_forn_prim;