[新機能]CREATE OR ALTERコマンドがロール・データベース・スキーマ・ステージ・ビュー・ウェアハウスに対応しました
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
さがらです。
先日のアップデートで、SnowflakeのCREATE OR ALTERコマンドがロール・データベース・スキーマ・ステージ・ビュー・ウェアハウスに対応しました。(パブリックプレビュー)
これまではテーブルのみがCREATE OR ALTERコマンドに対応していたのですが、今回のアップデートでSnowflakeでもよく使用する各オブジェクトに対応するようになったため、CREATE OR ALTERコマンドを用いた宣言的なアプローチで、Snowflakeのリソースの一部のIaCを担う事ができます。(ユーザーや他のスキーマオブジェクトもいつか対応してほしい…!)
実際にどのような挙動となるか試してみたので、本記事でその内容をまとめてみます。
データベースに対するCREATE OR ALTERコマンド
まず、データベースに対するCREATE OR ALTERコマンドを試してみます。
データベースを作成後にスキーマとテーブルを追加してみて、その後にCREATE OR REPLACEとCREATE OR ALTERでどう挙動が異なるかを見てみます。
従来のCREATE OR REPLACEの場合
以下のクエリを実行して、データベースを作成後にスキーマとテーブルを追加してみます。
create or replace database sagara_tmp;
use database sagara_tmp;
create schema tmp_schema;
use schema tmp_schema;
create table tmp_table as select 1 as num_col;

この状態で、もう一度CREATE OR REPLACEを実行してみます。すると、REPLACEしてしまうため作成したスキーマとテーブルが消えてしまいます。
create or replace database sagara_tmp;

新機能のCREATE OR ALTERの場合
以下のクエリを実行して、データベースを作成後にスキーマとテーブルを追加してみます。
create or alter database sagara_tmp;
use database sagara_tmp;
create schema tmp_schema;
use schema tmp_schema;
create table tmp_table as select 1 as num_col;

この状態で、もう一度CREATE OR ALTERを実行してみます。すると、CREATE OR REPLACEとは違って、作成したスキーマとテーブルは残ったままとなります。
create or alter database sagara_tmp;

ロールに対するCREATE OR ALTERコマンド
次に、ロールに対するCREATE OR ALTERコマンドを試してみます。
ロールを作成後に権限をGRANTしてみて、その後にCREATE OR REPLACEとCREATE OR ALTERでどう挙動が異なるかを見てみます。
従来のCREATE OR REPLACEの場合
以下のクエリを実行して、ロールを作成後に権限をGRANTしてみます。
use role securityadmin;
create or replace role sagara_tmp_role;
grant usage on database sagara_tmp to role sagara_tmp_role;
grant usage on schema sagara_tmp.tmp_schema to role sagara_tmp_role;
grant select on table sagara_tmp.tmp_schema.tmp_table to role sagara_tmp_role;
show grants to role sagara_tmp_role;

この上で、もう一度CREATE OR REPLACEを実行してみます。すると、REPLACEしてしまうためGRANTした権限が全てなくなってしまいます。
create or replace role sagara_tmp_role;
show grants to role sagara_tmp_role;

新機能のCREATE OR ALTERの場合
以下のクエリを実行して、ロールを作成後に権限をGRANTしてみます。
use role securityadmin;
create or alter role sagara_tmp_role;
grant usage on database sagara_tmp to role sagara_tmp_role;
grant usage on schema sagara_tmp.tmp_schema to role sagara_tmp_role;
grant select on table sagara_tmp.tmp_schema.tmp_table to role sagara_tmp_role;
show grants to role sagara_tmp_role;

この状態で、もう一度CREATE OR ALTERを実行してみます。すると、CREATE OR REPLACEとは違って、GRANTした権限はそのまま残っています。
create or alter role sagara_tmp_role;
show grants to role sagara_tmp_role;

最後に
SnowflakeのCREATE OR ALTERコマンドがロール・データベース・スキーマ・ステージ・ビュー・ウェアハウスに対応したので、データベースとロールで試してその内容をまとめてみました。
CREATEやCREATE OR REPLACEだと実行のたびにエラーが起きたり作り直しが起きてしまうため、同じクエリを何度も実行するということが容易にできなかったのですが、CREATE OR ALTERならば何度実行してもすでにオブジェクトがある場合にはそれを残しつつ指定した内容の変更だけが行えます。
Terraformとかを導入せずともワークシートベースで宣言的なアプローチによるIaCが行えるため、とても熱い機能だと思います!!







