2009-07-23 1 views
17

Ho ereditato uno schema quindi non ho completa conoscenza/fiducia in ciò che è presente.Oracle tutti i riferimenti alle chiavi esterne

Ho una tabella di progetto con un projectId. Ci sono un sacco di altre tabelle che fanno riferimento a questa tabella per id del progetto. Quello che voglio fare è eseguire una query per stabilire:

  1. Quali tabelle hanno riferimenti chiave esterna per la tabella progetto sul progetto id
  2. Quali tabelle hanno una colonna chiamata progetto di id (in chiavi esterne caso non sono impostati).

Se era SQL Server, so come interrogare i metadati, ma come faccio a farlo in Oracle?

risposta

22

1)

select table_name 
    from all_constraints 
where r_constraint_name = [your pk/uk constraint on PROJECTS(id)] 

2)

select table_name 
    from all_tab_columns 
where column_name = 'PROJECT_ID' 

È possibile aggiungere un predicato aggiuntivo contenente la colonna PROPRIETARIO.

Cordiali saluti, Rob.

1

1): SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME='R' and R_CONSTRAINT_NAME='xxx'

dove xxx è il nome del vincolo di chiave primaria nella tabella progetto

2): SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME='PROJECT_ID'

+1

I vincoli di chiave esterna possono potenzialmente incrociare schemi, quindi non andrei per user_constraints. Idem per user_tab_columns. –

+0

Rob: Dipende davvero. Nel mio ambiente, l'utente _... è sufficiente, all_tab_columns darebbe risultati fuorvianti. –

+1

ammoQ: true, dipende. utente _... potrebbe essere sufficiente. Ma guarda il titolo del thread: "TUTTI i riferimenti alle chiavi straniere" ... –

0

Le r_constraint_name risposte qui non sembra funzionare per me, non so perché come io sono nuovo a Oracle me stesso, ma questo ha funzionato:

SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = '<constraint>'; 
18

Ok. Qui una richiesta che ti danno la tabella di riferimento e la colonna:

SELECT 
c_list.CONSTRAINT_NAME as NAME, 
substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN, 
c_dest.TABLE_NAME as DEST_TABLE, 
substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN 
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest 
WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME 
AND c_list.OWNER    = c_src.OWNER 
AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME 
AND c_list.OWNER    = c_dest.OWNER 
AND c_list.CONSTRAINT_TYPE = 'R' 
AND c_src.OWNER  = '<your-schema-here>' 
AND c_src.TABLE_NAME = '<your-table-here>' 
GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME, 
    c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME; 

che vi danno qualcosa di simile:

NAME     |SRC_COLUMN  |DEST_TABLE   | DEST_COLUMN 
----------------------|----------------|----------------------|----------- 
CFK_RUB_FOR   |FOR_URN   |T03_FORMAT   |FOR_URN 
CFK_RUB_RUB   |RUB_RUB_URN  |T01_RUBRIQUE   |RUB_URN 
CFK_RUB_SUP   |SUP_URN   |T01_SUPPORT   |SUP_URN 
CFK_RUB_PRD   |PRD_URN   |T05_PRODUIT   |PRD_URN 

Si può dimenticare la funzione substr() se il risultato è utilizzabile senza. Questo non è il mio caso.

0

Il mio problema era leggermente diverso. Ho una tabella e volevo sapere a livello di programma quali altre tabelle/colonne fa riferimento.

Ho iniziato con la risposta di Stan sopra, ma questo non mi ha dato esattamente quello che mi serviva, così mi si avvicinò con questo, che ho posto qui nel caso qualcuno altro ha il mio problema:

WITH src as 
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name 
    FROM ALL_CONSTRAINTS ac, all_cons_columns accs 
WHERE ac.owner = '<owner>' 
    AND ac.constraint_type = 'R' 
    AND ac.table_name = '<src_table>' 
    AND accs.owner = ac.owner 
    AND accs.table_name = ac.table_name 
    AND accs.constraint_name = ac.constraint_name 
ORDER BY ac.table_name, ac.constraint_name, accs.position), 
dst as 
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position 
    FROM ALL_CONSTRAINTS ac, all_cons_columns accs 
WHERE ac.owner = '<owner>' 
    AND accs.owner = ac.owner 
    AND accs.table_name = ac.table_name 
    AND accs.constraint_name = ac.constraint_name 
ORDER BY ac.table_name, ac.constraint_name, accs.position) 
SELECT src.table_name as src_table, 
     dst.table_name as dst_table, 
     src.constraint_name as src_constraint, 
     src.column_name as src_column, 
     dst.column_name as dst_column, 
     src.position as position 
    FROM src,dst 
WHERE src.r_constraint_name = dst.constraint_name 
    AND src.position = dst.position 
0

Utilizzare questo query.

select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME 
    from all_constraints b, all_cons_columns a 
    where r_constraint_name = 'Constraint_Name' and a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;