Oracle SQL Developer에서 주어진 테이블을 참조하는 테이블을 어떻게 찾을 수 있습니까?


199

에서 오라클 SQL 개발자 나는 테이블에 대한 정보를 볼 수있어 경우에, 나는 나 (테이블이이 테이블에서 참조하여 등) 외래 키를 볼 수 있도록 제약을 볼 수 있습니다, 내가 무엇을 볼 수있는 종속성을 볼 수 있습니다 패키지 및 이러한 참조 표. 그러나 테이블을 참조하는 테이블을 찾는 방법을 잘 모르겠습니다.

예를 들어 emp테이블을 보고 있다고 가정 해 봅시다. 테이블 의 기본 키 인를 통해 테이블을 emp_dept참조하는 부서에서 어떤 직원이 어떤 부서에서 일하는지 캡처하는 다른 테이블 이 있습니다. 테이블이 존재 한다는 것을 알 필요없이 테이블 이 테이블을 참조 한다는 것을 알 수있는 방법이 있습니까 (프로그램이 아닌 UI 요소를 통해) .empemp_idempemp_deptempemp_dept

답변:


258

아니요. Oracle SQL Developer에서 이러한 옵션을 사용할 수 없습니다.

직접 쿼리를 실행하거나 다른 도구를 사용해야합니다 (예 : PLSQL Developer 에 이러한 옵션이 있음). 다음 SQL은 PLSQL Developer가 사용하는 SQL입니다.

select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
 (
   select constraint_name from all_constraints
   where constraint_type in ('P', 'U')
   and table_name = :r_table_name
   and owner = :r_owner
 )
order by table_name, constraint_name

r_owner스키마는 어디에 있고 r_table_name참조하려는 테이블입니다. 이름은 대소 문자를 구분합니다


Oracle SQL Developer의 보고서 탭에는 "모든 테이블 / 종속성"옵션이 있으며 이는 ALL_DEPENDENCIES의 "모든 테이블 / 종속성"옵션입니다. "종속성 을 포함하여 현재 사용자가 액세스 할 수있는 프로 시저, 패키지, 함수, 패키지 본문 및 트리거 간의 종속성 을 나타냅니다. 데이터베이스 링크없이 생성 된보기 . 그런 다음이 보고서에는 질문에 대한 가치가 없습니다.


30
답변 해주셔서 감사합니다. 빨아 들인 Oracle Sql Developer의 수치.
Greg

1
PLSQL Developer가이 기능을 수행 할 수 있다고 언급했는데 어떻게 설명 할 수 있습니까?
Nicholas

4
@Nicholas, 개체 브라우저에서 테이블을 선택하고 마우스 오른쪽 단추로 테이블을 클릭 한 다음 "외국 키 참조"
FerranB

3
이 답변 은 SQL Developer 4.1 이상에 이제이 정보를 ERD 형식으로 표시하는 "모델"탭 옵션이 있음을 나타냅니다.
SnoringFrog

1
r_owner는 사용중인 스키마이고, r_table_name은 참조하려는 테이블입니다.
Flowy

108

이것을 SQL Developer에 확장으로 추가하려면 다음을 수행하십시오.

  1. 아래 코드를 xml 파일 (예 : fk_ref.xml)에 저장하십시오.
<items>
    <item type="editor" node="TableNode" vertical="true">
    <title><![CDATA[FK References]]></title>
    <query>
        <sql>
            <![CDATA[select a.owner,
                            a.table_name,
                            a.constraint_name,
                            a.status
                     from   all_constraints a
                     where  a.constraint_type = 'R'
                            and exists(
                               select 1
                               from   all_constraints
                               where  constraint_name=a.r_constraint_name
                                      and constraint_type in ('P', 'U')
                                      and table_name = :OBJECT_NAME
                                      and owner = :OBJECT_OWNER)
                               order by table_name, constraint_name]]>
        </sql>
    </query>
    </item>
</items>
  1. SQL Developer에 확장을 추가하십시오.

    • 도구> 환경 설정
    • 데이터베이스> 사용자 정의 확장
    • "행 추가"버튼을 클릭하십시오
    • 유형에서 "편집자"를 선택하십시오. 위치는 위의 xml 파일을 저장 한 위치입니다.
    • "확인"을 클릭 한 다음 SQL 개발자를 다시 시작하십시오.
  2. 테이블로 이동하면 이제 SQL F 옆에 FK 참조라고 표시된 추가 탭이 표시되어 새 FK 정보가 표시됩니다.

  3. 참고


패키지의 노드 이름이 무엇인지 알고 있습니까? 웹에서 찾은 모든 xsd 링크는 더 이상 유효하지 않습니다 (Oracle에서 제거한 것처럼).
James Sumners 2014 년

1
주문 전에 제안에 약간의 변경 사항을 추가했습니다 . 주문하기 전에 owner = user . 두 스키마에 동일한 테이블의 두 인스턴스가있는 경우 스키마와 관련된 참조 만 얻습니다.
user1708042

나는이 조건을 추가 : and owner = :OBJECT_OWNER전에 and exists.
M Denis

3
@ M-Denis,이 경우 다른 스키마에서 참조가 누락 될 수 있습니다.
Youw

이를 적용하고 실행 한 후 describe books;select * from books;, 그것은 오라클 SQL 개발자 VM에 FK 참조 탭을 표시하지 않습니다.
mLstudent33

36

아래 쿼리에서 [Your TABLE]을 emp 로 바꿉니다.

select owner,constraint_name,constraint_type,table_name,r_owner,r_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]');

constraint_type in ('P','U') 제약 조건 TOTO의 constraint_type이 'R'이면 TOTO의 r_constraint_name은 물론 참조 테이블에서 유형 'P'OR 'U'의 제약 조건 이름이기 때문에 불필요한 것으로 생각 합니다. 지정할 필요가 없습니다. 당신은를 사용하고 IN있기 때문에 많은 것과 비슷 OR하며 우리는 참으로 평가되는 OR의 유일한 피연산자에 대해서만 관심이 있습니다.
Gab 是 好人

10

당신은 ALL_CONSTRAINTS보기 에서 이것을 쿼리 할 수 있습니다 :

SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = 'EMP'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
    );

1
외래 키는 기본 키뿐만 아니라 고유 키도 참조 할 수 있으며 테이블 이름을 여러 스키마에서 사용하여 여러 개의 일치 항목을 생성 할 수 있습니다. 'User_Constraints'가 아닌 'All_Constraints'를 사용하려는 경우 'Owner'열도 사용해야합니다.
Mark Roddy

'R' 'U'와 'P'가 무엇인지 언급 해 주셔서 감사합니다
Jeff

SQL 요청이 끝날 때 세미콜론을 잊지 마십시오.
Gab 是 好人

그런데 제약 조건 TOTO의 constraint_type이 'R'이면 TOTO의 r_constraint_name은 물론 'P'OR 'U 유형의 제약 조건 이름이므로 ('P ','U ')의 constraint_type은 불필요합니다. 참조 된 표에서 '. 지정할 필요가 없습니다.
Gab 是 好人

9

2015 년 5 월에 릴리스 된 SQL Developer 4.1에는 테이블을 참조하는 테이블 외래 키를 엔터티 관계 다이어그램 형식으로 표시하는 모델 탭이 추가되었습니다.


1
어떤 이유로 스크립트에서 이것이 필요하면 유용하지 않지만 연결에 대해 알아야 할 경우 현대적인 방법으로 보입니다.
SnoringFrog

1
@SnoringFrog 기술적으로이 질문은 UI 요소를 요청하므로 가장 적합한 답변입니다.
WhatsThePoint

4

이런 식으로 어떻습니까 :

SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
  FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
 WHERE c.table_name = <TABLE_OF_INTEREST>
   AND c.constraint_TYPE = 'R';

2
이것은 테이블 이름 dba_constraints을 다음 all_constraints과 같이 변경했을 때 저에게 SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
효과적이었습니다

4
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; 

이것은 매우 유용합니다. 특정 루트 테이블의 모든 테이블을 재귀 적으로 표시합니다.이 테이블은이 루트 테이블에서 선택한 열의 값을 키로 보유합니다. 감사합니다
Ev0oD

정말 멋진 일입니다. table_name과 column_name을 비교하기 위해 lower () 만 추가합니다.
Tobias Otto

4

2011 년 제품에는 없었지만 이것은 수년간 제품에있었습니다.

그러나 모델 페이지를 클릭하기 만하면됩니다.

이 기능에 액세스하려면 버전 4.0 이상 (2013 년 릴리스) 이상이어야합니다.

여기에 이미지 설명을 입력하십시오


0

SQL 개발자 플러그인에 대한 위의 답변에 추가하려면 아래 xml을 사용하면 외래 키와 관련된 열을 얻는 데 도움이됩니다.

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         where  a.constraint_type = 'R'
                                and exists(
                                   select 1
                                   from   all_constraints
                                   where  constraint_name=a.r_constraint_name
                                          and constraint_type in ('P', 'U')
                                          and table_name = :OBJECT_NAME
                                          and owner = :OBJECT_OWNER)
                                   order by table_name, constraint_name]]>
            </sql>
        </query>
        </item>
    </items>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.