카테고리:

메타데이터 함수

GET_DDL

지정된 오브젝트를 다시 만드는 데 사용할 수 있는 DDL 문을 반환합니다. 데이터베이스 및 스키마의 경우 GET_DDL은 재귀적입니다(즉, 지정된 데이터베이스/스키마 내에서 지원되는 모든 오브젝트를 재생성하기 위한 DDL 문을 반환함).

GET_DDL은 현재 다음 오브젝트 유형을 지원합니다.

구문

GET_DDL( '<object_type>' , '[<namespace>.]<object_name>' [ , <use_fully_qualified_names_for_recreated_objects> ] )
Copy

인자

필수:

object_type

DDL이 반환되는 오브젝트의 유형을 지정합니다. 유효한 값(지원되는 오브젝트 유형에 해당)은 다음과 같습니다.

  • DATABASE

  • DYNAMIC_TABLE

  • EVENT_TABLE

  • FILE_FORMAT

  • FUNCTION(UDF의 경우, 외부 함수 포함)

  • ICEBERG_TABLE

  • PIPE

  • POLICY(마스킹, 비밀번호, 행 액세스, 세션 정책)

  • PROCEDURE(저장 프로시저의 경우)

  • SCHEMA

  • SEQUENCE

  • STREAM

  • TABLE(외부 테이블 포함)

  • TAG(오브젝트 태그 지정)

  • TASK

  • VIEW(구체화된 뷰 포함)

namespace.object_name

DDL이 반환되는 오브젝트의 정규화된 이름을 지정합니다.

네임스페이스는 오브젝트가 있는 데이터베이스 및/또는 스키마입니다.

  • 데이터베이스에는 사용되지 않습니다.

  • 스키마의 경우, database 형식을 취합니다.

  • 스키마 오브젝트(테이블, 뷰, 스트림, 작업, 시퀀스, 파일 형식, 파이프, 정책, UDF)의 경우, database.schema 또는 schema 형식을 취합니다.

데이터베이스와 스키마가 사용자 세션 내에서 현재 사용 중인 경우, 네임스페이스는 선택 사항 입니다. 그렇지 않은 경우, 필수입니다.

선택 사항:

use_fully_qualified_names_for_recreated_objects

TRUE 인 경우, 생성된 DDL 문은 다시 만들 오브젝트의 정규화된 이름을 사용합니다.

기본값: FALSE.

참고

이는 DDL 문에서 참조되는 다른 오브젝트의 이름(예: 뷰 정의에서 참조되는 테이블의 이름)에는 영향을 미치지 않습니다.

반환

오브젝트를 만든 DDL 문의 텍스트가 포함된 문자열(VARCHAR)을 반환합니다.

UDF 및 저장 프로시저의 경우, 출력이 원래 DDL과 약간 다를 수 있습니다. 예를 들어, UDF 또는 저장 프로시저에 JavaScript 코드가 포함된 경우, JavaScript 코드 주위의 구분 문자가 다를 수 있습니다. 또한, 원래 CREATE PROCEDURE 문이 EXECUTE AS OWNER 또는 EXECUTE AS CALLER 를 지정하지 않은 경우, GET_DDL 의 출력에는 EXECUTE AS OWNER 가 기본값이기 때문에 포함됩니다.

사용법 노트

다음 노트는 지원되는 모든 오브젝트에 적용됩니다.

  • object_typeobject_name (지정된 경우 namespace 포함)는 작은따옴표로 묶어야 합니다.

  • object_type 의 경우, TABLEVIEW 는 서로 바꿔 사용할 수 있습니다. TABLE 오브젝트 유형이 지정되고, 이름으로 지정된 오브젝트가 뷰인 경우, 함수는 뷰에 대한 DDL을 반환하고, 그 반대의 경우도 마찬가지입니다.

  • object_typeFUNCTION (즉, UDF)이고, UDF에 인자가 있는 경우, 'function_name( [ arg_data_type [ , ... ] ] )' 형식으로 인자 데이터 타입을 함수 이름의 일부로서 포함해야 하는데, 여기서 function_name 은 함수의 이름이고 arg_data_type 은 인자의 데이터 타입입니다.

  • object_typePROCEDURE 이고, 저장 프로시저에 인자가 있는 경우, 'procedure_name( [ arg_data_type [ , ... ] ] )' 형식으로 인자 데이터 타입을 함수 이름의 일부로서 포함해야 합니다.

  • Iceberg 테이블인 TABLE 오브젝트를 지정하면 함수는 Iceberg 테이블의 DDL을 반환합니다.

  • 대부분의 Snowflake 오브젝트 유형에 대해 이 함수를 쿼리하려면 오브젝트를 보는 데 필요한 것과 동일한 최소 권한이 필요합니다(DESCRIBE <오브젝트> 또는 SHOW <오브젝트> 사용). Snowflake는 보안 뷰와 같은 특수 오브젝트 뷰를 소유자(즉, 오브젝트에 대한 OWNERSHIP 권한이 있는 역할)로 제한합니다.

