dbt で Snowflake に UDF を作ろうとしたら Insufficient privileges to operate on function というエラーが出て怒られたのでメモ。
このような macro ファイルがあるとして
1 2 3 4 5 6 7 8 9 10 11 | {% macro create_replace_title() %} CREATE OR REPLACE FUNCTION string_reverse_nulls(S string) RETURNS string LANGUAGE JAVASCRIPT AS ' if (S === undefined) { return "string was null"; } else { return undefined; }' ; {% endmacro %} |
これを dbt run の pre_hook で実行すると以下のエラーが出る。
1 2 3 | Database Error in model stg_hoge (models /staging/stg_hoge .sql) 003001 (42501): SQL access control error: Insufficient privileges to operate on function 'string_reverse_nulls' |
dbt ユーザーには GRANT ALL してるのに?と思ったら ALL じゃ足りない。
対策は、dbt ユーザーのロールに OWNERSHIP を付与すればOK.
1 2 | GRANT ownership ON all functions in database staging to role transformer REVOKE CURRENT GRANTS; GRANT ownership ON future functions in database staging to role transformer REVOKE CURRENT GRANTS; |
ALL だと所有権が付与されないのね。