렛츠고
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:
|
참고사이트
오늘도 즐~~