例: 行レベル セキュリティ保護のあるテーブルからの行選択 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Published
2021年1月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/vnq1596660420420.ditamap
dita:ditavalPath
ja-JP/vnq1596660420420.ditaval
dita:id
B035-1146
Product Category
Software
Teradata Vantage

この例は、選択リストまたはSELECT文のWHERE句において行レベル セキュリティ制約列の名前を指定する方法を示します。

まず、行レベル セキュリティ制約を定義します。group_membership制約オブジェクトの作成テキストは次のようになります。

     CREATE CONSTRAINT group_membership SMALLINT, NOT NULL,
     VALUES (exec:100, manager:90, clerk:50, peon:25),
     INSERT SYSLIB.ins_grp_member,
     SELECT SYSLIB.rd_grp_member;

このテーブル定義では、データベースは、このテーブルの作成時にgroup_membershipという名前の行レベル セキュリティ制約列をemp_recordテーブルに明示的に追加します。group_membership列には、行レベル セキュリティ制約のデータが含まれます。

     CREATE TABLE emp_record (
       emp_name   VARCHAR(30),
       emp_number INTEGER,
       salary     INTEGER,
       group_membership CONSTRAINT)
     UNIQUE PRIMARY INDEX(emp_name);

emp_recordの作成後に、問合わせのための選択リスト内で該当する列の名前を指定することにより、group_membership列から指定したデータを取得するSELECT文を使用できます。

以下は、選択リストにgroup_membershipが含まれるemp_recordテーブルでのSELECT文の例です。

     SELECT emp_name, group_membership
     FROM emp_record
     WHERE group_membership=90;

必須のセキュリティ クレデンシャルがある場合、この問合わせは、すべてのマネージャに対してemp_nameおよびgroup_membershipの値名および値コードを返します。必須のクレデンシャルがない場合、行は返されません。値名を検索条件として指定することはできません。値コードを指定してください。この例では、値コード90は、値名のマネージャを表わします。

次に、この行レベル セキュリティ制約および在庫テーブルを作成するとしましょう。

     CREATE CONSTRAINT classification_level SMALLINT, NOT NULL,
     VALUES (top_secret:4, secret:3, confidential:2, unclassified:1),
     INSERT  SYSLIB.InsertLevel,
     UPDATE SYSLIB.UpdateLevel,
     DELETE SYSLIB.DeleteLevel,
     SELECT SYSLIB.ReadLevel;

     CREATE CONSTRAINT classification_category BYTE(8)
     VALUES (nato:1, united_states:2, canada:3, united_kingdom:4,
             france:5, norway:6, russia:7),
     INSERT SYSLIB.insert_category,
     UPDATE SYSLIB.update_category,
     DELETE SYSLIB.delete_category,
     SELECT SYSLIB.read_category;

     CREATE TABLE inventory (
       column_1 INTEGER,
       column_2 INTEGER,
       column_3 VARCHAR(30),
       classification_level    CONSTRAINT,
       classification_category CONSTRAINT) 
     PRIMARY INDEX(column_1);

次に、ユーザーjoeがデータベース セッションにログオンします。joeの作成テキストは、次のようになります。

     CREATE USER joe AS
     PERMANENT=1e6,
     PASSWORD=Joe1234,
     CONSTRAINT = classfication_level (top_secret),
     CONSTRAINT = classification_category (united_states);

ユーザーjoeはclassification_levelおよびclassification_categoryの行レベル セキュリティ制約で定義されているため、このSELECT文をインベントリについて実行できます。

     SELECT *
     FROM inventory
     WHERE column_1 = 1212;

結果セットは以下のようになります。インベントリに対して明示的に定義された3つの列からのデータだけでなく、2つの行レベル セキュリティ列からのデータも返します。

column_1 column_2 column_3 classification_level classification_category
-------- -------- -------- -------------------- -----------------------
1212     90505    Widgets  3                    '4000000000000000'xb