Skip to content

Commit 29ac643

Browse files
Refactor grant_object macro to improve logging and ensure unique role privileges are processed correctly
1 parent 7be39d1 commit 29ac643

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

macros/grants/grant_object.sql

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
{% if flags.WHICH in ['run', 'run-operation'] %}
33
{% set revoke_statements = [] %}
44
{% set grant_statements = [] %}
5-
{% set existing_grants = [] %}
65
{% set execute_statements = [] %}
76

87
{% for object in objects %}
9-
{% do log("====> Processing " ~ object_type ~ " for " ~ object ~ " with grants " ~ grant_types | join(", ") ~ " and roles " ~ grant_roles | join(", "), info=True) %}
8+
{% set existing_grants = [] %} {# reset per object #}
9+
{% do log("====> Processing " ~ object_type ~ " for " ~ object ~ " with grants " ~ grant_types | join(", ") ~ " for roles " ~ grant_roles | join(", "), info=True) %}
1010
{% set query %}
1111
show grants on {{ object_type }} {{ target.database }}.{{ object }};
1212
{% endset %}
@@ -16,41 +16,52 @@
1616
{% if row.privilege not in ["OWNERSHIP", "SELECT", "REFERENCES", "REBUILD"] %}
1717
{% if row.privilege in grant_types %}
1818
{% if row.grantee_name not in grant_roles %}
19-
{{ revoke_statements.append({ "privilege" : row.privilege, "role" : row.grantee_name, "object" : object }) }}
19+
{{ revoke_statements.append({ "privilege": row.privilege, "role": row.grantee_name, "object": object }) }}
2020
{% else %}
21-
{{ existing_grants.append({ "privilege" : row.privilege, "role" : row.grantee_name, "object" : object }) }}
22-
{%endif%}
21+
{# add only once per (role, privilege, object) #}
22+
{% set exists = false %}
23+
{% for eg in existing_grants %}
24+
{% if eg.role == row.grantee_name and eg.privilege == row.privilege and eg.object == object %}
25+
{% set exists = true %}
26+
{% endif %}
27+
{% endfor %}
28+
{% if not exists %}
29+
{{ existing_grants.append({ "privilege": row.privilege, "role": row.grantee_name, "object": object }) }}
30+
{% endif %}
31+
{% endif %}
2332
{% else %}
24-
{{ revoke_statements.append({ "privilege" : row.privilege, "role" : row.grantee_name, "object" : object }) }}
25-
{%endif%}
33+
{{ revoke_statements.append({ "privilege": row.privilege, "role": row.grantee_name, "object": object }) }}
34+
{% endif %}
2635
{% endif %}
2736
{% endfor %}
37+
2838
{% for role in grant_roles %}
2939
{% do log("====> Checking " ~ object_type ~ " for " ~ object ~ " with role " ~ role, info=True) %}
3040
{% set existing_role_grants = [] %}
3141
{% for existing_grant in existing_grants %}
32-
{% if existing_grant.role == role %}
33-
{{ existing_role_grants.append(existing_grant.privilege) }}
42+
{% if existing_grant.role == role and existing_grant.object == object %}
43+
{% if existing_grant.privilege not in existing_role_grants %}
44+
{{ existing_role_grants.append(existing_grant.privilege) }}
45+
{% endif %}
3446
{% endif %}
3547
{% endfor %}
36-
{% do log("====> Checking " ~ object_type ~ " for " ~ object ~ " with role " ~ role ~ " : existing_role_grants - " ~ existing_role_grants | join(", "), info=True) %}
48+
{% do log("====> Existing grants for role " ~ role ~ " on " ~ object ~ " : " ~ (existing_role_grants | join(", ")), info=True) %}
3749
{% for privilege in grant_types %}
38-
{% do log("====> Checking " ~ object_type ~ " for " ~ object ~ " with privilege " ~ privilege, info=True) %}
3950
{% if privilege not in existing_role_grants %}
40-
{{ grant_statements.append({ "privilege" : privilege, "role" : role, "object" : object }) }}
51+
{{ grant_statements.append({ "privilege": privilege, "role": role, "object": object }) }}
4152
{% endif %}
4253
{% endfor %}
4354
{% endfor %}
44-
{%endif%}
45-
{%endfor%}
55+
{% endif %}
56+
{% endfor %}
4657
{% for stm in revoke_statements %}
4758
{{ execute_statements.append("revoke " ~ stm.privilege ~ " on " ~ object_type ~ " " ~ target.database ~ "." ~ stm.object ~ " from role " ~ stm.role ~ ";") }}
4859
{% endfor %}
4960
{% for stm in grant_statements %}
5061
{{ execute_statements.append("grant " ~ stm.privilege ~ " on " ~ object_type ~ " " ~ target.database ~ "." ~ stm.object ~ " to role " ~ stm.role ~ ";") }}
5162
{% endfor %}
5263
{% if execute_statements | length > 0 %}
53-
{% do log("Executing privilege grants and revokes for " ~ object_type ~"s...", info=True) %}
64+
{% do log("Executing privilege grants and revokes for " ~ object_type ~ "s...", info=True) %}
5465
{% for statement in execute_statements %}
5566
{% do log(statement, info=True) %}
5667
{% set grant = run_query(statement) %}

0 commit comments

Comments
 (0)