source

dbms_dll.get_ddl이 작동하지 않습니다.

ittop 2023. 8. 26. 00:01
반응형

dbms_dll.get_ddl이 작동하지 않습니다.

테이블의 DDL을 받고 싶습니다.CARD_TABLEXT스키마

SQL> select dbms_metadata.get_ddl('TABLE','CARD_TABLE','XT') from dual;
    ERROR:
    ORA-31603: object "CARD_TABLE" of type TABLE not found in
    schema "XT"
    ORA-06512: at "SYS.DBMS_METADATA", line 5746
    ORA-06512: at "SYS.DBMS_METADATA", line 8333
    ORA-06512: at line 1

그러나 선택한 쿼리가 작동합니다.

select count(*) from XT.CARD_TABLE;
count(*)
---------
0

문의했습니다dba_objects그것은 여전히 테이블을 차지했습니다.

    SQL> select owner,object_type from DBA_OBJECTS
    where object_name='CARD_TABLE'  2
      3  ;


PUBLIC     SYNONYM
    XT     TABLE PARTITION
    XT     TABLE PARTITION
    XT     TABLE PARTITION
    XT     TABLE
    XT     TABLE PARTITION
    VAT    TABLE

    7 rows selected.

설명서에서 다음을 참조하십시오.

권한이 없는 사용자에게 다른 사용자의 스키마에 있는 개체에 대한 액세스 권한이 부여된 경우 메타데이터 API를 통해 허용 사양을 검색할 수 있지만 개체의 실제 메타데이터는 검색할 수 없습니다.

따라서 권한 있는 사용자로 연결되어 있지 않으면 다른 사용자의 개체에 대한 DDL을 볼 수 없습니다.다음과 같이 연결해야 합니다.SYS아니면 가지고 있습니다.SELECT_CATALOG_ROLEXT의 개체 정의를 가져올 수 있도록 사용자에게 부여된 역할입니다.

그 역할을 하더라도:

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

전화하시는 경우dbms_metadata익명 PL/SQL 블록에서 온 것은 중요하지 않지만, 프로시저에서 호출하는 경우 프로시저 선언에 절을 포함해야 합니다.AUTHID CURRENT_USER.

grant SELECT_CATALOG_ROLE to <user> with delegate option;

저한테는 효과가 있어요.절차를 수정한 후 이 작업을 수행합니다.

grant SELECT_CATALOG_ROLE to procedure <procedure name>;

언급URL : https://stackoverflow.com/questions/26026068/dbms-metadata-get-ddl-not-working

반응형