CREATE MASK ステートメント
CREATE MASK ステートメントは、現行サーバーで列マスクを作成します。 列マスク は列アクセス制御に使用され、指定された列に戻す値を指定します。
呼びかけ CREATE MASK
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 これは、DYNAMICRULES RUN動作が有効になっている場合にのみ、動的に準備できる実行可能なステートメントです。 詳細は、「Authorization IDs and dynamic SQL」 を参照してください。
承認 CREATE MASK
以下に定義する特権セットには、次に示す権限が含まれていなければなりません。
- SECADM 権限
SECADM 権限では、任意のスキーマに列マスクを作成できます。 マスク定義内でその他のオブジェクトを参照するために必要なその他の権限はありません。 例えば、表を照会するための SELECT 特権や、ユーザー定義関数を呼び出すための EXECUTE 特権は必要ありません。
特権セット: アプリケーション・プログラムにこのステートメントを組み込む場合、特権セットは、パッケージ所有者が持つ特権セットとなります。 このステートメントが動的に準備される場合、特権セットは、プロセスの SQL 許可 ID が持つ特権セットとなります。 ただし、ROLE AS OBJECT OWNER AND QUALIFIER 文節で定義されているトラステッド・コンテキスト内でプロセスが実行されている場合、特権セットは、有効なロールが持つ特権セットとなります。
構文 CREATE MASK
説明の対象: CREATE MASK
- マスク名
- 列マスクの名前を指定します。 この名前 (暗黙修飾子または明示修飾子を含む) には、現行サーバーに既に存在する列マスクまたは行の許可を指定しないでください。
- ON テーブル名
- 列マスクを作成する対象の表を指定します。 この名前は、現行サーバーに存在する表を示すものでなければなりません。 以下のオブジェクトを指定することはできません。
- 補助表
- 作成済みまたは宣言済みの一時表
- ビュー
- カタログ表
- 別名
- シノニム
- マテリアライズ照会表の定義で直接または間接的に参照される、マテリアライズ照会表または表
- XML 列のために暗黙的に作成された表
- 期間が含まれている表
- 履歴表
- アクセラレーターのみの表
- アーカイブ可能な表
- アーカイブ表
- 相関名
- 表を指定するために case-expression 内で使用できる相関名を指定します。 相関名については、「相関名」 を参照してください。
- FOR COLUMN カラム名
- マスクを適用する列を指定します。 column-name は、指定された表の列を識別する非修飾名でなければなりません。 この列にはマスクが既に存在していてはなりません。 以下の列は指定できません。
- LOB 列、または LOB に基づく特殊タイプ列
- XML 列
- FIELDPROC で定義されている列
- RETURN ケース式
- 列に返される値を判別する CASE 式を指定します。 CASE 式の結果が、行の列値の位置に返されます。 CASE 式の結果のデータ・タイプ、NULL 属性、データ長、サブタイプ、コード化スキーム、および CCSID は、column-name により指定される列の属性と一致している必要があります。 column-name のデータ・タイプがユーザー定義データ・タイプの場合、CASE 式の結果のデータ・タイプは、同じユーザー定義データ・タイプでなければなりません。 CASE 式で参照してはならないオブジェクトを以下に示します。
- リモート・オブジェクト
- 列マスクが定義されている表
- 作成済みのグローバル一時表または宣言済みのグローバル一時表
- 補助表
- XML 列のために暗黙的に作成された表
- FIELDPROC を使用して定義されている列
- LOB 列、または LOB に基づく特殊タイプ列
- XML 列
- SELECT 文節内の選択リストの表記:
*またはname.* - 表関数
- コレクション派生表 (UNNEST)
- 非セキュアとして定義されているユーザー定義関数
- 非 deterministic 関数または外部アクションが含まれている関数
- 集約関数 (副照会に指定されている場合を除く)
- 組み込み表関数
- XMLTABLE 表関数
- XMLEXISTS 述部
- OLAP 仕様
- ROW CHANGE 式
- シーケンス参照
- ホスト変数、SQL 変数、SQL パラメーター、またはトリガー遷移変数
- パラメーター・マーカー
- 期間指定が含まれている表参照。
- 前述のいずれかの制限が定義に含まれるビュー。
- アクセラレーターのみの表
AI_ANALOGY、AI_COMMONALITY、AI_SEMANTIC_CLUSTER、またはAI_SIMILARITY関数。
表のコード化スキームは、CASE 式の評価に使用されます。 Unicode 列が入っている EBCDIC 表を除く、複数のコード化スキーム評価を必要とする表および言語エレメントを CASE 式で参照してはなりません。 複数の評価を必要とする言語要素については、 文字列の符号化スキームとCCSIDルールを参照のこと。
行アクセス制御または列アクセス制御がアクティブになっている表を CASE 式で参照している場合、これらの表のアクセス制御はカスケードされません。
- 無効にするか、 ENABLE
- 列アクセス制御のための列マスクを有効または無効にすることを指定します。
- DISABLE
- 列アクセス制御のための列マスクを無効にすることを指定します。 表で列アクセス制御がアクティブにされているかどうかに関係なく、列マスクは無効になります。
DISABLE がデフォルトです。
- ENABLE
- 列アクセス制御のための列マスクを有効にすることを指定します。 表で列アクセス制御が現在アクティブではない場合、表の列アクセス制御がアクティブにされる時点で列マスクが有効になります。 表で列アクセス制御が現在アクティブな場合、列マスクは直ちに有効になり、この表を参照する動的ステートメント・キャッシュ内のステートメントとパッケージはすべて無効になります。 詳細は、「パッケージが無効になる変更 」を参照してください。
注釈 CREATE MASK
例 CREATE MASK
以下の例では、列 SSN のデータ・タイプは VARCHAR (11) です。
- 例 1
- 表 EMPLOYEE の列アクセス制御がアクティブになった後で、給与管理部門の Paul は、従業員番号が 123456 の従業員のソーシャル・セキュリティー番号を確認できます。 管理者 Mary は、ソーシャル・セキュリティー番号の最後の 4 文字のみを確認できます。 Peter は給与管理部門に属しておらず、また管理者でもないため、ソーシャル・セキュリティー番号を確認できません。
CREATE MASK SSN_MASK ON EMPLOYEE FOR COLUMN SSN RETURN CASE WHEN (VERIFY_GROUP_FOR_USER(SESSION_USER,'PAYROLL') = 1) THEN SSN WHEN (VERIFY_GROUP_FOR_USER(SESSION_USER,'MGR') = 1) THEN 'XXX-XX-' || SUBSTR(SSN,8,4) ELSE NULL END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT SSN FROM EMPLOYEE WHERE EMPNO = 123456; - 例 2
- SELECT ステートメントで、列マスク SSN_MASK に使用されている式と同じ式に列 SSN が組み込まれています。 表 EMPLOYEE に対して列アクセス制御をアクティブにした後に、列マスク SSN_MASK が SELECT ステートメントの列 SSN に適用されます。 この特定の式の場合、SELECT ステートメントの結果は、すべてのユーザーに対して列アクセス制御をアクティブにする前と同じ結果になります。 ユーザーは SELECT ステートメントの式を列 SSN に置き換え、同じ式が 2 回評価されることを防ぐことができます。
CREATE MASK SSN_MASK ON EMPLOYEE FOR COLUMN SSN RETURN CASE WHEN (1 = 1) THEN 'XXX-XX-' || SUBSTR(SSN,8,4) ELSE NULL END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT 'XXX-XX-' || SUBSTR(SSN,8,4) FROM EMPLOYEE WHERE EMPNO = 123456; - 例 3
- 州政府が、各都市の世帯における図書館利用に関する調査を実施しました。 各都市から 50 世帯がこの調査対象として抽出されました。 各世帯には、調査結果から生成されるすべてのレポートにおいて各自の利用状況を表示するかどうかを指定するオプション (オプトインまたはオプトアウト) が与えられました。
SELECT ステートメントを使用して、各都市の世帯の平均利用時間を示すレポートが生成されます。 抽出された世帯が選択したオプトインまたはオプトアウトの情報に基づいて都市名をマスクするため、列マスク CITY_MASK が作成されます。 ただし、表 LIBRARY_ USAGE に対して列アクセス制御をアクティブにした後に、SELECT ステートメントがバインド時エラーを受け取りました。 このエラーは、列マスク CITY_MASK が別の列 LIBRARY_OPT を参照しており、この LIBRARY_OPT がグループ化列を識別していないために発生します。
CREATE MASK CITY_MASK ON LIBRARY_USAGE FOR COLUMN CITY RETURN CASE WHEN (LIBRARY_OPT = 'OPT-IN') THEN CITY ELSE ' ' END ENABLE; COMMIT; ALTER TABLE LIBRARY_USAGE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT CITY, AVG(LIBRARY_TIME) FROM LIBRARY_USAGE GROUP BY CITY; - 例 4
- EMPNO が 123456 の従業員の 5 月のボーナスは $8000、給与は $80000 です。 管理職がこの従業員の給与を取り出すときに、NULL 値ではなく給与額が取り出されます。 これは、列マスク SALARY_MASK が、列マスク
BONUS_MASK が定義されている列 BONUS を参照する場合、カスケード効果が発生しないためです。
CREATE MASK SALARY_MASK ON EMPLOYEE FOR COLUMN SALARY RETURN CASE WHEN (BONUS < 10000) THEN SALARY ELSE NULL END ENABLE; COMMIT; CREATE MASK BONUS_MASK ON EMPLOYEE FOR COLUMN BONUS RETURN CASE WHEN (BONUS > 5000) THEN NULL ELSE BONUS END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT SALARY FROM EMPLOYEE WHERE EMPNO = 123456; - 例 5
- この例では、 Db2 が「WHEN target-column IS NULL THEN NULL」をカラムマスク定義の最初のWHEN句として追加し、その後にカラムマスク定義をステートメントにマージしています。
CREATE EMPLOYEE (EMPID INT, DEPTID CHAR(8), SALARY DEC(9,2) NOT NULL, BONUS DEC(9,2)); CREATE MASK SALARY_MASK ON EMPLOYEE FOR COLUMN SALARY RETURN CASE WHEN SALARY < 10000 THEN CAST(SALARY*2 AS DEC(9,2)) ELSE COALESCE(CAST(SALARY/2 AS DEC(9,2)), BONUS) END ENABLE; COMMIT; CREATE MASK BONUS_MASK ON EMPLOYEE FOR COLUMN BONUS RETURN CASE WHEN BONUS > 1000 THEN BONUS ELSE NULL END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT SALARY FROM DEPT LEFT JOIN EMPLOYEE ON DEPTNO = DEPTID; /* When SALARY_MASK is merged into the above statement, * 'WHEN SALARY IS NULL THEN NULL' is added as the * first WHEN clause, as follows: */ SELECT CASE WHEN SALARY IS NULL THEN NULL WHEN SALARY < 10000 THEN CAST(SALARY*2 AS DEC(9,2)) ELSE COALESCE(CAST(SALARY/2 AS DEC(9,2)), BONUS) END SALARY FROM DEPT LEFT JOIN EMPLOYEE ON DEPTNO = DEPTID;
