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 だと所有権が付与されないのね。