dbt で Snowflake に UDF を作ろうとしたら Insufficient privileges to operate on function というエラーが出て怒られたのでメモ。
このような macro ファイルがあるとして
{% 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 で実行すると以下のエラーが出る。
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.
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 だと所有権が付与されないのね。