カスタム分類子の使用

カスタム分類が CUSTOM_CLASSIFIER クラスを使用することにより、データエンジニアはデータに関する独自の知識に基づいてデータ分類機能を拡張することができます。選択したデータベースとスキーマで CUSTOM_CLASSIFIER クラスのインスタンスを作成し、インスタンスメソッドを呼び出して、インスタンスに関連する正規表現を管理できます。

コマンドとメソッド

以下のメソッドと SQL コマンドがサポートされています。

アクセス制御

これらのセクションでは、インスタンスを使用するために必要なさまざまなオブジェクトのロールと付与をまとめています。

ロール

カスタム分類で以下のロールを使用できます。

  • SNOWFLAKE.CLASSIFICATION_ADMIN: カスタム分類インスタンスの作成を可能にするデータベースロール。

  • custom_classifier !PRIVACY_USER: インスタンス上で以下のメソッドを呼び出すことができる インスタンスロール:

    • ADD_REGEX

    • LIST

    • DELETE_CATEGORY

  • インスタンでOWNERSHIP権限を持つアカウントロールは、これらのコマンドを実行できます。

    • DROP CUSTOM_CLASSIFIER

    • SHOW CUSTOM_CLASSIFIER

付与

インスタンスを作成して管理するには、 CREATE SNOWFLAKE 、 DATA_PRIVACY 、 CUSTOM_CLASSIFIER 権限 をロールに付与するか、 PRIVACY_USER インスタンスロールをロールに付与するかを選択します。

インスタンスロールをアカウントロールとデータベースロールに付与して、他のユーザーがカスタム分類インスタンスを操作できるようにすることができます。

GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  TO ROLE <role_name>

REVOKE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  FROM ROLE <role_name>

GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  TO DATABASE ROLE <database_role_name>

REVOKE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  FROM DATABASE ROLE <database_role_name>
Copy

条件:

name

カスタム分類インスタンスの名前を指定します。

role_name

アカウントロールの名前を指定します。

database_role_name

データベースロールの名前を指定します。

インスタンスのメソッドを呼び出すには、ウェアハウスを使わなければなりません。ただし、 GRANT OWNERSHIP コマンドを使用して、インスタンスの所有権を別のロールまたはデータベースロールに移すことはできません。

カスタムロール my_classification_role に、必要なインスタンスロールと、 CUSTOM_CLASSIFIER クラスのインスタンスを作成して使用する権限を付与するには、以下のステートメントを実行します:

USE ROLE ACCOUNTADMIN;
GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN
  TO ROLE my_classification_role;
GRANT USAGE ON DATABASE mydb TO ROLE my_classification_role;
GRANT USAGE ON SCHEMA mydb.instances TO ROLE my_classification_role;
GRANT USAGE ON WAREHOUSE wh_classification TO ROLE my_classification_role;
Copy

特定のインスタンスを使用できるようにする data_analyst など、特定のロールを有効にしたい場合は、次のようにします:

GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE
  mydb.sch.my_instance!PRIVACY_USER TO ROLE data_analyst;
Copy

カスタム分類子を使用してデータを分類するための、高レベルのアプローチは次のとおりです。

  1. 分類するテーブルを特定します。

  2. SQL を使用して次を実行します。

    1. カスタム分類インスタンスを作成します。

    2. システムタグのカテゴリと正規表現をインスタンスに追加します。

    3. テーブルを分類します。

