Snowflake Knowledge - INSIGHT LAB

【Snowflake】get_ddl関数でオブジェクトの定義を取得して再利用する

作成者: Chris Hirasawa|2020年7月28日

やりたいこと

ワイ      > CREATE TABLEするときカラムのスペル間違えちゃった…。
          うわ、カラムの型定義も間違えてる…。
          こんなときテーブル定義を簡単に修正できたらいいのになぁ。

Snowflakeさん > ほう、迷える子羊に慈悲(関数)を与えよう。

今回は、関数DDL文を取得しちゃえば、簡単にそして安全にテーブル定義を修正できるのでは?というお話をさせて頂きます。

何故関数なのか

そもそもSnowflakeコンソール(GUI)でグラフィカルにぽちぽちと修正できぬのですか?
ということで調べて見ましたが…なさそうでした。

公式ドキュメントでもやはり「ALTER TABLEで変更してね」でした。
正直に言うと少し面倒くさいのですよ。

何が面倒くさいのかと言うと「ALTER TABLE」だと既にデータが入っているとき、
場合によっては、型の互換性やテーブルの制約によってエラーで修正できないことがほとんどです。
さらに、変更履歴をしっかりと管理しないと属人化どころか

Aさん  > 「え?このテーブルのこのカラムって誰か変更した?別のクエリで型エラーになるんだけど…」

Bさん  > 「ぁ、スゥー、以前後輩のCくんに直しといてって言っておいたんだけど。どう直したんだろ?」「CくんDDL文残っている?

Cさん  > 「ぇ?ぁ、スゥー…、そのば限りの修正だったので…残っていません…」

Bさん  > 「ほーん、クエリの履歴は?」

Cさん  > 「随分前に修正したので履歴にも残っていませんでした…」

Aさん, Bさん  > 「ファーww」

といったオペミスが起こったりします。

↑これを阻止するために対応チケット切って、クエリ検証して、手順載せて…というのも手間だったりします。

本題:GET_DDL

そこで、Snowflakeに標準で用意されている「GET_DDL」関数を使ってDDL文を取得すれば、それをベースにDDL分を修正できるので、別の名前で修正後のテーブルを簡単に作成できたり、コピペしたDDL文をバージョン管理して差分を確認することができます。

公式ドキュメントに記載がある通り、下記のように使います。

select get_ddl('<object_type>', '[<namespace>.]<object_name>');

ということで実際にやりたいことができそうか試してみました。

  1. 先ず初めにテーブルを作成します。
    create or replace table "test_table" (
        text1 varchar not null
        , code1 integer not null
        , code2 integer not null
    );
  2. ここでGET_DDLを使ってみましょう。
    select get_ddl('table', 'knowledge_db.public."test_table"');

    ↑「結果」から返されたDDL文をクリックすると下記のように詳細が確認できます。
  3. コピペして実際に修正してみました。


  4. 最後に変更されたDDL文を確認してみましょう。


ちゃんと変更されていますね。

今回は、取得したDDLをベースに修正して直接テーブルを(上書いて)作り変えるようなことをしましたが、実際に運用していくのであれば、例えば、テーブルのバックアップを取ったり、別名でテーブルを作成したりするなどの運用を実施していくとよりベターだと考えています。

今回ご紹介した関数の詳細は公式ドキュメントのGET_DDLをご確認下さい。

まとめ

今回は、GET_DDL関数でテーブル定義を上書き修正してみました。

こちらの関数は、テーブル定義以外にもデータベースやスキーマのDDLを再帰的(指定のデータベース→スキーマ毎→テーブル毎)にDDL分を発行できたり、VIEWのクエリなども確認できるようなので紹介した使い方以外にも幅広く使えそうな関数だと考えています。

また、他にも便利そうな関数が標準で用意されているようなので試して良い利用方法が思いつけば紹介していきたいです。