다음 노트는 뷰 오브젝트에만 해당됩니다.

  • 쿼리 결과는 항상 다음과 같습니다.

    • create or replace view 에 대한 소문자 SQL 텍스트를 반환합니다. 뷰를 만드는 데 사용된 원래 SQL 문이 대문자로 되어 있거나 대/소문자가 혼합된 경우에도 마찬가지입니다.

    • OR REPLACE 절을 포함합니다.

    • 뷰가 안전한 경우 SECURE 속성을 포함합니다.

    • COPY GRANTS 뷰 매개 변수를 제외합니다. 원래 CREATE VIEW 문이 COPY GRANTS 매개 변수를 지정하더라도 마찬가지입니다.

    • 열 목록을 생성합니다.

      열에 마스킹 정책이 설정된 경우 결과는 열에 대한 마스킹 정책을 지정합니다.

    • 뷰 본문 앞의 인라인 SQL 주석을 제거합니다(즉, AS). 예를 들어, 다음 코드에서 AS 절 바로 앞의 주석이 제거됩니다.

      create view view_t1
          -- GET_DDL() removes this comment.
          AS
          select * from t1;
      
      Copy

다음 참고 사항은 태그, 마스킹 정책 또는 행 액세스 정책이 있는 테이블 및 뷰 오브젝트에 특별히 적용됩니다.

  • GET_DDL 쿼리를 실행하는 역할에는 전역 APPLY MASKING POLICY, APPLY ROW ACCESS POLICY 또는 APPLY TAG 권한과 정책 또는 태그를 포함한 데이터베이스 및 스키마에 대한 USAGE 권한이 있어야 합니다. 그렇지 않으면, Snowflake가 정책을 #UNKNOWN_POLICY 로, 태그를 #UNKNOWN_TAG='#UNKNOWN_VALUE 로 바꿉니다. 이 텍스트는 열 또는 오브젝트가 정책으로 보호되고 오브젝트 또는 열에 태그가 설정되었음을 나타냅니다. 오브젝트를 다시 만들기 전에 이 텍스트를 제거하지 않으면 CREATE OR REPLACE <오브젝트> 문이 실패합니다.

    이 텍스트가 GET_DDL 쿼리 결과에 있는 경우, 오브젝트를 다시 만들기 전에 내부 거버넌스 관리자에게 문의하여 열 또는 뷰에 필요한 정책과 태그를 확인합니다. 마지막으로, GET_DDL 쿼리 결과를 편집한 다음 오브젝트를 다시 만듭니다.

    언급된 권한이 없으면 이 테이블 함수는 함수 호출의 출력에서 정책 및 태그 할당에 해당 행을 반환하지 않습니다.

  • 오브젝트 또는 열에 여러 태그가 설정된 경우 GET_DDL 출력은 태그 이름을 기준으로 알파벳순으로 태그를 정렬합니다.

  • 태그를 삭제하면 GET_DDL 출력에서 태그가 제거됩니다.

  • 태그가 테이블 또는 뷰에 설정된 경우 테이블 또는 뷰에 대한 GET_DDL 출력에는 CREATE OR REPLACE 문의 태그 할당이 포함됩니다.

  • 열에 마스킹 정책이 설정되거나 테이블에 행 액세스 정책이 설정된 경우 GET_DDL 출력에는 WITH 키워드를 사용하는 정책 할당이 포함됩니다.

데이터베이스 또는 스키마에 태그가 설정되면 GET_DDL 출력에 다음이 포함됩니다.

  • 태그가 데이터베이스에 설정된 경우 ALTER DATABASE 문.

  • 태그가 데이터베이스와 스키마에 모두 설정된 경우 ALTER DATABASE 문 및 ALTER SCHEMA 문.

  • 태그가 스키마에 설정된 경우 ALTER SCHEMA 문.

  • 태그가 데이터베이스 또는 스키마에 있는 경우 태그를 생성하는 CREATE OR REPLACE 문.

데이터 정렬 세부 정보

  • Collation information is included in the input.

books_view 라는 뷰를 만드는 데 사용된 DDL을 반환합니다.

