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;
Copy

备注

在 Streamlit in Snowflake 应用中,无法利用使用 CURRENT_ROLE 的行访问策略。Streamlit in Snowflake 应用以所有者权限运行,因此在 Streamlit 应用中使用 CURRENT_ROLE 总是返回应用所有者角色。有关更多信息,请参阅 了解所有者的权限和 Streamlit in Snowflake 应用程序

示例:使用 CURRENT_USER 访问具有行访问策略的表中的数据

您可以使用 Streamlit in Snowflake 应用程序来治理对受行访问策略保护的表中的行的访问。在行访问策略的正文中指定 CURRENT_USER 函数,并将行访问策略添加到表中。

以下示例演示了如何在 Streamlit in Snowflake 应用程序中治理对受行访问策略保护的表的访问。

  1. 创建表并插入数据:

    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');
    
    Copy
  2. 创建行访问策略:

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. 将行访问策略添加到表中:

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. 创建一个 Streamlit 应用程序。

  5. 将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色:

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. 将以下代码添加到 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)
    
    Copy
语言: 中文