SQL 概説

視点の作成

視点で説明したとおり、視点は、1 つまたは複数の表のデータを調べるための代替手段です。 視点を作成するなら、 さまざまなユーザーから見える情報をユーザーごとに制限することができます。 次の図に、視点と表の間の関係を示します。

図 2 において、 View_A は、Table_A のうち AC1 と AC2 の 2 つの列しかアクセスできないようにしたものです。

View_AB は、Table_A の AC3 と Table_B の BC2 にアクセスできるようにしたものです。

View_A を作成することによって、 TABLE_A へのユーザー・アクセスを制限できます。 また VIEW_AB を作成することによって、 アクセスを両方の表の特定の列だけに制限できます。

図 2. 表と視点の間の関係


REQTEXT

次のステートメントでは、STAFF 表のうち、部署 (DEPT) 20 の中で、 管理職 (Mgr) でない人のデータのうち、 基本表に含まれる給与 (SALARY) と歩合 (COMM) を除く残りのデータの視点を作成しています。

  
     CREATE VIEW STAFF_ONLY
        AS SELECT ID, NAME, DEPT, JOB, YEARS
              FROM STAFF
              WHERE JOB <> 'Mgr' AND DEPT=20

この視点を作成した後、 次のステートメントによって視点の内容を確認できます。

     SELECT *
        FROM STAFF_ONLY

このステートメントの結果は、次のとおりです。

      
ID     NAME      DEPT   JOB   YEARS 
------ --------- ------ ----- ------
    20 Pernal        20 Sales      8
    80 James         20 Clerk      -
   190 Sneider       20 Clerk      8

さらに例を挙げれば、 STAFF 表と ORG 表を使用することによって、 各部署の名前とそれぞれの部長の名前をリストアップした視点を作成できます。 その視点を作成するためのステートメントは、次のとおりです。

  
     CREATE VIEW DEPARTMENT_MGRS
        AS SELECT NAME, DEPTNAME
              FROM STAFF, ORG
              WHERE MANAGER = ID

視点作成時に WITH CHECK OPTION 文節を使うと、 その視点によって、 表の挿入や更新に対する付加的な制約を設けることができます。 その文節を使うと、データベース・マネージャーは、 その視点に対する更新または挿入の操作が視点の定義に違反していないかどうかを確認し、 もし違反しているならその操作を拒否します。 その文節を省略すると、挿入操作と更新操作が視点定義に違反していないかどうかの検査は実行されません。 WITH CHECK OPTION については、 SQL 解説書 の中の CREATE VIEW ステートメントの説明を参照してください。

視点を使用したデータ操作

SELECT ステートメントと同じように、 INSERT、DELETE、および UPDATE ステートメントは、 あたかも表に対するようにして視点に適用されます。 それらのステートメントは、 元となっている基本表のデータを操作することになります。 したがって、次に視点にアクセスすると、 最新の基本表を使った評価になります。 WITH CHECK OPTION 文節を使わない場合に視点を使ってデータを変更すると、 そのデータは元の視点定義に違反している可能性があるため、 その視点を繰り返してアクセスしても変更後のデータにはなりません。

視点 FIXED_INCOME に更新を適用する例を以下に示します。

     CREATE VIEW FIXED_INCOME (LNAME, DEPART, JOBTITLE, NEWSALARY)
        AS SELECT NAME, DEPT, JOB, SALARY
              FROM PERS
              WHERE JOB <> 'Sales' WITH CHECK OPTION

     UPDATE FIXED_INCOME
        SET NEWSALARY = SALARY * 1.10
        WHERE LNAME = 'Li'

この視点での更新操作は、基本表 PERS での次のような更新操作に相当します (チェック・オプションを除く)。

     UPDATE PERS
        SET SALARY = SALARY * 1.10
        WHERE NAME = 'Li'
          AND JOB <> 'Sales'

視点作成時に、CREATE VIEW FIXED_INCOME の中で JOB <> 'Sales' 制約に WITH CHECK OPTION を使っているため、 Limoges を営業 (Sales) に移すための次の更新操作は実行できません。

     UPDATE FIXED_INCOME
        SET JOBTITLE = 'Sales'
        WHERE LNAME = 'Limoges'

SALARY + COMM や SALARY * 1.25 などの式で定義されている列は更新できません。 視点の定義にそのような列が含まれているなら、 その所有者にはそれらの列に対する UPDATE 特権が与えられません。 そのような列を含む視点に対する INSERT ステートメントは実行できませんが、DELETE ステートメントは可能です。

PERS 表のどの列に対しても NOT NULL が定義されていないとしましょう。 その場合、基礎表 PERS の列のうち ID、YEARS、COMM、 または BIRTH_DATE は FIXED_INCOME に含まれていませんが、 それでも、FIXED_INCOME 視点を使って PERS 表に行を挿入できることになります。 視点では見えない列は、NULL または省略時値のいずれか該当するものに設定されます。

しかし、PERS 表の列 ID は、NOT NULL として定義されていません。 FIXED_INCOME 視点によって行を挿入しようとすると、 システムは、PERS の列のうちその視点では "見えない" すべての列に NULL 値を挿入しようとします。 ID 列は視点に含まれておらず、しかも NULL 値が禁止されているため、 その視点への挿入は許可されません。

視点の変更に関する規則と制限事項については、 SQL 解説書 の中の CREATE VIEW ステートメントの説明を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]