======
VIEWS
======
USE DATABASE PUBLIC_DB;
// Create a schema for views
CREATE SCHEMA MYVIEWS;
// Requirement: Need Contact details for BRAZIL customers.
// Create customre view
CREATE OR REPLACE VIEW MYVIEWS.VW_CUSTOMER
AS
SELECT CST.C_CUSTKEY, CST.C_NAME, CST.C_ADDRESS, CST.C_PHONE FROM
SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.CUSTOMER CST
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.NATION NTN
ON CST.C_NATIONKEY = NTN.N_NATIONKEY
WHERE NTN.N_NAME='BRAZIL';
// Query the view and see query profile how it is fetching data from underlying
tables
SELECT * FROM MYVIEWS.VW_CUSTOMER;
// Turno off cached results and suspend warehouse
ALTER SESSION SET USE_CACHED_RESULT=FALSE;
SELECT * FROM MYVIEWS.VW_CUSTOMER;
// Grant access to role PUBLIC
GRANT USAGE ON DATABASE PUBLIC_DB TO ROLE PUBLIC;
GRANT USAGE ON SCHEMA PUBLIC_DB.MYVIEWS TO ROLE PUBLIC;
GRANT SELECT ON VIEW PUBLIC_DB.MYVIEWS.VW_CUSTOMER TO ROLE PUBLIC; -- role or user
who needs BRAZIL customers data
=============
SECURE VIEWS
=============
// Requirement: Need all details of AMERICA customers
// Create secure view
CREATE SECURE VIEW MYVIEWS.SEC_VW_CUSTOMER
AS
SELECT CST.* FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.CUSTOMER CST
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.NATION NTN
ON CST.C_NATIONKEY = NTN.N_NATIONKEY
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.REGION RGN
ON NTN.N_REGIONKEY = RGN.R_REGIONKEY
WHERE RGN.R_NAME='AMERICA';
// Query secure view
SELECT * FROM MYVIEWS.SEC_VW_CUSTOMER;
// Grant access to role PUBLIC
GRANT USAGE ON DATABASE PUBLIC_DB TO ROLE PUBLIC;
GRANT USAGE ON SCHEMA PUBLIC_DB.MYVIEWS TO ROLE PUBLIC;
GRANT SELECT ON VIEW PUBLIC_DB.MYVIEWS.SEC_VW_CUSTOMER TO ROLE PUBLIC; -- role or
user who needs AMERICA customers data
// How to Identify a View is secure?
SELECT table_catalog, table_schema, table_name, is_secure
FROM public_db.information_schema.views;
SHOW VIEWS;
// Switch to public role and check
SHOW VIEWS; -- only owner can see the definition of view
==================
MATERIALIZED VIEWS
===================
//Try creating a mat view with multiple table - it won't work
CREATE MATERIALIZED VIEW MYVIEWS.MAT_VW_CUSTOMER
AS
SELECT CST.* FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.CUSTOMER CST
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.NATION NTN
ON CST.C_NATIONKEY = NTN.N_NATIONKEY
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.REGION RGN
ON NTN.N_REGIONKEY = RGN.R_REGIONKEY
WHERE RGN.R_NAME='AMERICA';
// Requirement: I want to check frequently the High priority order details.
// Create materialized view
CREATE MATERIALIZED VIEW MYVIEWS.MAT_VW_ORDERS
AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
WHERE SUBSTRING(O_ORDERPRIORITY,1,1)='2';
-- AND YEAR(O_ORDERDATE)=2022 AND MONTH(O_ORDERDATE)=7
// Query mat view and see query profile, run after some time
SELECT * FROM MYVIEWS.MAT_VW_ORDERS;
// Grant access to PUBLIC role
GRANT USAGE ON DATABASE PUBLIC_DB TO ROLE PUBLIC;
GRANT USAGE ON SCHEMA PUBLIC_DB.MYVIEWS TO ROLE PUBLIC;
GRANT SELECT ON VIEW PUBLIC_DB.MYVIEWS.MAT_VW_ORDERS TO ROLE PUBLIC;
// How to see the mat views?
SHOW MATERIALIZED VIEWS;
// How to check the refresh history?
SELECT * FROM TABLE(INFORMATION_SCHEMA.MATERIALIZED_VIEW_REFRESH_HISTORY());