sourcecode

Oracle SQL Developer에서 특정 테이블을 참조하려면 어떻게 해야 합니까?

codebag 2023. 2. 22. 21:53
반응형

Oracle SQL Developer에서 특정 테이블을 참조하려면 어떻게 해야 합니까?

Oracle SQL Developer에서 테이블의 정보를 표시하는 경우 제약조건을 볼 수 있습니다.그러면 외부 키(이 테이블에서 참조되는 테이블)를 볼 수 있습니다.또한 의존관계를 표시하여 어떤 패키지와 그러한 테이블을 참조하는지 확인할 수 있습니다.하지만 어떤 테이블이 표를 참조하는지 잘 모르겠어요.

예를 들어, 예를 들면,emp테이블. 다른 테이블이 있습니다.emp_dept어떤 직원이 어떤 부서에서 일하는지, 어떤 직원이 어떤 부서에서 일하는지,emp을 테이블로 통과시키다.emp_id, 의 프라이머리 키emp(SQL이 아닌 프로그램 내의 일부 UI 요소를 통해) 테이블.emp_dept테이블은emp테이블, 내가 알 필요 없이emp_dept테이블이 존재합니까?

아니요. 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의 Reports 탭에는 "All tables / Dependencies" 옵션이 있습니다.이것은 "프로시저, 패키지, 함수, 패키지 본문 및 데이터베이스 링크 없이 작성된 뷰에 대한 의존성을 포함하여 현재 사용자가 액세스할 수 있는 트리거 간의 의존성"을 나타냅니다.그러면 이 보고서는 당신의 질문에 대한 가치가 없습니다.

이를 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에 확장자를 추가합니다.

    • [ Tools ] > [ Preferences ]
    • [ Database ]> [ User Defined Extensions ]
    • "행 추가" 버튼을 클릭합니다.
    • [편집자(Editor)]를 선택합니다.위 xml 파일을 저장한 장소가 Location입니다.
    • [확인]을 클릭하여 SQL Developer를 재시작합니다.
  2. 임의의 테이블로 이동하면 새로운 FK 정보를 표시하는 FK References라는 이름의 추가 탭이 SQL 옆에 나타납니다.

  3. 언급

아래 쿼리에서 [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]');

에서 할 수 .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"
    );

2015년 5월에 출시된 SQL Developer 4.1은 테이블을 참조하는 외부 키를 Entity Relationship Diagram 형식으로 표시하는 Model 탭을 추가했습니다.

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; 

2011년 제품에는 없었지만, 이 제품은 수년 전부터 사용되고 있습니다.

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

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

여기에 이미지 설명 입력

이런 건 어때?

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

sql developer plugin에 대한 위의 답변에 추가하려면 다음 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>

SQL Developer 어플리케이션을 조작하는 것보다 스트레이트 SQL 쿼리를 사용하여 이 작업을 수행하는 것이 좋습니다.

내가 방금 한 방법은 이렇다.이것을 읽고 무슨 일이 일어나고 있는지 이해하는 것이 가장 좋습니다.그러면, 요구에 맞추어 조정할 수 있습니다.

WITH all_primary_keys AS (
  SELECT constraint_name AS pk_name,
         table_name
    FROM all_constraints
   WHERE owner = USER
     AND constraint_type = 'P'
)
  SELECT ac.table_name || ' table has a foreign key called ' || upper(ac.constraint_name)
         || ' which references the primary key ' || upper(ac.r_constraint_name) || ' on table ' || apk.table_name AS foreign_keys
    FROM all_constraints ac
         LEFT JOIN all_primary_keys apk
                ON ac.r_constraint_name = apk.pk_name
   WHERE ac.owner = USER
     AND ac.constraint_type = 'R'
     AND ac.table_name = nvl(upper(:table_name), ac.table_name)
ORDER BY ac.table_name, ac.constraint_name
;

table_name만 기본 테이블 이름으로 바꿉니다.

select *
from all_constraints
where r_constraint_name in (
select constraint_name
from all_constraints
where table_name='table_name'
); 

MY_OWNER_NAMEMY_TAB을 바꿉니다.다음 LE_NAME을 통해 재귀적으로 사용할 수 있습니다.

DECLARE
FUNCTION list_all_child_tables_and_constraints(asked_table_name in VARCHAR2, parent_table_name in VARCHAR2)
RETURN VARCHAR2 IS
    current_path VARCHAR2(100);
BEGIN
    FOR item IN
    (SELECT fk.TABLE_NAME, constraint_parent.FK FK1, constraint_child.FK FK2
        FROM all_constraints fk, all_constraints pk,
            (SELECT acc.CONSTRAINT_NAME, LISTAGG(acc.COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY acc.COLUMN_NAME) AS FK
                FROM ALL_CONS_COLUMNS acc
                WHERE acc.OWNER = 'MY_OWNER_NAME'
                GROUP BY acc.CONSTRAINT_NAME) constraint_parent,
            (SELECT acc.CONSTRAINT_NAME, LISTAGG(acc.COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY acc.COLUMN_NAME) AS FK
                FROM ALL_CONS_COLUMNS acc
                WHERE acc.OWNER = 'MY_OWNER_NAME'
                GROUP BY acc.CONSTRAINT_NAME) constraint_child
        WHERE pk.owner = fk.r_owner
            AND pk.constraint_name = fk.r_constraint_name
            AND fk.constraint_type = 'R'
            AND pk.table_name = asked_table_name
            AND constraint_parent.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
            AND constraint_child.CONSTRAINT_NAME = fk.R_CONSTRAINT_NAME
            AND pk.owner = 'MY_OWNER_NAME'
            AND fk.owner = 'MY_OWNER_NAME')
    LOOP
        current_path := parent_table_name || ' // ' || item.TABLE_NAME;
        DBMS_OUTPUT.PUT_LINE(current_path);
        DBMS_OUTPUT.PUT_LINE('     [' || item.FK1 || ']  [' || item.FK2 || ']');
        DBMS_OUTPUT.PUT_LINE('');
        current_path := list_all_child_tables_and_constraints(item.TABLE_NAME, current_path);

    END LOOP;
    RETURN '-----------FINISHED-----------';

EXCEPTION
    WHEN OTHERS THEN
        RETURN '-----------FINISHED-----------';
END list_all_child_tables_and_constraints;
BEGIN
DBMS_OUTPUT.PUT_LINE(list_all_child_tables_and_constraints('MY_TABLE_NAME', ''));
END;

언급URL : https://stackoverflow.com/questions/1143728/how-can-i-find-which-tables-reference-a-given-table-in-oracle-sql-developer

반응형