dbt/include/maxcompute/macros/adapters/apply_grants.sql (47 lines of code) (raw):
{%- macro maxcompute__support_multiple_grantees_per_dcl_statement() -%}
{{ return(False) }}
{%- endmacro -%}
{% macro maxcompute__get_show_grant_sql(relation) %}
show grants on {{ relation.render() }}
{% endmacro %}
{%- macro maxcompute__get_grant_sql(relation, privilege, grantees) -%}
grant {{ privilege }} on table {{ relation.render() }} to USER {{ grantees | join(', ') }}
{%- endmacro -%}
{%- macro maxcompute__get_revoke_sql(relation, privilege, grantees) -%}
revoke {{ privilege }} on table {{ relation.render() }} from USER {{ grantees | join(', ') }}
{%- endmacro -%}
{% macro maxcompute__call_dcl_statements(dcl_statement_list) %}
{#
-- By default, supply all grant + revoke statements in a single semicolon-separated block,
-- so that they're all processed together.
-- Some databases do not support this. Those adapters will need to override this macro
-- to run each statement individually.
#}
{% for dcl_statement in dcl_statement_list %}
{{ adapter.run_security_sql(dcl_statement) }}
{% endfor %}
{% endmacro %}
{% macro maxcompute__apply_grants(relation, grant_config, should_revoke=True) %}
{{ adapter.get_odps_table_by_relation(relation, 10) }}
{% if grant_config %}
{% if should_revoke %}
{#-- We think previous grants may have carried over --#}
{#-- Show current grants and calculate diffs --#}
{% set current_grants_dict = adapter.run_security_sql(get_show_grant_sql(relation)) %}
{% set needs_granting = diff_of_two_dicts(grant_config, current_grants_dict) %}
{% set needs_revoking = diff_of_two_dicts(current_grants_dict, grant_config) %}
{% if not (needs_granting or needs_revoking) %}
{{ log('On ' ~ relation.render() ~': All grants are in place, no revocation or granting needed.')}}
{% endif %}
{% else %}
{#-- We don't think there's any chance of previous grants having carried over. --#}
{#-- Jump straight to granting what the user has configured. --#}
{% set needs_revoking = {} %}
{% set needs_granting = grant_config %}
{% endif %}
{% if needs_granting or needs_revoking %}
{% set revoke_statement_list = get_dcl_statement_list(relation, needs_revoking, get_revoke_sql) %}
{% set grant_statement_list = get_dcl_statement_list(relation, needs_granting, get_grant_sql) %}
{% set dcl_statement_list = revoke_statement_list + grant_statement_list %}
{% if dcl_statement_list %}
{{ call_dcl_statements(dcl_statement_list) }}
{% endif %}
{% endif %}
{% endif %}
{% endmacro %}