Streamlit in Snowflake 中的行访问策略

This topic describes using context functions and row access policies in Streamlit in Snowflake warehouse runtimes.

在容器运行时,上下文函数始终返回所有者角色上下文中的值,因此不适用于针对用户的行访问策略。

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
语言: 中文