MSSQLSERVER_1785
Berlaku untuk: SQL Server
Detail
Atribut | Nilai |
---|---|
Nama Produk | SQL Server |
ID Peristiwa | 1785 |
Sumber Kejadian | MSSQLSERVER |
Komponen | SQLEngine |
Nama Simbolis | CRTFKINVTOPO |
Teks Pesan | Memperkenalkan batasan KUNCI ASING '%.ls' pada tabel '%.ls' dapat menyebabkan siklus atau beberapa jalur kaskade. Tentukan ON DELETE NO ACTION atau ON UPDATE NO ACTION, atau ubah batasan KUNCI ASING lainnya. |
Penjelasan
Anda menerima pesan kesalahan ini karena di SQL Server, tabel tidak dapat muncul lebih dari satu kali dalam daftar semua tindakan referensial bertingkat yang dimulai oleh DELETE
pernyataan atau UPDATE
. Pohon tindakan referensial bertingkat hanya boleh memiliki satu jalur ke tabel tertentu pada pohon tindakan referensial berjentai.
Pesan kesalahan seperti berikut ini dilaporkan kepada pengguna:
Server: Msg 1785, Level 16, State 1, Line 1 Memperkenalkan batasan FOREIGN KEY 'fk_two' pada tabel 'table2' dapat menyebabkan siklus atau beberapa jalur bertingkat. Tentukan ON DELETE NO ACTION atau ON UPDATE NO ACTION, atau ubah batasan KUNCI ASING lainnya. Server: Msg 1750, Tingkat 16, Status 1, Baris 1 Tidak dapat membuat batasan. Lihat kesalahan sebelumnya
Tindakan pengguna
Untuk mengatasi masalah ini, buat kunci asing yang akan membuat satu jalur ke tabel dalam daftar tindakan referensial berjenjang.
Anda dapat menerapkan integritas referensial dalam beberapa cara. Integritas Referensial Deklaratif (DRI) adalah cara paling mendasar, tetapi juga merupakan yang paling tidak fleksibel. Jika Anda membutuhkan lebih banyak fleksibilitas, tetapi Anda masih menginginkan integritas tingkat tinggi, Anda dapat menggunakan pemicu sebagai gantinya.
Informasi selengkapnya
Contoh kode berikut adalah contoh upaya pembuatan KUNCI ASING yang menghasilkan pesan kesalahan:
USE tempdb
GO
CREATE TABLE table1 (user_ID INTEGER NOT NULL PRIMARY KEY, user_name
CHAR(50) NOT NULL)
GO
CREATE TABLE table2 (author_ID INTEGER NOT NULL PRIMARY KEY, author_name
CHAR(50) NOT NULL, lastModifiedBy INTEGER NOT NULL, addedby INTEGER NOT NULL)
GO
ALTER TABLE table2 ADD CONSTRAINT fk_one FOREIGN KEY (lastModifiedby)
REFERENCES table1 (user_ID) ON DELETE CASCADE ON UPDATE cascade
GO
ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1(user_ID) ON DELETE NO ACTION ON UPDATE cascade
GO
--this fails with the error because it provides a second cascading path to table2.
ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1 (user_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
-- this works.