テーブルを分類するカスタム分類子を作成するには、次の手順を実行します。

  1. テーブル data.tables.patient_diagnosis の列の1つに、 ICD-10コード のような診断コードが含まれているとします。

    +-------------+----------------------------------------------------------+
    | ICD_10_CODE | DESCRIPTION                                              |
    +-------------+----------------------------------------------------------+
    | G30.9       | Alzheimer's disease, unspecified                         |
    | G80.8       | Other cerebral palsy                                     |
    | S13.4XXA    | Sprain of ligaments of cervical spine, initial encounter |
    +-------------+----------------------------------------------------------+
    
    Copy

    このテーブルには、医療施設で治療を受けた患者の氏名、固有の健康保険識別子、生年月日など、患者を識別するための列も含まれる場合があります。データ所有者はテーブルを分類して列が正しくタグ付けされていることを確認することで、テーブルをモニターできます。

    この例では、データ所有者のロールにはすでに次の権限が付与されています。

    • 分類するテーブルに対する OWNERSHIP。

    • テーブルを含むスキーマに対する OWNERSHIP。

    • スキーマとテーブルを含むデータベースに対する USAGE。

  2. データ所有者ロールに SNOWFLAKE.CLASSIFICATION_ADMIN データベースロールを付与することで、データ所有者がテーブルを分類できるようにします。

    USE ROLE ACCOUNTADMIN;
    GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN
      TO ROLE data_owner;
    
    Copy
  3. データ所有者として、カスタム分類インスタンスを保存するスキーマを作成します。

    USE ROLE data_owner;
    CREATE SCHEMA data.classifiers;
    
    Copy
  4. CREATE CUSTOM_CLASSIFIER コマンドを使用して、 data.classifiers スキーマにカスタム分類インスタンスを作成します。

    CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER medical_codes();
    
    Copy

    オプションで、 検索パス を以下のように更新することができます:

    • クラスの新しいインスタンスを作成するときに、クラスの完全修飾名を指定する必要がないように、 SNOWFLAKE.DATA_PRIVACY を追加します。

    • インスタンス上でメソッドを呼び出すときや、インスタンスでコマンドを使用するときに、インスタンスの完全修飾名を指定する必要がないように、 DATA.CLASSIFIERS を追加します。

  5. SHOW CUSTOM_CLASSIFIER コマンドを使用して、作成した各インスタンスを一覧表示します。例:

    SHOW SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER;
    
    Copy

    戻り値:

    +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
    | created_on                       | name          | database_name | schema_name | current_version | comment | owner       |
    +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
    | 2023-09-08 07:00:00.123000+00:00 | MEDICAL_CODES | DATA          | CLASSIFIERS | 1.0             | None    | DATA_OWNER  |
    +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
    
  6. インスタンスの custom_classifier !ADD_REGEX メソッドを呼び出して、列の ICD-10コードを識別するためのシステムタグと正規表現を指定します。この例の正規表現は、すべての可能な ICD-10コードに一致します。列名に一致する正規表現、 ICD.*、コメントはオプションです。

    CALL medical_codes!ADD_REGEX(
      'ICD_10_CODES',
      'IDENTIFIER',
      '[A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4}',
      'ICD.*',
      'Add a regex to identify ICD-10 medical codes in a column',
      0.8,
    );
    
    Copy

    戻り値:

    +---------------+
    |   ADD_REGEX   |
    +---------------+
    | ICD_10_CODES  |
    +---------------+
    

    Tip

    カスタム分類インスタンスに正規表現を追加する前に、正規表現をテストします。例:

    SELECT icd_10_code
    FROM medical_codes
    WHERE icd_10_code REGEXP('[A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4}');
    
    Copy
    +-------------+
    | ICD-10-CODE |
    +-------------+
    | G30.9       |
    | G80.8       |
    | S13.4XXA    |
    +-------------+
    

    このクエリでは、正規表現に一致する有効な値のみが返されます。クエリは xyz などの無効な値を返しません。

    詳細については、 文字列関数(正規表現) をご参照ください。

  7. インスタンスの custom_classifier !LIST メソッドを呼び出して、インスタンスに追加した正規表現を検証します。

    SELECT medical_codes!LIST();
    
    Copy

    戻り値:

    +--------------------------------------------------------------------------------+
    | MEDICAL_CODES!LIST()                                                           |
    +--------------------------------------------------------------------------------+
    | {                                                                              |
    |   "ICD-10-CODES": {                                                            |
    |     "col_name_regex": "ICD.*",                                                 |
    |     "description": "Add a regex to identify ICD-10 medical codes in a column", |
    |     "privacy_category": "IDENTIFIER",                                          |
    |     "threshold": 0.8,                                                          |
    |     "value_regex": "[A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4}"                   |
    |   }                                                                            |
    | }                                                                              |
    +--------------------------------------------------------------------------------+
    

    カテゴリを削除するには、インスタンスの custom_classifier !DELETE_CATEGORY メソッドを呼び出します。

  8. テーブルを分類するには SQL を使用します。詳細については、 SQL を使用してスキーマ内のテーブルを非同期的に分類する をご参照ください。

  9. インスタンスが不要になった場合は、 DROP CUSTOM_CLASSIFIER コマンドを使用してカスタム分類インスタンスをシステムから削除します。

    DROP SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER data.classifiers.medical_codes;
    
    Copy

カスタム分類子の監査

以下のクエリを使用して、カスタム分類インスタンスの作成、インスタンスへの正規表現の追加、およびインスタンスの削除を監査できます。

  • カスタム分類インスタンスの作成を監査するには、以下のクエリを使用します:

    SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    WHERE query_text ILIKE 'create % snowflake.data_privacy.custom_classifier%';
    
    Copy
  • 特定のインスタンスへの正規表現の追加を監査するには、次のクエリを使用し、 DB.SCH.MY_INSTANCE を監査したいインスタンス名に置き換えます:

    SELECT
        QUERY_HISTORY.user_name,
        QUERY_HISTORY.role_name,
        QUERY_HISTORY.query_text,
        QUERY_HISTORY.query_id
      FROM
        SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY query_history,
        SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY access_history,
          TABLE(FLATTEN(input => access_history.direct_objects_accessed)) flattened_value
    WHERE flattened_value.value:"objectName" = 'DB.SCH.MY_INSTANCE!ADD_REGEX'
    AND QUERY_HISTORY.query_id = ACCESS_HISTORY.query_id;
    
    Copy
  • カスタム分類インスタンスの削除を監査するには、以下のクエリを使用します:

    SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    WHERE query_text ILIKE 'drop % snowflake.data_privacy.custom_classifier%';
    
    Copy