Questo per supplire ad una mancanza presente nell versione 2000 e cioe' appunto la possibilità di creare foreign-key di tipo on delete cascade.
Se poi si cambia la compatibilità del progetto dalla versione 2000 alla 2005/2008, INDE crea sostituisce (giustamente) tali relazioni con quelle dichiarative.
Purtroppo in SQLServer (in oracle non è così), non puo creare foreign key cicliche di tipo on delete cascade, pertanto quanto si crea una relazione tipo:
- Code: Select all
alter table STRUTTURA add constraint FK_STRUTTDOCUME
foreign key (PRG_PADRE)
references STRUTTURA on delete cascade
go
SQLServer risponde con l'errore:
Msg 1785, Level 16, State 0, Line 1
L'introduzione del vincolo FOREIGN KEY 'FK_STRUTTDOCUME' nella tabella 'STRUTTURA' può determinare la creazione di cicli o percorsi di propagazione multipli. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION oppure modificare gli altri vincoli FOREIGN KEY.
Msg 1750, Level 16, State 0, Line 1
Impossibile creare il vincolo. Vedere gli errori precedenti.
Questo problema è il motivo principare per il quale, in un mio progetto nato con la versione 2000, effettuo ancora la compilazione settando il dbtarget su SQLServer 2000 anche se poi lo installo su una versione 2008.
Insomma i trigger di INDE funzionano meglio delle foreign-key di SQLServer.
Tuttavia sento ormai la necessità di migrare verso SQLServer 2008 per sfruttare le nuove funzionalità che prima o poi verranno implementate nelle nuove versioni (come la recente implementazione delle try / catch).
Vorrei pertanto proporre una modifica sulla gestione delle FK dentro INDE che mi ricorda una funzione che ho usato con ERwin.
Sarebbe utile che nelle proprietà della relazione ci fosse un flag per dire ad inde di generare relazioni dichiarative (alter table add...) o procedurali (create trigger).