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)