はじめに
Snowflakeのオブジェクト名の小文字・大文字の区別をあまり理解できていない時にいろいろとハマったので、ハマりやすいポイントについてまとめ。
前提
- オブジェクト名を引用符で囲わなければ、小文字で記載しても自動的に大文字として認識されて保存される。(大文字小文字が区別されない)
- オブジェクト名を引用符で囲うと大文字小文字が区別され、かつ数字や特殊文字のみのオブジェクト名が利用可能となる。
失敗例:デフォルトパラメータが適用されない
ユーザ「user_aaa」のデフォルトロールとしてロール「role_aaa」を設定したい。
ロール作成
use role USERADMIN;
select current_role();
create role role_aaa;
show roles like 'role_aaa';
実行結果
ユーザ作成
create user user_aaa password = 'Password1234' default_role = 'role_aaa' ;
grant role role_aaa to user user_aaa;
show users like 'user_aaa';
実行結果
ログイン結果
あれ?ログイン時のロールが「PUBLIC」になっている。。
再度ユーザの情報を確認。
ユーザ情報確認
show users like 'user_aaa';
実行結果
パラメータ「defalut_role」は「role_aaa」が設定されているけど、小文字になっているために別のオブジェクトとして認識されてしまいうまく適用されていない。
パラメータ修正
alter user user_aaa set default_role = role_aaa ;
show users like 'user_aaa';
実行結果
ログイン結果
ロール名を囲っていたシングルクウォーテーションを外すことで大文字のオブジェクト名として認識され、正常に適用。
注意
「defalut_role」に限らず基本的にdefalutパラメータは、存在しないオブジェクトや権限のないオブジェクトを指定してもエラーとならず、適用されないだけという挙動
注意
基本的にdefalutパラメータは追跡性がないため、指定されているオブジェクト名がRENAMEされても自動で変更されず、手動での変更が必要
結論
- オブジェクト名は特別な理由(※)がなければ、引用符で囲わない方がバグを誘発しにくい
(※)ユーザ名を数字や記号のみとしなければいけない、テーブル名で日本語を利用する等
TIPS
ユーザ名については、小文字大文字どちらで定義しても、ログイン時はどちらでもログイン可能
(例)「"test_user"」で作成した場合も「TEST_user」、「TEST_USER」等でログイン可