Oracle e politiche per la gestione della violazione di integrità refer...

venerdì 27 agosto 2010 - 11.09
Tag Elenco Tags  Windows XP  |  Oracle 10g  |  Office 2007  |  Firefox

nioMatrix Profilo | Junior Member

Salve a tutti,
stò preparando l'esame di Basi di Dati e mi stò avvicinando per la prima volta al mondo dei DBMS e quindi avrei qualche domandina da farvi XD

Supponiamo di avere il sequente schemda di una basi di dati relazionele:

AEREOPORTI(CodAereoporto, Nome, Città)
VOLI(NumVolo, Partenza:AEREOPORTI, Arrivo:AEREOPORTI)

Il suddetto schema lo implemento con le sequenti istruzioni SQL:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ora vorrei sapere perchè il DBMS( Oracle 10g Express) mi rifiuta lo statement per la creazione di VOLI e soprattutto credo che il problema risieda nel fatto che ho definito due politiche di gestione di violazione del vincolo di chiave esterna(ON DELETE ON UPDATE).... forse non è possibile fare ciò?????

Inoltre è possibile, utilizzando ALTER SCHEMA, aggiungere un vincolo di NOT NULL sull'attributo Città della relazione AEREOPORTI?????

Grazie mille di tutto,
Salve.


lbenaglia Profilo | Guru

>Il suddetto schema lo implemento con le sequenti istruzioni SQL:
>
>CREATE TABLE AEREOPORTI(
> CodAereoporto CHAR(3) PRIMARY KEY,
> Nome VARCHAR(50) NOT NULL,
> Città VARCHAR(50)
>);
>
>CREATE TABLE VOLI(
> NumVolo INTEGER PRIMARY KEY,
> Partenza CHAR(3) NOT NULL,
> Arrivo CHAR(3) NOT NULL,
>CONSTRAINT FK1 FOREIGN KEY(Partenza) REFERENCES AEREOPORTI(CodAereoporto)
>ON DELETE CASCADE ON UPDATE CASCADE,
>CONSTRAINT FK2 FOREIGN KEY(Arrivo) REFERENCES AEREOPORTI(CodAereoporto)
>ON DELETE CASCADE ON UPDATE CASCADE
>);
>
>Ora vorrei sapere perchè il DBMS( Oracle 10g Express) mi rifiuta
>lo statement per la creazione di VOLI e soprattutto credo che
>il problema risieda nel fatto che ho definito due politiche di
>gestione di violazione del vincolo di chiave esterna(ON DELETE
>ON UPDATE).... forse non è possibile fare ciò?????

Ciao Ciro,

Definendo due FK con operazioni cascade che fanno riferimento ad una medesima tabella generi percorsi multipli di aggiornamenti ed eliminazioni e questa operazione non è ammessa.
Ti allego il messaggio di errore generato da SQL Server quando tento di definire la tabella Voli:

Msg 1785, Level 16, State 0, Line 11
Introducing FOREIGN KEY constraint 'FK2' on table 'VOLI' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Msg 1750, Level 16, State 0, Line 11
Could not create constraint. See previous errors.

I Books Online riportano: The series of cascading referential actions triggered by a single DELETE or UPDATE must form a tree that contains no circular references. No table can appear more than one time in the list of all cascading referential actions that result from the DELETE or UPDATE. Also, the tree of cascading referential actions must not have more than one path to any specified table. Any branch of the tree is ended when it encounters a table for which NO ACTION has been specified or is the default.

Puoi risolvere elmininando le operazioni cascade da almeno uno dei 2 constraint di FK. Comunque se vuoi fare in modo che eliminando un Aeroporto vengano eliminati anche tutti i voli puoi implementare questa regola mediante trigger di UPDATE/DELETE.

>Inoltre è possibile, utilizzando ALTER SCHEMA, aggiungere un
>vincolo di NOT NULL sull'attributo Città della relazione AEREOPORTI?????
Questa è la definizione di Schema per Oracle Database:
http://st-curriculum.oracle.com/obe/db/10g/r1/2day_dba/schema/schema.htm

Il comando che invece devi utilizzare è ALTER TABLE:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_3001.htm

>Grazie mille di tutto,
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

nioMatrix Profilo | Junior Member

Ah ho cpt, xrò se io elimino FK2 su FK1 sussiste sempre lo stesso problema, cioè il DBMS non mi permette di definire puù politiche XD
Forse c'è una sintassi specifica x fare ciò ke ho chiesto???
Grz mille x la risposta

lbenaglia Profilo | Guru

>Ah ho cpt, xrò se io elimino FK2 su FK sussiste sempre lo stesso
>problema, cioè il DBMS non mi permette di definire puù politiche
>XD
Cosa intendi con "se io elimino FK2 su FK sussiste sempre lo stesso problema"?

Osserva (SQL Server 2008 R2):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


>Forse c'è una sintassi specifica x fare ciò ke ho chiesto???
No, stai commettendo un errore concettuale.

>Grz mille x la risposta
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

nioMatrix Profilo | Junior Member

Sai che succede????
Se copio il tuo esatto statement nel mio DBMS (già sn state implementate le altre relazioni) lui mi dice "ORA-00907: parentesi chiusa mancante"
questo problema è sicuramente legato alle politiche ON UPDATE e ON DELETE xkè se ne cancello almeno una il tutto funziona....
Secondo te il problema potrebbe essere di ORACLE 10g Express Edition che nn permette di definire più regole di giestione delle chiavi esterne?????

lbenaglia Profilo | Guru

>Sai che succede????
>Se copio il tuo esatto statement nel mio DBMS (già sn state implementate
>le altre relazioni) lui mi dice "ORA-00907: parentesi chiusa
>mancante"
Hai totlo "USE tempdb" ed il messaggio di output, vero?

>questo problema è sicuramente legato alle politiche ON UPDATE
>e ON DELETE xkè se ne cancello almeno una il tutto funziona....
Infatti DEVI cancellarne almeno una.

>Secondo te il problema potrebbe essere di ORACLE 10g Express
>Edition che nn permette di definire più regole di giestione delle
>chiavi esterne?????
Ti ripeto per la terza volta che puoi abilitare le operazioni cascade solo se non crei ricorrenze cicliche o path multipli (come nel tuo caso).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

nioMatrix Profilo | Junior Member

L'istruzione USE tempdb me la da come non valida forse xkè è specifica di SQL Server.
Poi dici che ne devo cancellare almeno una, ma nel tuo codice non l'hai fatto... forse mi sn espresso male.
Il vincolo FK2 eliminalo proprio, fai conto come se nn esistesse e tieniti solo il vincolo FK1....
Quindi se io nel mio DBMS copio il codice che hai scritto tu, tranne la riga ove definisci FK2, questo non fa nulla perchè su "FK1" sono definite due politiche ON DELETE e ON UPDATE....cosa che tu hai ftt e che vorrei fare ank'io XD

nioMatrix Profilo | Junior Member

As scusami mi sn accorto che il problema è un altro.... mi dice parola chiave mancante quando uso la clausola ON UPDATE CASCADE XD
Scusami tnt

PS: Ho scaoperto che oracole non supporta ON UPDATE... scusami x il disturbo e ti ringrazio ankora di tutto
Ciao!

lbenaglia Profilo | Guru

>L'istruzione USE tempdb me la da come non valida forse xkè è
>specifica di SQL Server.
Esatto.

>Poi dici che ne devo cancellare almeno una, ma nel tuo codice
>non l'hai fatto... forse mi sn espresso male.
L'ho fatto, FK2 NON HA operazioni cascade.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5