It is currently 7 June 2025, 19:38 Advanced search

Integrità referenziale Dichiarativa (fk) o procedurale (tr)

Questo forum è nato con lo scopo di raccogliere le proposte di modifica di Instant Developer e discuterne insieme.

Integrità referenziale Dichiarativa (fk) o procedurale (tr)

Postby teopost » 21 July 2011, 8:30

Se su SQLServer si crea una foreign-key on delete cascade, nella generazione del codice per la versione 2000 INDE crea sullla tabella padre (per implementare la delete) e sulla tabella figlia (per implementare la restrizione) i relativi trigger che simulano la relazione.
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).
Oracle Database Administrator
User avatar
teopost
 
Posts: 211
Joined: 26 October 2010, 20:46

Re: Integrità referenziale Dichiarativa (fk) o procedurale (

Postby a.maioli » 22 July 2011, 7:09

Ma c'è già: flag USA TRIGGER dell'oggetto relazione.
User avatar
a.maioli
Pro Gamma
Pro Gamma
 
Posts: 1090
Joined: 29 September 2010, 12:47

Re: Integrità referenziale Dichiarativa (fk) o procedurale (

Postby teopost » 22 July 2011, 12:01

Ma dai. Mi vergogno.
Togliete questo post!
Oracle Database Administrator
User avatar
teopost
 
Posts: 211
Joined: 26 October 2010, 20:46

Re: Integrità referenziale Dichiarativa (fk) o procedurale (

Postby r.bianco » 22 July 2011, 12:14

=)
only work and no play makes jack a dull boy
r.bianco
 
Posts: 4979
Joined: 8 November 2010, 16:46


Return to Proposte di modifica

Who is online

Users browsing this forum: No registered users and 14 guests