select get_ddl('view', 'books_view');
+-----------------------------------------------------------------------------+ 
| GET_DDL('VIEW', 'BOOKS_VIEW')                                               |
|-----------------------------------------------------------------------------|
|                                                                             |
| create or replace view BOOKS_VIEW as select title, author from books_table; |
|                                                                             |
+-----------------------------------------------------------------------------+
Copy

books_schema 라는 스키마와 해당 스키마의 오브젝트(테이블 books_table 및 뷰 books_view)를 만드는 데 사용된 DDL을 반환합니다.

select get_ddl('schema', 'books_schema');
+-----------------------------------------------------------------------------+ 
| GET_DDL('SCHEMA', 'BOOKS_SCHEMA')                                           |
|-----------------------------------------------------------------------------|
| create or replace schema BOOKS_SCHEMA;                                      |
|                                                                             |
| create or replace TABLE BOOKS_TABLE (                                       |
| 	ID NUMBER(38,0),                                                      |
| 	TITLE VARCHAR(255),                                                   |
| 	AUTHOR VARCHAR(255)                                                   |
| );                                                                          |
|                                                                             |
| create or replace view BOOKS_VIEW as select title, author from books_table; |
|                                                                             |
+-----------------------------------------------------------------------------+
Copy

다시 만들 오브젝트의 정규화된 이름을 사용하는 DDL을 반환합니다.

select get_ddl('schema', 'books_schema', true);
+---------------------------------------------------------------------------------------------------+
| GET_DDL('SCHEMA', 'BOOKS_SCHEMA', TRUE)                                                           |
|---------------------------------------------------------------------------------------------------|
| create or replace schema BOOKS_DB.BOOKS_SCHEMA;                                                   |
|                                                                                                   |
| create or replace TABLE BOOKS_DB.BOOKS_SCHEMA.BOOKS_TABLE (                                       |
| 	ID NUMBER(38,0),                                                                            |
| 	TITLE VARCHAR(255),                                                                         |
| 	AUTHOR VARCHAR(255)                                                                         |
| );                                                                                                |
|                                                                                                   |
| create or replace view BOOKS_DB.BOOKS_SCHEMA.BOOKS_VIEW as select title, author from books_table; |
|                                                                                                   |
+---------------------------------------------------------------------------------------------------+
Copy

참고

위의 예에서 보여주듯이, DDL 문은 뷰를 만드는 데 사용되는 테이블의 정규화된 이름을 사용하지 않습니다. 이 테이블의 이름을 확인하기 위해 Snowflake는 데이터베이스 이름과 뷰에 대한 스키마 이름을 사용합니다.

NUMBER 형식의 두 매개 변수가 있는 multiply 라는 UDF를 만드는 데 사용된 DDL을 반환합니다.

select get_ddl('function', 'multiply(number, number)');

--------------------------------------------------+
 GET_DDL('FUNCTION', 'MULTIPLY(NUMBER, NUMBER)')  |
--------------------------------------------------+
 CREATE OR REPLACE "MULTIPLY"(A NUMBER, B NUMBER) |
 RETURNS NUMBER(38,0)                             |
 COMMENT='multiply two numbers'                   |
 AS 'a * b';                                      |
--------------------------------------------------+
Copy

FLOAT 형식의 매개 변수가 하나 있는 stproc_1 이라는 저장 프로시저를 만들기 위한 DDL을 반환합니다.

SELECT GET_DDL('procedure', 'stproc_1(float)');
+---------------------------------------------------+
| GET_DDL('PROCEDURE', 'STPROC_1(FLOAT)')           |
|---------------------------------------------------|
| CREATE OR REPLACE PROCEDURE "STPROC_1"("F" FLOAT) |
| RETURNS FLOAT                                     |
| LANGUAGE JAVASCRIPT                               |
| EXECUTE AS OWNER                                  |
| AS '                                              |
| ''return F;''                                     |
| ';                                                |
+---------------------------------------------------+
Copy

사회 보장 번호를 마스킹하기 위해 employee_ssn_mask 라는 마스킹 정책을 만들기 위한 DDL을 반환합니다. 사용자의 현재 역할이 PAYROLL이 아닌 경우, 마스킹된 값이 표시됩니다.

select get_ddl('policy', 'employee_ssn_mask');

---------------------------------------------------------------------------+
                   GET_DDL('POLICY', 'EMPLOYEE_SSN_MASK')                  |
---------------------------------------------------------------------------+
create masking policy employee_ssn_mask as (val string) returns string ->  |
case                                                                       |
  when current_role() in ('PAYROLL')                                       |
  then val                                                                 |
  else '******'                                                            |
end;                                                                       |
---------------------------------------------------------------------------+
Copy