2010-09-30 6 views
10

Sto tentando di fare riferimento a una vista con una chiave esterna, ma sto ottenendo questo errore:chiave esterna che fa riferimento una vista in Oracle

"Errore: ORA-02270: nessuna corrispondenza univoca o primaria chiave per questa colonna- lista "

Tuttavia, ho creato una chiave primaria su questa vista e l'ho verificata nella scheda Vincoli in TOAD.

Questa è la tavola che sto tentando di creare:

CREATE TABLE QUESTION 
( 
    QUESTION_ID    INTEGER not null, 
    CREATED_USER_ID   INTEGER not null,  
    CONSTRAINT PK_QUESTION PRIMARY KEY (QUESTION_ID), 
    CONSTRAINT FK_USER 
     FOREIGN KEY (CREATED_USER_ID) 
     REFERENCES SOME_VIEW(VIEW_ID) 
); 

SOME_VIEW è una vista basato su un altro punto di vista che punta alla tabella di dipendente in un altro schema.

+1

Raccolgo che voglio/ho bisogno di questo per avere una singola chiave esterna che potrebbe provenire da più tabelle, perché una colonna può avere più vincoli di chiave esterna contro una singola colonna ... ma il valore nella colonna dovrebbe esistono in tutte le tabelle relative ai vincoli stranieri. Spero che questo sia un mezzo per la transizione del database, e solo temporaneo. –

+0

In altre parole, SOME_VIEW, OTHER_VIEW e BASE_TABLE devono avere tutti gli stessi valori per far funzionare questo vincolo di chiave esterna? – echoblaze

+1

Correlati, sebbene vecchi (2006): http://thinkoracle.blogspot.com/2006/11/view-constraints.html –

risposta

11

Indipendentemente dalla possibilità di creare chiavi esterne per le viste, non è davvero l'idea migliore da implementare.

viste del database sono stati progettati per consentire all'utente comodamente interrogare alcuni dati di cui ha bisogno, ma allo stesso tempo a servire come una barriera di sicurezza, per nascondere tutte le struttura del database, incluse le tabelle, i vincoli dati in tabelle, e, sì, anche la tabella riferimenti incrociati.

Quindi, una buona pratica per me sarebbe quella di fare riferimento a un tavolo esistente da uno nuovo, nonostante la sua residenza in altro schema.

+0

+1: i miei pensieri esattamente e l'articolo che mi è piaciuto prima. –

+0

ok, grazie per tutto il feedback. abbiamo deciso di eseguire join a livello di applicazione anziché a livello di database – echoblaze

+0

C'è qualcosa chiamato viste di ruolo nella modellazione DWH dimensionale. In tal caso questo tipo di vincoli di chiave estera sembra comunque essere una buona pratica. –

-2

La chiave esterna contro una vista è probabilmente ciò che sta causando il problema.

+1

Non è possibile avere una chiave esterna contro una vista? – echoblaze

+0

Vedere http://bytes.com/topic/oracle/answers/64610-create-primary-key-view – igelkott