it-swarm-eu.dev

Abfrage der Fremdschlüsselbeziehungen einer Tabelle

Für eine gegebene Tabelle 'foo' brauche ich eine Abfrage, um einen Satz von Tabellen zu generieren, die Fremdschlüssel haben, die auf foo zeigen. Ich verwende Oracle 10G.

22
Mark Roddy

Das sollte funktionieren (oder etwas in der Nähe):

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>'); 
41
Mike Monette

Die folgende Aussage sollte den Kindern und ihren Nachkommen geben. Ich habe es in einer Oracle 10-Datenbank getestet.

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
4
richard.j.lewis

Gehen Sie wie folgt vor, um Mikes Abfrage einen Schritt weiter zu führen, um Spaltennamen aus den Constraint-Namen zu erhalten:

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>'));
2
matt1616

link zu Oracle Database Online-Dokumentation

Möglicherweise möchten Sie die Data Dictionary-Ansichten erkunden. Sie haben die Präfixe:

  • Nutzer
  • Alles
  • DBA

probe:

select * from dictionary where table_name like 'ALL%' 

Wenn Sie das Beispiel von Mike fortsetzen, möchten Sie möglicherweise Skripts generieren, um die Einschränkungen zu aktivieren/deaktivieren. Ich habe nur die Auswahl in der ersten Zeile geändert.

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>');
1
Tony R

Ich weiß, dass es irgendwie spät ist zu antworten, aber lassen Sie mich trotzdem antworten. Einige der obigen Antworten sind ziemlich kompliziert. Hier ist eine viel einfachere Einstellung.

 `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 UND a.constraint_name = c.constraint_name 
 Fügen Sie all_cons_columns b auf c.owner = b.owner und c.r_constraint_name = b.constraint_name 
 WHERE c.constraint_type hinzu = 'R' 
 UND a.tabellenname = 'Ihr Tabellenname' '
1
arvnq
select      acc.table_name, acc.constraint_name 
from        all_cons_columns acc
inner join all_constraints ac
    on acc.constraint_name = ac.constraint_name
where       ac.r_constraint_name in (
    select  constraint_name
    from    all_constraints
    where   table_name='yourTable'
    );
0
Hiram

Laden Sie das Oracle Reference Guide für 10G herunter, in dem die Data-Dictionary-Tabellen erläutert werden.

Die obigen Antworten sind gut, aber überprüfen Sie die anderen Tabellen, die sich auf Einschränkungen beziehen.

SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';

Holen Sie sich schließlich ein Tool wie Toad oder SQL Developer, mit dem Sie diese Informationen in einer Benutzeroberfläche durchsuchen können. Sie müssen lernen, die Tabellen zu verwenden. Sie sollten jedoch auch eine Benutzeroberfläche verwenden.

0
Ethan Post
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;   
0
Abu Turab