Streamlit in Snowflake での行アクセスポリシー¶
このトピックでは、 Streamlit in Snowflake ウェアハウスランタイムでのコンテキスト関数と行アクセスポリシーの使用について説明します。
In container runtimes, context functions on owner's rights connections will return values from the owner role's context and so are not appropriate for user-targeted row access policies. However, restricted caller's rights connections return the viewer's context. For more information, see 制限された呼び出し元権限と|sis|.
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)