Setelah membaca MS DOCS di sini .
Untuk memodifikasi kunci asing
Untuk mengubah batasan ASING dengan menggunakan Transact-SQL, Anda harus terlebih dahulu menghapus kendala ASING yang ada dan kemudian buat kembali dengan definisi baru. Untuk informasi lebih lanjut, lihat Menghapus Hubungan Kunci Asing dan Membuat Hubungan Kunci Asing.
Jika Anda, saya percaya menambahkan FK baru dan menghapus yang lama. Untuk menonaktifkan pemindaian, Anda dapat menggunakan NO CHECK
opsi
--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 ║
╚══════════╩════════════╩═════════════════╩══════════════╝
Lihat apakah ini berfungsi, apa yang saya coba adalah menambahkan satu lagi FK sehingga yang baru dikaitkan dengan indeks baru yang dibuat dan lepaskan FK yang lama. Saya tahu pertanyaannya bukan untuk menjatuhkan yang sudah ada tapi lihat apakah opsi ini akan membantu Anda.
Juga, sesuai komentar dari Max Vernon: "opsi WITH NOCHECK akan mencegah kunci asing dipercaya oleh pengoptimal. Pada titik tertentu, Anda harus mengubah kunci asing sehingga dipercaya menggunakan ALTER TABLE ... DENGAN PERIKSA "
The NOCHECK
hanya akan diabaikan pada saat penciptaan, tetapi untuk menegakkan contraint integritas Anda telah menjalankan ini di beberapa titik waktu.