Condividi tramite


MSSQLSERVER_1785

Si applica a: SQL Server

Dettagli

Attributo valore
Nome prodotto SQL Server
ID evento 1785
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico CRTFKINVTOPO
Testo del messaggio L'introduzione del vincolo FOREIGN KEY '%.ls' nella tabella '%.ls' può determinare la creazione di cicli o più percorsi di propagazione. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION oppure modificare gli altri vincoli FOREIGN KEY.

Spiegazione

Questo messaggio di errore viene generato perché in SQL Server una tabella non può essere visualizzata più di una volta in un elenco di tutte le azioni referenziali di propagazione avviate da un'istruzione DELETE o UPDATE. L'albero delle azioni referenziali di propagazione deve avere un solo percorso a una determinata tabella nell'albero delle azioni referenziali di propagazione.

Viene segnalato all'utente un messaggio di errore simile al seguente:

Server: Msg 1785, Level 16, State 1, Line 1 Introducing FOREIGN KEY constraint 'fk_two' on table 'table2' may cause cycles or multiple cascade paths. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION oppure modificare gli altri vincoli FOREIGN KEY. Server: Messaggio 1750, Livello 16, Stato 1, Riga 1 Non è stato possibile creare un vincolo. Vedere gli errori precedenti

Azione utente

Per risolvere il problema, creare una chiave esterna con cui creare un singolo percorso di una tabella in un elenco di azioni referenziali di propagazione.

È possibile applicare l'integrità referenziale in diversi modi. L'integrità referenziale dichiarativa è la soluzione più semplice, ma è anche quella meno flessibile. Se è necessaria una maggiore flessibilità, ma si vuole comunque un livello elevato di integrità, è possibile usare i trigger.

Ulteriori informazioni

Il codice di esempio seguente è un esempio di tentativo di creazione di FOREIGN KEY che genera il messaggio di errore seguente:

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.

Vedi anche

Integrità referenziale a catena