カテゴリ:

メタデータ関数

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 (UDFs の場合は外部関数を含む)

  • ICEBERG_TABLE

  • PIPE

  • POLICY (集計、認証、マスキング、パスワード、投影、行アクセス、およびセッションポリシー)

  • PROCEDURE (ストアドプロシージャの場合)

  • SCHEMA

  • SEQUENCE

  • STREAM

  • TABLE (外部テーブル向けを含む)

  • TAG (オブジェクトのタグ付け)

  • TASK

  • VIEW (マテリアライズドビュー向けを含む)

namespace.object_name

DDL が返されるオブジェクトの完全修飾名を指定します。

名前空間は、オブジェクトが存在するデータベースまたはスキーマです。

  • データベースには使用されません。

  • スキーマの場合、 database の形式を取ります。

  • スキーマオブジェクト(テーブル、ビュー、ストリーム、タスク、シーケンス、ファイル形式、パイプ、ポリシー、 UDFs)の場合は、 database.schema または schema の形式を取ります。

データベースとスキーマがユーザーセッション内で現在使用されている場合、名前空間は オプション です。それ以外の場合は必須です。

オプション:

use_fully_qualified_names_for_recreated_objects

TRUE の場合、生成される DDL ステートメントは、再作成されるオブジェクトに完全修飾名を使用します。

デフォルト: FALSE

注釈

これは、 DDL ステートメントで参照される他のオブジェクトの名前(例: ビュー定義で参照されるテーブルの名前)には影響しません。

戻り値

オブジェクトを作成した DDL ステートメントのテキストを含む文字列(VARCHAR)を返します。

UDFs およびストアドプロシージャの場合、出力は元の DDLとわずかに異なる場合があります。たとえば、 UDF またはストアドプロシージャに JavaScript コードが含まれる場合、 JavaScript コードを囲む区切り文字が異なる場合があります。また、元の CREATE PROCEDURE ステートメントが EXECUTE AS OWNER または EXECUTE AS CALLER を指定しなかった場合、 GET_DDL からの出力にはデフォルトの EXECUTE AS OWNER が含まれます。

使用上の注意

次の注意事項は、サポートされているすべてのオブジェクトに適用されます。

  • object_type および object_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 権限を持つロール)に制限します。

次の注意事項は、ビューオブジェクトに固有のものです。

  • クエリ結果は常に、

    • ビューの作成に使用された元の SQL ステートメントの文字種が大文字であるか、大文字と小文字が混在している場合でも、 create or replace view に対して小文字の SQL テキストを返します。

    • OR REPLACE 句が含まれます。

    • ビューがセキュアな場合は、 SECURE プロパティが含まれます。

    • 元の CREATE VIEW ステートメントが COPY GRANTS パラメーターを指定する場合でも、 COPY GRANTS ビューパラメーターを除外します。

    • 列リストを生成します。

      列にマスキングポリシーが設定されている場合、結果はその列のマスキングポリシーを指定します。

    • ビュー本体(つまり、 AS)の前のインライン SQL コメントを削除します。たとえば、次のコードでは、 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 AGGREGATION POLICY または APPLY PROJECTION 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 というスキーマの作成に使用された DDL とスキーマ内のオブジェクト(テーブル books_table と、ビュー books_view)を返します。

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 型の2つのパラメーターを持つ 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

DDL を返し、 FLOAT 型のパラメーターを1つ持つ stproc_1 という名前のストアドプロシージャを作成します。

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

DDL を返して、社会保障番号をマスクする employee_ssn_mask という名前のマスキングポリシーを作成します。ユーザーの現在のロールが 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