Streamlit in Snowflake 中的行访问策略¶
本主题介绍如何在 Streamlit in Snowflake 中使用上下文函数和行访问策略。
Streamlit in Snowflake 中的上下文函数和行访问策略¶
要在 Streamlit in Snowflake 应用程序中使用 CURRENT_USER 等 上下文函数 以及具有 行访问策略 的表中的数据,具有 ACCOUNTADMIN 角色的用户必须将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色,如以下示例所示:
USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
备注
在 Streamlit in Snowflake 应用中,无法利用使用 CURRENT_ROLE 的行访问策略。Streamlit in Snowflake 应用以所有者权限运行,因此在 Streamlit 应用中使用 CURRENT_ROLE 总是返回应用所有者角色。有关更多信息,请参阅 了解所有者的权限和 Streamlit in Snowflake 应用程序。
示例:使用 CURRENT_USER 访问具有行访问策略的表中的数据¶
您可以使用 Streamlit in Snowflake 应用程序来治理对受行访问策略保护的表中的行的访问。在行访问策略的正文中指定 CURRENT_USER 函数,并将行访问策略添加到表中。
以下示例演示了如何在 Streamlit in Snowflake 应用程序中治理对受行访问策略保护的表的访问。
创建表并插入数据:
CREATE TABLE row_access_policy_test_table ( id INT, some_data VARCHAR(100), the_owner VARCHAR(50) ); INSERT INTO row_access_policy_test_table (id, some_data, the_owner) VALUES (4, 'Some information 4', 'ALICE'), (5, 'Some information 5', 'FRANK'), (6, 'Some information 6', 'ALICE');
创建行访问策略:
CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy AS (the_owner VARCHAR) RETURNS BOOLEAN -> the_owner = CURRENT_USER();
将行访问策略添加到表中:
ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
创建一个 Streamlit 应用程序。
将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色:
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
将以下代码添加到 Streamlit 应用程序中:
# Import Python packages import streamlit as st from snowflake.snowpark.context import get_active_session st.title("CURRENT_USER() + Row Access Policy in SiS Demo :balloon:") st.write( """You can access `CURRENT_USER()` and data from tables with row access policies in Streamlit in Snowflake apps """) # Get the current credentials session = get_active_session() st.header('Demo') st.subheader('Credentials') sql = "SELECT CURRENT_USER();" df = session.sql(sql).collect() st.write(df) st.subheader('Row Access on a Table') sql = "SELECT * FROM st_db.st_schema.row_access_policy_test_table;" df = session.sql(sql).collect() st.write(df)