カテゴリ:

メタデータ関数

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 が返されるオブジェクトの型を指定します。有効な値(サポートされているオブジェクト型に対応)は、次のとおりです。

  • CONTACT

  • DATABASE

  • DYNAMIC_TABLE

  • EVENT_TABLE

  • FILE_FORMAT

  • FUNCTION (UDFs の場合、データメトリック関数と外部関数を含む)

  • ICEBERG_TABLE

  • INTEGRATION (ストレージ)

  • PIPE

  • POLICY (aggregation, authentication, join, masking, password, projection, row access, session, and storage lifecycle policies)

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

  • SCHEMA

  • SEMANTIC VIEW

  • SEQUENCE

  • STREAM

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

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

  • TASK

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

  • WAREHOUSE

'namespace.object_name'

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

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

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

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

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

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

オプション:

use_fully_qualified_names_for_recreated_objects

If TRUE, the generated DDL statements use fully qualified names for the objects to be recreated.

デフォルト: FALSE。

注釈

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

戻り値

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

UDFs およびストアドプロシージャの場合、出力は元の DDLとわずかに異なる場合があります。例えば、 UDF またはストアドプロシージャに JavaScript コードが含まれる場合、 JavaScript コードを囲む区切り文字が異なる場合があります。

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

アクセス制御の要件

  • セマンティックビュー には、REFERENCES または OWNERSHIP セマンティックビューに対する権限 <label-semantic_views_privileges>` :ref:`が付与されたロールを使用する必要があります。

使用上の注意

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

  • 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 [ , ... ] ] )' の形式で含める必要があります。

  • ほとんどのSnowflakeオブジェクト型に対してこの関数をクエリするには、オブジェクトを表示するために必要な場合と同様の最小限の権限が必要です(DESCRIBE <オブジェクト> または SHOW <オブジェクト> を使用)。Snowflakeは、セキュアビューなどの特別なオブジェクトの表示を所有者つまり、オブジェクトに対する OWNERSHIP 権限を持つロールに制限します。

  • 返されたDDL ステートメントにデータ型の仕様が含まれている場合、この関数は元のステートメント内のデータ型エイリアスを、デフォルトで標準的なSnowflakeデータ型名に置き換えます。返されたDDL ステートメントに元のステートメントのデータ型エイリアスを含めたい場合は、ENABLE_GET_DDL_USE_DATA_TYPE_ALIAS パラメーターをTRUE に設定します。

Icebergテーブルの場合:

  • Icebergテーブルの TABLE オブジェクトを指定すると、関数はIcebergテーブルの DDL を返します。

  • 元の CREATE ICEBERG TABLE ステートメントで BASE_LOCATION が指定されていた場合、関数は元のユーザー入力を返します。そうでない場合、関数はSnowflakeで構成されたファイルパス(ランダムな8文字列を含む)を返します。詳細については、 データとメタデータのディレクトリ をご参照ください。

カタログリンクデータベースの場合:

  • 出力には LINKED_CATALOG オプションが含まれます。

  • ALLOWED_NAMESPACES と BLOCKED_NAMESPACES の場合、そのセットにすでに親名前空間が含まれていたら、Snowflakeはネストされた名前空間を保存しません。たとえば、データベースを作成し、ALLOWED_NAMESPACES = ('ns1', 'ns1.ns2', 'ns1.ns3')`を指定した場合、Snowflakeは GET_DDL 出力内の :code:`ALLOWED_NAMESPACES = ('ns1') を返します。BLOCKED_NAMESPACES にも同じことが当てはまります。

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

  • ビューの作成に使用された元の 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

次の注意事項は、タグまたはポリシーのあるテーブルオブジェクトとビューオブジェクトに限り適用されます。

  • The role executing the GET_DDL query must have the global APPLY MASKING POLICY, APPLY ROW ACCESS POLICY, APPLY AGGREGATION POLICY, APPLY JOIN POLICY, APPLY PROJECTION POLICY, APPLY STORAGE LIFECYCLE POLICY, or APPLY TAG privilege and the USAGE privilege on the database and schema containing the policy or tag. Otherwise, Snowflake replaces the policy with #UNKNOWN_POLICY and the tag with #UNKNOWN_TAG='#UNKNOWN_VALUE. This text indicates that the column or the object is protected by a policy and a tag is set on the object or column. If this text is not removed prior to recreating the object, the CREATE OR REPLACE <object> statement fails.

    このテキストが GET_DDL クエリ結果に含まれている場合は、オブジェクトを再作成する前に内部ガバナンス管理者と相談して、列またはオブジェクトに必要なポリシーとタグを決定します。最後に、 GET_DDL クエリの結果を編集してから、オブジェクトを再作成します。

    前述の権限がない場合、このテーブル関数は、関数呼び出しの出力でポリシーとタグの割り当てに対応する行を返しません。

  • オブジェクトまたは列に複数のタグが設定されている場合、 GET_DDL 出力ではタグがタグ名のアルファベット順に並べ替えられます。

  • タグをドロップすると、 GET_DDL 出力からタグが削除されます。

  • タグがテーブルまたはビューに設定されている場合、テーブルまたはビューの GET_DDL 出力には、 CREATE OR REPLACE ステートメントのタグ割り当てが含まれます。

  • If a masking policy, row access policy, or storage lifecycle policy is set, the GET_DDL output includes the policy assignments using the WITH keyword.

データベースまたはスキーマにタグが設定されている場合、 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.

次の例は、この関数を使用してオブジェクトの DDL ステートメントを取得する方法を示しています。

ビュー

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

セマンティックビュー

セマンティックビューの SQL ステートメントを取得します。 をご参照ください。

スキーマ

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)                          |
| );                                          |
+---------------------------------------------+