programing

Oracle 모든 외부 키 참조

megabox 2023. 6. 28. 21:33
반응형

Oracle 모든 외부 키 참조

스키마를 상속받았기 때문에 거기에 대한 지식/자신감이 부족합니다.

프로젝트 ID가 있는 프로젝트 테이블이 있습니다.프로젝트 ID별로 이 테이블을 참조하는 다른 테이블이 많이 있습니다.쿼리를 실행하여 다음을 설정합니다.

  1. 프로젝트 ID의 프로젝트 테이블에 대한 외부 키 참조가 있는 테이블
  2. 외부 키가 설정되지 않은 경우 프로젝트 ID라는 열이 있는 테이블.

SQL Server의 경우 메타데이터를 쿼리하는 방법을 알고 있지만 Oracle에서는 어떻게 쿼리합니까?

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'

OWNER 열이 포함된 다른 술어를 추가할 수 있습니다.

안녕, 롭.

좋습니다. 여기 참조된 표와 열을 제공하는 요청이 있습니다.

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;

이는 다음과 같은 것을 제공합니다.

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

결과를 사용하지 않고 사용할 수 있는 경우 substr() 기능을 잊을 수 있습니다.이건 내 사건이 아닙니다.

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

여기서 xxx는 프로젝트 테이블에 있는 기본 키 제약 조건의 이름입니다.

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

r_constraint_nameOracle을 처음 접하는 저로서는 적합하지 않은 답변이었지만, 다음과 같은 이점이 있었습니다.

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

제 문제는 조금 달랐습니다.테이블이 있는데 어떤 테이블/열을 참조하는지 프로그래밍 방식으로 알고 싶습니다.

저는 위의 Stan의 답변으로 시작했지만, 이것은 제가 필요로 하는 것을 정확히 제공하지 못했기 때문에, 다른 누군가가 제 문제를 가지고 있을 때를 대비하여 이 글을 여기에 올렸습니다.

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

이 쿼리를 사용합니다.

   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;

언급URL : https://stackoverflow.com/questions/1171373/oracle-all-foreign-key-references

반응형