본문 바로가기

오라클팁

오라클 스크립트 확인 팁 - DBMS_METADATA

렛츠고

DBMS_METADATA

DB 오브젝트에 메타데이터 정보를 조회하여 생성 스크립트를 얻을 수 있는 함수를 제공한다.

메타데이터는 데이터 디렉터리 정보를 조회하여 생성한다.

 

내부에 프로시저로 구성되어 있는데 주요프로시저가 GET_DDL

DDL 생성 스크립트를 만들어주는 함수이다.

GET_DDL 함수의 세부 내용은 다음과 같다.

DBMS_METADATA.GET_DDL
(
    object_type     IN              VARCHAR2,
    name            IN              VARCHAR2,
    schema          IN              VARCHAR2    DEFAULT NULL
) 
RETURN CLOB;

간단히 사용예를 보면

SELECT to_char( dbms_metadata.get_ddl('INDEX','Index_ad_uq_n01' ) ) || '; '  FROM dual

오오 이케하니 아래처럼 해당 인덱스 만드는 스크립트가 쫙 나오네여. 철자 대소문자 구분하니 대문자로 주의

  CREATE INDEX "SCOTT"."IDX_TB_UQ_N01" ON "B2B_MGR"."TB_SITE_INFO" ("NAME") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TB_I" ; 
  • 파라미터설명
    object_type

    메타데이터 추출 오브젝트 타입이다.

    다음에 대해서 기능을 제공한다.

    • TABLESPACE
    • TABLE
    • INDEX
    • MATERIALIZED_VIEW
    • MATERIALIZED_VIEW_LOG
    • CONSTRAINT
    name 추출할 오브젝트 이름을 지정한다.
    schema 오브젝트의 owner를 지정한다.
  • 권한관련 SELECT_CATALOG_ROLE 이 있어야 하네여.
권한이없는 사용자에게 다른 사람의 스키마에있는 개체에 대한 액세스 권한이 부여 된 경우 
개체의 실제 메타 데이터가 아닌 메타 데이터 API를 통해 권한 부여 사양을 검색 할 수 있습니다.


따라서 권한있는 사용자로 연결되어 있지 않으면 다른 사용자의 개체에 대한 DDL을 볼 수 없습니다. 
XT의 객체 정의를 얻으려면 SYS로 연결하거나 사용자에게 SELECT_CATALOG_ROLE 역할을 부여해야합니다.

그 역할을하더라도 :

  저장 프로 시저, 함수 및 정의 자 권한 패키지에서는 
  역할 (예 : SELECT_CATALOG_ROLE)이 비활성화됩니다. 
  따라서 이러한 PL / SQL 프로그램은 
  자체 스키마의 객체에 대한 메타 데이터 만 가져올 수 있습니다. 
  (호출자가 SELECT_CATALOG_ROLE을 소지 한 것에 따라) 
  다른 스키마의 객체에 대한 메타 데이터를 가져 오는 
  PL / SQL 프로그램을 작성하려면 프로그램을 호출자 권한으로 만들어야합니다.


중요하지 않은 익명의 PL / SQL 블록에서 dbms_metadata를 호출하는 경우 
프로 시저에서 호출하는 경우 AUTHID를 추가하여 프로 시저 선언에 
an AUTHID CURRENT_USER clause를 포함시켜야합니다.

https://docs.oracle.com/database/121/ARPLS/d_metada.htm#ARPLS66868

 

select_catalog_role vs select any dictionary 관련 기억해야할 사항

Remember, a role is a collection of system-level or object-level privileges:

  • select any dictionary:  This is a system-level privilege that is always active and allows the grantee to create objects.
  • select_catalog_role:  This is a role, which is a collection of privileges. A role can be specifically enabled or disabled and this role cannot be used to create any objects (tables).

참고사이트

technet.tmaxsoft.com/upload/download/online/tibero/pver-20150504-000001/tibero_pkg/chap_dbms_metadata.html

오늘도 즐~~