dbt で snowflake function を制御するには ownership が必要

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