1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflakeでマスキングポリシーを適用したテーブルをcloneで別テーブルにしたらマスクはどうなるのか

Posted at

はじめに

前回書いた下記の投稿でダイナミックデータマスキングのテーブルをCTASで作り直したらどうなるかを検証しました。

CTASはわかったのでcloneも試してみようと思います。

下準備

これは前回と同様です。
コードだけ書いておきます。
すでに前回実行済みなのでここに掲載するだけで流しません。

use role sysadmin;
create database test_db;
create schema test_schema;
--対象のテーブル作成
create table masking_test_table
(
    user_name text,
    user_email text
);
--サンプルデータを2レコード
insert into masking_test_table values ('user1','user1@examle.com');
insert into masking_test_table values ('user2','user2@examle.com');
select * from masking_test_table;
--マスキングポリシーを作成(ACCOUNTADMINロールだけが生データを見れて、それ以外はマスクされた値で見せるという設定
CREATE OR REPLACE MASKING POLICY email_mask AS (val string) returns string ->
  CASE
    WHEN current_role() IN ('ACCOUNTADMIN') THEN VAL
    ELSE '*********'
  END;
--マスキングポリシーをmasking_test_tableのuser_email列に適用する
ALTER TABLE masking_test_table ALTER COLUMN user_email SET MASKING POLICY email_mask;
--動作確認
use role sysadmin;
select * from masking_test_table;
use role accountadmin;
select * from masking_test_table;

cloneで別テーブルにしたらどうなるの?の検証

1.SYSADMINでcloneでテーブル作成

use role sysadmin;
create table clone_by_sysadmin clone masking_test_table;

sysadmin(user_emailを参照できないロール)を使ってcloneでテーブル作成しました。
「clone_by_sysadmin」というテーブル名にしました。

use role sysadmin;
select * from clone_by_sysadmin;

sysadminでSELECTします。
image.png
マスクされた状態で表示されました。

use role accountadmin;
select * from clone_by_sysadmin;

accountadminでSELECTします。
image.png

マスクされずに実際の値で見れました。
クローン元のmasking_test_tableと同じです。

desc table clone_by_sysadmin;

クローンしたclone_by_sysadminテーブルの詳細を見てみます。
image.png
横スクロールが入っちゃったので左側が見えなくなりましたが、2行目がuser_emailです。
polocy_nameにEMAIL_MASKのポリシーが適用されていますね。

GUIでも見れます。
スクリーンショット 2025-02-27 180813.png

前回、CTASでテーブルを作った時にこのdescコマンドは確認していなかったのでちょっとCTASでやってみます。

use role sysadmin;
create table ctas2_by_sysadmin 
(
    user_name text,
    user_email text
)
as select user_name,user_email from masking_test_table;

desc table ctas2_by_sysadmin;

「ctas2_by_sysadmin」という名前で2を付けて作成しました。
そしてdescで確認。
スクリーンショット 2025-02-27 181735.png
policy_nameは入っていませんね。
GUIでも見てみます。
スクリーンショット 2025-02-27 181836.png
やはりマスキングポリシーは付いていません。

ということで

  • CTASだとポリシーは明示的に付けなければ付かない。
  • cloneだとポリシーは付いている。(ポリシーも含めてクローンされる。)
    という違いがあることがわかりました。

2.ACCOUNTADMINでcloneでテーブル作成

use role accountadmin;
create table clone_by_accountadmin clone masking_test_table;

--accountadminで作成したテーブルに対してsysadminでSELECT可能にする
grant select on table clone_by_accountadmin to role sysadmin;

accountadmin(user_emailを参照できるロール)を使ってcloneでテーブル作成しました。
「clone_by_accountadmin」というテーブル名にしました。
SYSADMINでも参照できるようにselect権限を付与します。

use role sysadmin;
select * from clone_by_accountadmin;

sysadminでSELECTします。
image.png
マスクされた状態で表示されました。

use role accountadmin;
select * from clone_by_accountadmin;

accountadminでSELECTします。
image.png
マスクされずに実際の値で見れました。
先ほどと同様、クローン元のmasking_test_tableと同じです。

desc table clone_by_accountadmin;

クローンしたclone_by_accountadminテーブルの詳細を見てみます。
image.png
これも先ほどと同様、ポリシーが付いていますね。
GUIの方は省略します。

まとめ

  • cloneの場合は元テーブルと同じようにマスキングポリシーも含めてクローンするので、元テーブルと全く同じになる。
  • テーブルをクローンしたロールがマスキングポリシーの適用ロールかそうでないかは影響しない。
    ということです。

わかりやすいですね。

結論

CTASよりclone。
cloneなら別データができるわけではないのでストレージ容量もかからないし。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?