Burada MS DOCS okuduktan sonra .
Yabancı anahtarı değiştirmek için
Transact-SQL kullanarak bir FOREIGN KEY kısıtlamasını değiştirmek için önce varolan FOREIGN KEY kısıtlamasını silmeli ve sonra yeni tanımla yeniden oluşturmalısınız. Daha fazla bilgi için, bkz. Yabancı Anahtar İlişkilerini Silme ve Yabancı Anahtar İlişkileri Oluşturma.
Senin durumunda yeni bir FK eklemek ve eskisini silmek inanıyorum. Taramayı devre dışı bırakmak için NO CHECK
seçeneğini kullanabilirsiniz
--DROP TABLE T2
--DROP TABLE T1
CREATE TABLE T1 (
[Id] INT,
[NAME] varchar(100), CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED (id))
CREATE TABLE T2 (
t2_id int,
T1_Id INT NOT NULL
,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id)
)
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
╔══════════╦════════════╦═════════════════╦══════════╗
║ index_id ║ index_name ║ index_type_desc ║ fk_name ║
╠══════════╬════════════╬═════════════════╬══════════╣
║ 1 ║ PK_T1 ║ CLUSTERED ║ FK_T2_T1 ║
║ 2 ║ IX_T1_Id ║ NONCLUSTERED ║ NULL ║
╚══════════╩════════════╩═════════════════╩══════════╝
ALTER TABLE T2
WITH NOCHECK
ADD CONSTRAINT [FK_T2_T1_NEW] FOREIGN KEY(T1_Id)
REFERENCES T1(Id)
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
╔══════════╦════════════╦═════════════════╦══════════════╗
║ index_id ║ index_name ║ index_type_desc ║ fk_name ║
╠══════════╬════════════╬═════════════════╬══════════════╣
║ 1 ║ PK_T1 ║ CLUSTERED ║ FK_T2_T1 ║
║ 2 ║ IX_T1_Id ║ NONCLUSTERED ║ FK_T2_T1_NEW ║
╚══════════╩════════════╩═════════════════╩══════════════╝
ALTER TABLE T2
DROP CONSTRAINT FK_T2_T1
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
╔══════════╦════════════╦═════════════════╦══════════════╗
║ index_id ║ index_name ║ index_type_desc ║ fk_name ║
╠══════════╬════════════╬═════════════════╬══════════════╣
║ 1 ║ PK_T1 ║ CLUSTERED ║ NULL ║
║ 2 ║ IX_T1_Id ║ NONCLUSTERED ║ FK_T2_T1_NEW ║
╚══════════╩════════════╩═════════════════╩══════════════╝
Bu işe yarayıp yaramadığına bakın, yeni bir tane daha eklemek için yeni bir FK eklemek ve oluşturulan yeni dizine bağlı ve eski FK bırakın. Sorunun mevcut olanı bırakmak değil, bu seçeneğin size yardımcı olup olmayacağını biliyorum.
Ayrıca, Max Vernon'un yorumlarına göre: "WITH NOCHECK seçeneği yabancı anahtarın optimize edici tarafından güvenilmesini önleyecektir. Bir noktada yabancı anahtarı değiştirmeniz gerekir, böylece ALTER TABLE kullanılarak güvenilir olur ... CHECK İLE "
Bu NOCHECK
sadece yaratılış sırasında göz ardı edilecektir, ancak bütünlük karşıtlığını zorlamak için bunu belirli bir zamanda yürüttünüz.