カテゴリ:

メタデータ関数

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

  • INTEGRATION (ストレージ)

  • PIPE

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

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

  • SCHEMA

  • SEQUENCE

  • STREAM

  • TABLE (テーブル、外部テーブル、ハイブリッドテーブルの場合)

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

  • TASK

  • VIEW (ビューとマテリアライズドビューの場合)

  • WAREHOUSE

'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 コードを囲む区切り文字が異なる場合があります。

さらに、関数が返す DDL ステートメントには、プロパティのデフォルト値が含まれている可能性があることに注意してください。例えば、元の CREATE PROCEDURE ステートメントが EXECUTE AS OWNER を指定していなかったとしても、関数が返す 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 ステートメント。

以下はストレージ統合に適用されます。

  • このコマンドは常に CREATE OR REPLACE STORAGE INTEGRATION 構文を返します。

  • ストレージ統合作成時に STORAGE_AWS_EXTERNAL_ID を指定しなかった場合、このコマンドはストレージ統合作成時に自動生成された ID を返します。

照合順序の詳細

  • 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はデータベースの名前とビューのスキーマの名前を使用します。

UDFs およびストアドプロシージャ

データ型が 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

ストレージの統合

外部 AWS ステージを作成する s3_int という名前のストレージ統合を作成する DDL を返します。

SELECT GET_DDL('INTEGRATION', s3_int);

+----------------------------------------------------------------------------+
| GET_DDL('INTEGRATION', 's3_int')                                           |
|----------------------------------------------------------------------------|
| CREATE OR REPLACE STORAGE INTEGRATION s3_int                               |
|   TYPE = EXTERNAL_STAGE                                                    |
|   STORAGE_PROVIDER = 'S3'                                                  |
|   STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole'           |
|   STORAGE_AWS_EXTERNAL_ID='ACCOUNT_SFCRole=2_kztjogs3W9S18I+iWapHpIz/wq4=' |
|   ENABLED = TRUE                                                           |
|   STORAGE_ALLOWED_LOCATIONS = ('s3://mybucket1/path1/');                   |
+----------------------------------------------------------------------------+
Copy

ウェアハウス

例えば、次のステートメントを実行して my_wh という名前のウェアハウスを作成するとします。

CREATE OR REPLACE WAREHOUSE my_wh
  WAREHOUSE_SIZE=LARGE
  INITIALLY_SUSPENDED=TRUE;
Copy

次の GET_DDL 関数の呼び出しは、このウェアハウスを再作成する DDL ステートメントを返します。

SELECT GET_DDL('WAREHOUSE', 'my_wh');
Copy
+-------------------------------------------+
| GET_DDL('WAREHOUSE', 'MY_WH')             |
|-------------------------------------------|
| create or replace warehouse MY_WH         |
| with                                      |
|     warehouse_type='STANDARD'             |
|     warehouse_size='Large'                |
|     max_cluster_count=1                   |
|     min_cluster_count=1                   |
|     scaling_policy=STANDARD               |
|     auto_suspend=600                      |
|     auto_resume=TRUE                      |
|     initially_suspended=TRUE              |
|     enable_query_acceleration=FALSE       |
|     query_acceleration_max_scale_factor=8 |
|     max_concurrency_level=8               |
|     statement_queued_timeout_in_seconds=0 |
|     statement_timeout_in_seconds=172800   |
| ;                                         |
+-------------------------------------------+

GET_DDL 関数によって返されるステートメントには、 CREATE WAREHOUSE ステートメントで指定されていないプロパティのデフォルト値が含まれていることに注意してください。例えば、 CREATE WAREHOUSE ステートメントは、 AUTO_RESUME プロパティを指定していないため、返されるステートメントにはこのプロパティのデフォルト値である AUTO_RESUME=TRUE が含まれます。

ハイブリッドテーブル

次の例は、 id 列に PRIMARY KEY 制約を持つ、 ht_weather という名前のハイブリッドテーブルに対して返される DDL を示しています。

CREATE OR REPLACE HYBRID TABLE ht_weather
 (id INT PRIMARY KEY,
  start_time TIMESTAMP,
  precip NUMBER(3,2),
  city VARCHAR(20),
  county VARCHAR(20));
Copy

関数の最初の引数は、ハイブリッドテーブルに TABLE 型を使用することに注意してください。

SELECT GET_DDL('TABLE','ht_weather');
Copy

PRIMARY KEY 制約は、出力では列定義の後に行外に配置されます。 GET_DDL の制約 もご参照ください。

+---------------------------------------------+
| GET_DDL('TABLE','HT_WEATHER')               |
|---------------------------------------------|
| create or replace HYBRID TABLE HT_WEATHER ( |
|   ID NUMBER(38,0) NOT NULL,                 |
|   START_TIME TIMESTAMP_NTZ(9),              |
|   PRECIP NUMBER(3,2),                       |
|   CITY VARCHAR(20),                         |
|   COUNTY VARCHAR(20),                       |
|   primary key (ID)                          |
| );                                          |
+---------------------------------------------+