16.20 - AS - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ定義言語 構文規則および例

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-162K-JPN
Language
日本語 (日本)

このキーワードの後にビュー定義が続くことを指定します。

例: 列タイトルを持つビューの作成

次のリクエストは、departmentテーブルのビューを作成することを示します。ビュー内の各列は、標題と一緒に定義されています。そのため、ビュー データは、departmentテーブルに定義されたものとは異なる列の標題で表示されます。

    CREATE VIEW dept AS
     SELECT   deptno(TITLE 'Department Number'),
              deptname(TITLE 'Department Name'), 
              loc (TITLE 'Department Location'), 
              mgrno(TITLE 'Manager Number') 
     FROM department;

例: 更新、挿入、または削除リクエストでのビューの使用

次の例では、ビューが基礎としているテーブル セットのデータに、追加、変更、または削除を行なうUPDATE、INSERT、またはDELETEリクエストでのビュー名の使い方を示します。例えば、ビューでのデータの更新は、基礎となるテーブルのデータを変更します。ビューで行を挿入または削除すると、基礎となるテーブルで行が追加または削除されます。

次のstaff_infoビューについて検討します。このビューは、副社長と管理職者を除くすべての従業員の従業員番号、氏名、職種、部門番号、性別、および生年月日の情報に人事部の事務員がアクセスできるようにします。

    CREATE VIEW staff_info (number, name, position, department,                         sex, dob) AS
     SELECT employee.empno, name, jobtitle, deptno, sex, dob 
     FROM employee
     WHERE jobtitle NOT IN ('Vice Pres', 'Manager')
    WITH CHECK OPTION;

staff_infoの所有者にemployee表への挿入権限があり、職員にもstaff_infoへの挿入権限がある場合、その職員はこのビューを使用して新しい行をemployeeに追加することができます。例えば、次のINSERTリクエストを実行すると、employee表の中に、指定された情報を含む行が挿入されます。

    INSERT INTO staff_info (number, name, position, department, sex,
                dob) 
     VALUES (10024, 'Crowell N', 'Secretary', 200, 'F', 'Jun 03 1960');

次のWHERE句に示したstaff_infoに対する制約は、WITH CHECK OPTION句を含むこのビューを使用するすべての挿入に適用されます。

    ...
    WHERE jobtitle NOT IN ('Vice Pres', 'Manager') 
    ...

そのため、前に示したINSERTリクエストは、Crowellのために入力されたPositionがVice PresまたはManagerの場合には失敗となります。

このビューがWITH CHECK OPTIONなしで定義されていて、ユーザーがUPDATE権限を付与されている場合、そのユーザーはjobtitleをVice PresまたはManagerに更新できます。ユーザーは、変更された行にビューを介してアクセスすることはできません。

次のリクエストは、前のINSERTリクエストによってCrowellに入力された部門番号(200~300)を変更します。

    UPDATE staff_info 
     SET department = 300 
     WHERE number = 10024;

次のDELETEリクエストを実行すると、staff_info表から従業員Crowellの行が削除されます。

    DELETE FROM staff_info 
     WHERE number = 10024;

ビューは、ユーザーがテーブル データにアクセスできるようにする便利な方法です。ただし、前の例で示したように、あるビューに対する挿入、更新、および削除の権限を他のユーザーに与えることは、自分のデータへの何らかの管理を手放すことになります。このような権限の付与については、よく注意する必要があります。

デフォルトでは、ビュー定義に明示的にWITH CHECK OPTIONが含まれていない限り、更新または挿入される値は制約されません。

例: 動的UDT式を持つビューの作成

この例では、ビュー定義に動的UDTを指定する方法を示しています。

まず、次のリクエストは、列式がすべて指定されている長いバージョンを示しています。

     SELECT udf_aggregate_mp_struc(NEW VARIANT_TYPE(MultiType.w AS w,             MultiType.x AS x, 
            MultiType.y AS y, 
            NEW MP_STRUCTURED_INT(MultiType.w, MultiType.x, 
            MultiType.y) AS z)) AS m 
     FROM MultiType;
      *** Query completed. One row found. One column returned.
      *** Total elapsed time was 1 second.
               m
     -----------
              60

さらに、前のSELECTリクエストを組み込むビューを作成します。

     CREATE VIEW multitype_v AS
     SELECT udf_aggregate_mp_struc(NEW VARIANT_TYPE(MultiType.w AS w,             MultiType.x AS x, 
            MultiType.y AS y, 
            NEW MP_STRUCTURED_INT(MultiType.w, MultiType.x, 
            MultiType.y) AS z)) AS m FROM MultiType;

新しく作成したビューに対して、次のSELECTリクエストを実行すると、同じ結果が返されます。

     SELECT * 
     FROM multitype_v;
      *** Query completed. One row found. One column returned.
      *** Total elapsed time was 1 second.
               m
     -----------
              60

例: ビューの置換

employee_infoビュー内の部門nameの列を部門番号の列に変更するには、次のように入力します。

    REPLACE VIEW employee_info (number, name, position, department)
     AS SELECT employee.empno, name, jobtitle, deptno 
        FROM emp_info
        WHERE jobtitle NOT IN ('vice pres', 'manager');

ビューを置き換えるには、ビューまたはそれを含むデータベースまたはユーザーに対するDROP権限が必要です。

存在しないビューを指定したREPLACE VIEWリクエストを入力した場合、システムは、そのREPLACE文の指定に従ってビューを作成します。

例: 行レベル セキュリティ制約を持つテーブルのビューの作成

この例では、行レベル セキュリティ制約が定義されているテーブルのビューを作成する方法を示します。最初にemp_recordというテーブルを作成します。このテーブルで、ビューemp_record_viewが定義されます。

emp_record表の行レベル セキュリティ制約をgroup_membershipとして定義します。Teradata Databaseは、このemp_recordを作成するときに、group_membershipという名前の4番目のセキュリティ制約列を暗黙的に表に追加します。

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

次に、emp_recordのビューemp_record_viewを定義します。

     CREATE VIEW emp_record_view AS
       SELECT emp_number, salary, group_membership 
       FROM emp_record
       WHERE emp_name=user;