Interrogare le relazioni di chiave esterna di una tabella
Domanda
Per una determinata tabella "foo", ho bisogno di una query per generare un insieme di tabelle con chiavi esterne che puntano a foo.Sto usando Oracle 10G.
Soluzione
Questo dovrebbe funzionare (o qualcosa di simile):
select table_name
from all_constraints
where constraint_type='R'
and r_constraint_name in
(select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='<your table here>');
Altri suggerimenti
La seguente dichiarazione dovrebbe essere data ai bambini e a tutti i loro discendenti.L'ho testato su un database Oracle 10.
SELECT level, main.table_name parent,
link.table_name child
FROM user_constraints main, user_constraints link
WHERE main.constraint_type IN ('P', 'U')
AND link.r_constraint_name = main.constraint_name
START WITH main.table_name LIKE UPPER('&&table_name')
CONNECT BY main.table_name = PRIOR link.table_name
ORDER BY level, main.table_name, link.table_name
Ecco come portare la domanda di Mike un ulteriore passo avanti per ottenere il file nomi di colonne dai nomi dei vincoli:
select * from user_cons_columns
where constraint_name in (
select constraint_name
from all_constraints
where constraint_type='R'
and r_constraint_name in
(select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='<your table name here>'));
Collegamento a Documentazione in linea del database Oracle
Potresti voler esplorare il Viste del dizionario dati.Hanno i prefissi:
- Utente
- Tutto
- DBA
campione:
select * from dictionary where table_name like 'ALL%'
Continuando l'esempio di Mike, potresti voler generare script per abilitare/disabilitare i vincoli.Ho modificato solo la "selezione" nella prima riga.
select 'alter table ' || TABLE_NAME || ' disable constraint ' || CONSTRAINT_NAME || ';'
from all_constraints
where constraint_type='R'
and r_constraint_name in
(select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='<your table here>');
So che è un po' tardi per rispondere, ma lasciami rispondere comunque, alcune delle risposte sopra sono piuttosto complicate, quindi ecco una versione molto più semplice.
`SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, b.table_name parent_table, b.column_name parent_column FROM all_cons_columns a JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name join all_cons_columns b on c.owner = b.owner and c.r_constraint_name = b.constraint_name WHERE c.constraint_type = 'R' AND a.table_name = 'your table name'`
select distinct table_name, constraint_name, column_name, r_table_name, position, constraint_type
from (
SELECT uc.table_name,
uc.constraint_name,
cols.column_name,
(select table_name from user_constraints where constraint_name = uc.r_constraint_name)
r_table_name,
(select column_name from user_cons_columns where constraint_name = uc.r_constraint_name and position = cols.position)
r_column_name,
cols.position,
uc.constraint_type
FROM user_constraints uc
inner join user_cons_columns cols on uc.constraint_name = cols.constraint_name
where constraint_type != 'C'
)
start with table_name = '&&tableName' and column_name = '&&columnName'
connect by nocycle
prior table_name = r_table_name
and prior column_name = r_column_name;
Scarica la Guida di riferimento Oracle per 10G che spiega le tabelle del dizionario dati.
Le risposte sopra sono valide, ma controlla le altre tabelle che potrebbero riguardare i vincoli.
SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';
Infine, procurati uno strumento come Toad o SQL Developer che ti permetta di sfogliare queste cose in un'interfaccia utente, devi imparare a usare le tabelle ma dovresti usare anche un'interfaccia utente.