Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use stored procedure arguments and ignore the Snowflake database in snowflake__get_profile_creation_query macro #632

Merged

Conversation

pei0804
Copy link
Contributor

@pei0804 pei0804 commented Dec 13, 2023

@pei0804
Copy link
Contributor Author

pei0804 commented Dec 13, 2023

-- Set credentials as variables
SET elementary_database = 'ELEMENTARY';
SET elementary_schema = 'elementary';
SET elementary_warehouse = 'HOGE_WH';
SET elementary_role = 'ELEMENTARY_ROLE';
SET elementary_username = 'elementary';
SET elementary_password = 'hoge';

-- Account admin role required to set up permissions below
USE ROLE ACCOUNTADMIN;

-- Create elementary user and role
CREATE OR REPLACE USER IDENTIFIER($elementary_username) PASSWORD = $elementary_password;
CREATE OR REPLACE ROLE IDENTIFIER($elementary_role);
GRANT ROLE IDENTIFIER($elementary_role) TO USER IDENTIFIER($elementary_username);

-- Grant elementary role access to the supplied warehouse
GRANT USAGE ON WAREHOUSE IDENTIFIER($elementary_warehouse) TO ROLE IDENTIFIER($elementary_role);

-- Read access to elementary schema
SET elementary_schema_fqn = $elementary_database || '.' || $elementary_schema;
GRANT SELECT ON ALL TABLES IN SCHEMA IDENTIFIER($elementary_schema_fqn) TO ROLE IDENTIFIER($elementary_role);
GRANT SELECT ON FUTURE TABLES IN SCHEMA IDENTIFIER($elementary_schema_fqn) TO ROLE IDENTIFIER($elementary_role);
GRANT SELECT ON ALL VIEWS IN SCHEMA IDENTIFIER($elementary_schema_fqn) TO ROLE IDENTIFIER($elementary_role);
GRANT SELECT ON FUTURE VIEWS IN SCHEMA IDENTIFIER($elementary_schema_fqn) TO ROLE IDENTIFIER($elementary_role);

-- Information schema access
CREATE OR REPLACE PROCEDURE ELEMENTARY_GRANT_INFO_SCHEMA_ACCESS(database_name STRING, role_name STRING)
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
    BEGIN
      GRANT USAGE,MONITOR ON DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
      GRANT USAGE,MONITOR ON ALL SCHEMAS IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
      GRANT USAGE,MONITOR ON FUTURE SCHEMAS IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);

      GRANT REFERENCES ON ALL TABLES IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
      GRANT REFERENCES ON ALL VIEWS IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
      GRANT REFERENCES ON ALL EXTERNAL TABLES IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);

      GRANT REFERENCES ON FUTURE TABLES IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
      GRANT REFERENCES ON FUTURE VIEWS IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
      GRANT REFERENCES ON FUTURE EXTERNAL TABLES IN DATABASE IDENTIFIER(:database_name) TO ROLE IDENTIFIER(:role_name);
    END;
  $$
;


CALL ELEMENTARY_GRANT_INFO_SCHEMA_ACCESS('RAW', $elementary_role);

CALL ELEMENTARY_GRANT_INFO_SCHEMA_ACCESS('ELEMENTARY', $elementary_role);

CALL ELEMENTARY_GRANT_INFO_SCHEMA_ACCESS('PROD', $elementary_role);

CALL ELEMENTARY_GRANT_INFO_SCHEMA_ACCESS('PREP', $elementary_role);


-- Query history access
CREATE OR REPLACE PROCEDURE ELEMENTARY_GRANT_QUERY_HISTORY_ACCESS(role_name STRING)
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
    BEGIN
      GRANT DATABASE ROLE SNOWFLAKE.OBJECT_VIEWER TO ROLE IDENTIFIER(:role_name);
      GRANT DATABASE ROLE SNOWFLAKE.USAGE_VIEWER TO ROLE IDENTIFIER(:role_name);
      GRANT DATABASE ROLE SNOWFLAKE.GOVERNANCE_VIEWER TO ROLE IDENTIFIER(:role_name);

      LET warehouses_rs RESULTSET := (SHOW WAREHOUSES);
      LET warehouses_cur CURSOR FOR warehouses_rs;
      FOR warehouse_row IN warehouses_cur DO
        LET warehouse_name VARCHAR := warehouse_row."name";
        GRANT MONITOR ON WAREHOUSE IDENTIFIER(:warehouse_name) TO ROLE IDENTIFIER(:role_name);
      END FOR;
    END;
  $$
;
CALL ELEMENTARY_GRANT_QUERY_HISTORY_ACCESS($elementary_role);

@pei0804 pei0804 force-pushed the fix-create-elementary-user-macro branch from ecac65f to 2b2bb2f Compare December 13, 2023 08:34
@haritamar haritamar merged commit 6210609 into elementary-data:master Dec 13, 2023
2 of 10 checks passed
@pei0804 pei0804 deleted the fix-create-elementary-user-macro branch December 14, 2023 15:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants