[新機能]Universal Searchの検索結果に権限がないデータベースオブジェクトを出力可能となる「OBJECT_VISIBILITY」プロパティを試してみた
さがらです。
Universal Searchの検索結果に権限がないデータベースオブジェクトを出力可能となる「OBJECT_VISIBILITY」プロパティがパブリックプレビューとなりました。
この機能を試してみたので、その内容をまとめてみます。
OBJECT_VISIBILITYプロパティ
OBJECT_VISIBILITYプロパティですが、アカウント、データベース、スキーマの各レベルで設定でき、オブジェクトを誰に「見える」ようにするかを制御するプロパティとなっています。
具体例としては下記のように定義することで、「指定した組織内のアカウントの全ユーザー(account:
で設定)」あるいは「組織ユーザーグループに含まれる全ユーザー(organization_user_group:
で設定)」に対して、Universal Searchの検索結果に表示させる事が可能となります。
ALTER DATABASE product_analytics
SET OBJECT_VISIBILITY =
$$
organization_targets:
- account: <account_name_1>
- account: <account_name_2>
- ...
- organization_user_group: <org_user_group_1>
- organization_user_group: <org_user_group_2>
$$;
他のオプションやより詳細な仕様については、公式Docをご覧ください。
検証すること
ある組織内で以下の2アカウントがあり、「SAGARA_PROD
アカウント内のデータベースをSAGARA_DEV
からも検索できるようにする」ということをやってみます。
SAGARA_PROD
:本番運用をしていると仮定したアカウントSAGARA_DEV
:開発専用と仮定したアカウント
事前準備
SAGARA_PROD
アカウント内で適当なデータベースを作成します。
-- ロールをACCOUNTADMINに設定
USE ROLE ACCOUNTADMIN;
-- ========== 1. 環境準備 ==========
-- CONTACTオブジェクトを管理するためのDBとスキーマを作成
CREATE DATABASE IF NOT EXISTS GOVERNANCE;
CREATE SCHEMA IF NOT EXISTS GOVERNANCE.CONTACTS;
-- 付与対象のSALESデータベースを作成
CREATE DATABASE IF NOT EXISTS SALES;
-- SALESデータベース配下にPUBLICスキーマとテーブルを作成
CREATE SCHEMA IF NOT EXISTS SALES.PUBLIC;
CREATE OR REPLACE TABLE SALES.PUBLIC.CUSTOMER (
CUSTOMER_ID NUMBER,
CUSTOMER_NAME VARCHAR,
EMAIL VARCHAR,
REGISTRATION_DATE DATE
);
-- ========== 2. 3種類のCONTACTオブジェクトを作成 ==========
-- 作業スキーマをCONTACTS用に切り替え
USE SCHEMA GOVERNANCE.CONTACTS;
-- (1) ユーザー用のCONTACTを作成 (Steward向け)
-- 'user1'の部分は、実際に存在するユーザー名に置き換えてください
CREATE OR REPLACE CONTACT approver_contact_user
USERS = ('SAGARA_SATOSHI');
-- (2) Email用のCONTACTを作成 (Support向け)
CREATE OR REPLACE CONTACT support_contact_email
EMAIL_DISTRIBUTION_LIST = 'sales-support@example.com';
-- (3) URL用のCONTACTを作成 (Approver向け)
CREATE OR REPLACE CONTACT inquiry_contact_url
URL = 'https://classmethod.jp/inquiry/';
-- ========== 3. データベースへ3種類のCONTACTを関連付け ==========
-- ロールを再度ACCOUNTADMINに設定(念のため)
USE ROLE ACCOUNTADMIN;
-- SALESデータベースに、各目的でCONTACTを一度に関連付け
ALTER DATABASE SALES SET
CONTACT STEWARD = GOVERNANCE.CONTACTS.approver_contact_user;
ALTER DATABASE SALES SET
CONTACT SUPPORT = GOVERNANCE.CONTACTS.support_contact_email;
ALTER DATABASE SALES SET
CONTACT ACCESS_APPROVAL = GOVERNANCE.CONTACTS.inquiry_contact_url;
-- ========== 4. 設定内容の確認 ==========
-- SALESデータベースに設定された全てのCONTACT情報を照会
SELECT *
FROM TABLE(SNOWFLAKE.CORE.GET_CONTACTS('SALES', 'DATABASE'));
最後に実行するSELECT文の結果は、下図のようになります。
OBJECT_VISIBILITYプロパティの設定
作成したデータベースに対して、OBJECT_VISIBILITYプロパティの設定をしていきます。(おまけで、同じSAGARA_PRODアカウント内の権限を持たないユーザーからも検索できるようにしてみます。)
以下のクエリを実行すればOKです。注意点として、公式Docにもあるようにこの設定を行った後Universal Searchの結果に現れるまで数時間かかります。(私の場合は、設定後1時間では現れず、設定後8時間で検索結果に現れました。)
USE ROLE ACCOUNTADMIN;
-- SALESデータベースを「同じSAGARA_PRODアカウント内の権限を持たないユーザー」、「別のSAGARA_DEVアカウントの全ユーザー」から検索可能にする
ALTER DATABASE SALES
SET OBJECT_VISIBILITY = $$
organization_targets:
- account: SAGARA_PROD
- account: SAGARA_DEV
$$;
別アカウントからUniversal Searchで検索してみる
OBJECT_VISIBILITYプロパティの設定で入れたSAGARA_DEV
から、Universal Searchで検索できるかを確認してみます。(上述の通り、設定後8時間経過してから検索をしてみました。)
作成したデータベースであるsales
で検索すると、下図のようにデータベースとテーブルがヒットしました!
また、Databases & schemas
とTables & views
では下図のように表示されます。今回は同じ組織内の別アカウントのデータが対象のためか、Request access
のボタンは見当たらず、Sign into account
が表示される形となっていました。
Databases & schemas
Tables & views
同じアカウントからUniversal Searchで検索してみる
もう一つおまけでOBJECT_VISIBILITYプロパティの設定で入れた同じアカウントであるSAGARA_PROD
から、データベース作成に用いたACCOUNTADMINではない別のロールを使ってUniversal Searchで検索できるかを確認してみます。
作成したデータベースであるsales
で検索すると、下図のようにデータベースとテーブルがヒットしました!また、Request access
のボタンが表示されていました!
Request access
のボタンを押すと下図のように表示されます。ACCESS_APPROVAL
にURL
を持つcontactを設定していると、下図のようにURLが表示され、問い合わせすることができます。
最後に
Universal Searchの検索結果に権限がないデータベースオブジェクトを出力可能となる「OBJECT_VISIBILITY」プロパティを試してみました。
個人的にデータカタログに欲しい機能の中でもトップクラスに入る「閲覧権限がないデータをカタログで知り、そのままアクセスリクエストも行える」がSnowflake内で実現する日が来るとは思いませんでした…
まだパブリックプレビューのため、今後の機能拡張にも期待ができます。ぜひご活用ください!