ALTER TABLE

ALTER TABLE ステートメントは表の定義を変更します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。

権限

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

  • ステートメントで識別される表に対して、
    • その表の ALTER 特権、および
    • 表が含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

外部キーを定義する場合、ステートメントの権限 ID が保持する特権には、親表に関して少なくとも次の 1 つが含まれていなければなりません。

  • 該当の表に対する REFERENCES 特権またはオブジェクト管理権限。
  • 指定された親キーの各列に対する REFERENCES 特権。
  • データベース管理者権限

フィールド・プロシージャーを定義する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

  • 次のシステム権限
    • プログラムに対する *EXECUTE システム権限、および
    • プログラムが含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

選択ステートメント を指定する場合は、ステートメントの権限 ID によって保持される 特権に、少なくとも次のいずれか 1 つがこれらの文節で指定された表またはビューにおいて含まれなければなりません。

  • 表またはビューに対する SELECT 特権
  • データベース管理者権限

特殊タイプを参照する場合は、ステートメントの権限 ID によって保持される 特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

  • ステートメント内で識別された、それぞれの特殊タイプごとに、
    • その特殊タイプに対する USAGE 特権、および
    • 特殊タイプが含まれるスキーマに対する USAGE 特権
  • データベース管理者権限
ACTIVATE または DEACTIVATE 節が指定される場合は、次のとおりです。
  • このステートメントの許可 ID には、セキュリティー管理者権限 がなければなりません。 管理権限を参照してください。

行の許可がアクティブ になっている表から DELETE ROWS でパーティションを削除するには、 このステートメントの権限 ID には次の 1 つ以上が含まれなければなりません。

  • 表についての *OBJOPR および *OBJEXIST システ ム権限。
  • データベース管理者権限

パーティションをアタッチするには、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つも含まれなければなりません。

  • ステートメントで識別されるソース表に対して、
    • SELECT 特権、および
    • *OBJEXIST システム権限、および
    • ソース表が含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

パーティションをデタッチするには、ステートメントの権限 ID によって保持される特権にも、少なくとも次のいずれか 1 つが含まれなければなりません。

  • ステートメントで識別されるソース表に対して、
    • SELECT、DELETE、ALTER 特権、および
    • ソース表が含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

パーティションをデタッチするには、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

表をシステム期間テンポラル表になるように変更する場合 (ADD VERSIONING 節を使用)、関連する履歴表にも変更が発生するような変更を 1 つ以上含む、システム期間テンポラル表への変更を行う場合、または、DROP VERSIONING を実行する場合、ステートメントの許可 ID の保持する特権に、以下の権限も少なくとも 1 つ含まれている必要があります。

  • 次のシステム権限
    • 履歴表の ALTER 特権、および
    • 履歴表が含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

SQL 特権に対応するシステム権限の説明については、『表またはビューへの権限を検査する際の対応するシステム権限』および『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。

構文

構文図を読む構文図をスキップする
>>-ALTER TABLE--table-name-------------------------------------->

     .-------------------------------------------------------------------------------------------------------------.     
     V          .-COLUMN-.                                                                                         |     
>--------+-ADD--+--------+--column-definition--+---------------------+-----------------------------------------+---+---><
         |                                     '-BEFORE--column-name-'                                         |         
         |        .-COLUMN-.                                                                                   |         
         +-ALTER--+--------+--column-alteration----------------------------------------------------------------+         
         |         .-COLUMN-.               .-CASCADE--.                                                       |         
         +-DROP----+--------+--column-name--+----------+-------------------------------------------------------+         
         |                                  '-RESTRICT-'                                                       |         
         +-ADD--+-unique-constraint------+---------------------------------------------------------------------+         
         |      +-referential-constraint-+                                                                     |         
         |      '-check-constraint-------'                                                                     |         
         |                                             .-CASCADE--.                                            |         
         +-DROP--+-PRIMARY KEY----------------------+--+----------+--------------------------------------------+         
         |       '-+-UNIQUE------+--constraint-name-'  '-RESTRICT-'                                            |         
         |         +-FOREIGN KEY-+                                                                             |         
         |         +-CHECK-------+                                                                             |         
         |         '-CONSTRAINT--'                                                                             |         
         +-ADD--partitioning-clause----------------------------------------------------------------------------+         
         +-DROP PARTITIONING-----------------------------------------------------------------------------------+         
         +-ADD PARTITION--add-partition------------------------------------------------------------------------+         
         +-ALTER PARTITION--partition-name--boundary-spec--+------------------+--+-------------------+---------+         
         |                                                 '-media-preference-'  '-memory-preference-'         |         
         +-DROP PARTITION--partition-name--+-DELETE ROWS---+---------------------------------------------------+         
         |                                 '-PRESERVE ROWS-'                                                   |         
         |                                    (1)                                                              |         
         +-ATTACH PARTITION--attach-partition------------------------------------------------------------------+         
         |                                                     (1)                                             |         
         +-DETACH PARTITION--partition-name--INTO--table-name1-------------------------------------------------+         
         |        .-MATERIALIZED-.                                                                             |         
         |      .-+--------------+--QUERY-.                                                                    |         
         +-ADD--+-------------------------+--materialized-query-definition-------------------------------------+         
         |        .-MATERIALIZED-.                                                                             |         
         +-ALTER--+--------------+--QUERY--materialized-query-table-alteration---------------------------------+         
         |       .-MATERIALIZED-.                                                                              |         
         +-DROP--+--------------+--QUERY-----------------------------------------------------------------------+         
         +-ACTIVATE--NOT LOGGED INITIALLY--+------------------+------------------------------------------------+         
         |                                 '-WITH EMPTY TABLE-'                                                |         
         |             .-FOR-.                                                                                 |         
         +-ADD PERIOD--+-----+--period-definition--------------------------------------------------------------+         
         +-DROP PERIOD--SYSTEM_TIME----------------------------------------------------------------------------+         
         |      .-SYSTEM-.                                                                                 (2) |         
         +-ADD--+--------+--VERSIONING--USE HISTORY TABLE--history-table-name--+-------------------------+-----+         
         |                                                                     '-ON DELETE ADD EXTRA ROW-'     |         
         |       .-SYSTEM-.             (2)                                                                    |         
         +-DROP--+--------+--VERSIONING------------------------------------------------------------------------+         
         |                                    (3)                                                              |         
         +-+-ACTIVATE---+--ROW ACCESS CONTROL------------------------------------------------------------------+         
         | '-DEACTIVATE-'                                                                                      |         
         |                                       (3)                                                           |         
         +-+-ACTIVATE---+--COLUMN ACCESS CONTROL---------------------------------------------------------------+         
         | '-DEACTIVATE-'                                                                                      |         
         |                   .-CARDINALITY-.                                                                   |         
         +-+-VOLATILE-----+--+-------------+-------------------------------------------------------------------+         
         | '-NOT VOLATILE-'                                                                                    |         
         +-ALTER--media-preference-----------------------------------------------------------------------------+         
         '-ALTER--memory-preference----------------------------------------------------------------------------'         

注:
  1. ATTACH PARTITION または DETACH PARTITION を、他の節と一緒に指定することはできません。
  2. ADD VERSIONING または DROP VERSIONING を、他の節と一緒に指定することはできません。
  3. ACTIVATE または DEACTIVATE 節が指定される 場合、ACTIVATE および DEACTIVATE 以外の節を ALTER TABLE ステートメントに指定することは許可されません。 各文節を複数回指定してはいけません。
構文図を読む構文図をスキップする
media-preference

   .-UNIT ANY-.   
|--+-UNIT SSD-+-------------------------------------------------|

memory-preference

|--KEEP IN MEMORY--+-NO--+--------------------------------------|
                   '-YES-'   

構文図を読む構文図をスキップする
column-definition

|--column-name--+-------------------------------------+--------->
                |      .-COLUMN-.                     |   
                '-FOR--+--------+--system-column-name-'   

             (1) (2)   
>--data-type---------------------------------------------------->

   .--------------------------------------------------------------.   
   V                                                              |   
>----+----------------------------------------------------------+-+--|
     +-default-clause-------------------------------------------+     
     +-generated-clause-----------------------------------------+     
     +-NOT NULL-------------------------------------------------+     
     | .-NOT HIDDEN--------.                                    |     
     +-+-------------------+------------------------------------+     
     | '-IMPLICITLY HIDDEN-'                                    |     
     +-column-constraint----------------------------------------+     
     +-FIELDPROC--external-program-name--+--------------------+-+     
     |                                   |    .-,--------.    | |     
     |                                   |    V          |    | |     
     |                                   '-(----constant-+--)-' |     
     |                  (3)                                     |     
     '-datalink-options-----------------------------------------'     

data-type

|--+-built-in-type------+---------------------------------------|
   '-distinct-type-name-'   

注:
  1. data-type は、行変更タイム・スタンプ列、行開始列、行終了列、およびトランザクション開始 ID 列のためのオプションです。
  2. 同じ文節を複数回指定することはできません。
  3. データ・リンク・オプション は、DATALINK、および DATALINK をソースとする特殊タイプに対してのみ指定することができます。
構文図を読む構文図をスキップする
built-in-type

|--+-+---SMALLINT---+----------------------------------------------------------------------------------------------------------+--|
   | +-+-INTEGER-+--+                                                                                                          |   
   | | '-INT-----'  |                                                                                                          |   
   | '---BIGINT-----'                                                                                                          |   
   |                  .-(5,0)------------------------.                                                                         |   
   +-+-+-DECIMAL-+-+--+------------------------------+-------------------------------------------------------------------------+   
   | | '-DEC-----' |  |             .-,0--------.    |                                                                         |   
   | '-+-NUMERIC-+-'  '-(--integer--+-----------+--)-'                                                                         |   
   |   '-NUM-----'                  '-, integer-'                                                                              |   
   |          .-(--53--)------.                                                                                                |   
   +-+-FLOAT--+---------------+-+----------------------------------------------------------------------------------------------+   
   | |        '-(--integer--)-' |                                                                                              |   
   | +-REAL---------------------+                                                                                              |   
   | |         .-PRECISION-.    |                                                                                              |   
   | '-DOUBLE--+-----------+----'                                                                                              |   
   |             .-(--34--)-.                                                                                                  |   
   +---DECFLOAT--+----------+--------------------------------------------------------------------------------------------------+   
   |             '-(--16--)-'                                                                                                  |   
   |                    .-(--1--)-------.                                                                                      |   
   +-+-+-+-CHARACTER-+--+---------------+-------------------------------+--+----------------+-----------------+----------------+   
   | | | '-CHAR------'  '-(--integer--)-'                               |  +-FOR BIT DATA---+                 |                |   
   | | '-+-+-CHARACTER-+--VARYING-+--(--integer--)--+-----------------+-'  +-FOR SBCS DATA--+                 |                |   
   | |   | '-CHAR------'          |                 '-allocate-clause-'    +-FOR MIXED DATA-+                 |                |   
   | |   '-VARCHAR----------------'                                        '-ccsid-clause---'                 |                |   
   | |                                      .-(--1M--)-------------.                                          |                |   
   | '---+-+-CHARACTER-+--LARGE OBJECT-+----+----------------------+--+-----------------+--+----------------+-'                |   
   |     | '-CHAR------'               |    '-(--integer--+---+--)-'  '-allocate-clause-'  +-FOR SBCS DATA--+                  |   
   |     '-CLOB------------------------'                  +-K-+                            +-FOR MIXED DATA-+                  |   
   |                                                      +-M-+                            '-ccsid-clause---'                  |   
   |                                                      '-G-'                                                                |   
   |                .-(--1--)-------.                                                                                          |   
   +-+---GRAPHIC----+---------------+----------------------------+--+--------------+-------------------------------------------+   
   | |              '-(--integer--)-'                            |  '-ccsid-clause-'                                           |   
   | +-+-GRAPHIC VARYING-+--(--integer--)--+-----------------+---+                                                             |   
   | | '-VARGRAPHIC------'                 '-allocate-clause-'   |                                                             |   
   | |             .-(--1M--)-------------.                      |                                                             |   
   | '---DBCLOB----+----------------------+--+-----------------+-'                                                             |   
   |               '-(--integer--+---+--)-'  '-allocate-clause-'                                                               |   
   |                             +-K-+                                                                                         |   
   |                             +-M-+                                                                                         |   
   |                             '-G-'                                                                                         |   
   |                             .-(--1--)-------.                                                                             |   
   +-+-+-+-NATIONAL CHARACTER-+--+---------------+-------------------------------+---------------------+--+------------------+-+   
   | | | +-NATIONAL CHAR------+  '-(--integer--)-'                               |                     |  '-normalize-clause-' |   
   | | | '-NCHAR--------------'                                                  |                     |                       |   
   | | '-+-+-NATIONAL CHARACTER-+--VARYING-+--(--integer--)--+-----------------+-'                     |                       |   
   | |   | +-NATIONAL CHAR------+          |                 '-allocate-clause-'                       |                       |   
   | |   | '-NCHAR--------------'          |                                                           |                       |   
   | |   '-NVARCHAR------------------------'                                                           |                       |   
   | |                                                   .-(--1M--)-------------.                      |                       |   
   | '-----+-+-NATIONAL CHARACTER-+--LARGE OBJECT-+------+----------------------+--+-----------------+-'                       |   
   |       | '-NCHAR--------------'               |      '-(--integer--+---+--)-'  '-allocate-clause-'                         |   
   |       '-NCLOB--------------------------------'                    +-K-+                                                   |   
   |                                                                   +-M-+                                                   |   
   |                                                                   '-G-'                                                   |   
   |             .-(--1--)-------.                                                                                             |   
   +-+-+-BINARY--+---------------+------------------------------+-----------------+--------------------------------------------+   
   | | |         '-(--integer--)-'                              |                 |                                            |   
   | | '-+-BINARY VARYING-+--(--integer--)--+-----------------+-'                 |                                            |   
   | |   '-VARBINARY------'                 '-allocate-clause-'                   |                                            |   
   | |                              .-(--1M--)-------------.                      |                                            |   
   | '---+-BINARY LARGE OBJECT-+----+----------------------+--+-----------------+-'                                            |   
   |     '-BLOB----------------'    '-(--integer--+---+--)-'  '-allocate-clause-'                                              |   
   |                                              +-K-+                                                                        |   
   |                                              +-M-+                                                                        |   
   |                                              '-G-'                                                                        |   
   +-+-DATE-------------------------+------------------------------------------------------------------------------------------+   
   | |       .-(--0--)-.            |                                                                                          |   
   | +-TIME--+---------+------------+                                                                                          |   
   | |            .-(--6--)-------. |                                                                                          |   
   | '-TIMESTAMP--+---------------+-'                                                                                          |   
   |              '-(--integer--)-'                                                                                            |   
   |             .-(--200--)-----.                                                                                             |   
   +---DATALINK--+---------------+--+-----------------+--+--------------+------------------------------------------------------+   
   |             '-(--integer--)-'  '-allocate-clause-'  '-ccsid-clause-'                                                      |   
   +---ROWID-------------------------------------------------------------------------------------------------------------------+   
   '---XML--+-----------------+--+--------------+------------------------------------------------------------------------------'   
            '-allocate-clause-'  '-ccsid-clause-'                                                                                  

構文図を読む構文図をスキップする
allocate-clause

|--ALLOCATE--(integer)------------------------------------------|

ccsid-clause

|--CCSID--integer--+------------------+-------------------------|
                   '-normalize-clause-'   

normalize-clause

   .-NOT NORMALIZED-.   
|--+-NORMALIZED-----+-------------------------------------------|

default-clause

   .-WITH-.                                                                                    
|--+------+--DEFAULT--+--------------------------------------------------------------------+--|
                      +-constant-----------------------------------------------------------+   
                      +-USER---------------------------------------------------------------+   
                      +-NULL---------------------------------------------------------------+   
                      +-CURRENT_DATE-------------------------------------------------------+   
                      +-CURRENT_TIME-------------------------------------------------------+   
                      |                    .-(--6--)-------.                               |   
                      +-CURRENT_TIMESTAMP--+---------------+-------------------------------+   
                      |                    '-(--integer--)-'                               |   
                      '-cast-function-name--(--+-constant-----------------------------+--)-'   
                                               +-USER---------------------------------+        
                                               +-CURRENT_DATE-------------------------+        
                                               +-CURRENT_TIME-------------------------+        
                                               |                    .-(--6--)-------. |        
                                               '-CURRENT_TIMESTAMP--+---------------+-'        
                                                                    '-(--integer--)-'          

generated-clause

     .-GENERATED ALWAYS-----. (1)                                         
|--+-+----------------------+------+--------------------------------+-+--|
   | '-GENERATED BY DEFAULT-'      +-identity-options---------------+ |   
   |                               '-as-row-change-timestamp-clause-' |   
   |            .-ALWAYS-.                                            |   
   '-GENERATED--+--------+--+-as-row-transaction-timestamp-clause-+---'   
                            +-as-row-transaction-start-id-clause--+       
                            '-as-generated-expression-clause------'       

注:
  1. GENERATED を指定できるのは、列のデータ・タイプが ROWID (また は ROWID データ・タイプに基づく特殊タイプ) であるか、列が ID 列であるか、または列が行変更タイム・スタンプである場合のみです。
構文図を読む構文図をスキップする
identity-options

|--AS IDENTITY--+------------------------------------------------------+--|
                |    .--------------------------------------------.    |   
                |    V               .-1----------------.     (1) |    |   
                '-(----+-START WITH--+-numeric-constant-+---+-----+--)-'   
                       |               .-1----------------. |              
                       +-INCREMENT BY--+-numeric-constant-+-+              
                       | .-NO MINVALUE----------------.     |              
                       +-+-MINVALUE--numeric-constant-+-----+              
                       | .-NO MAXVALUE----------------.     |              
                       +-+-MAXVALUE--numeric-constant-+-----+              
                       | .-NO CYCLE-.                       |              
                       +-+-CYCLE----+-----------------------+              
                       | .-CACHE--20------.                 |              
                       +-+-NO CACHE-------+-----------------+              
                       | '-CACHE--integer-'                 |              
                       | .-NO ORDER-.                       |              
                       '-+-ORDER----+-----------------------'              

as-row-change-timestamp-clause

|--FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP---------------|

as-row-transaction-timestamp-clause

|--AS ROW--+-+-BEGIN-+-+----------------------------------------|
           | '-START-' |   
           '-END-------'   

as-row-transaction-start-id-clause

|--AS TRANSACTION START ID--------------------------------------|

as-generated-expression-clause

|--AS--(--non-deterministic-expression--)-----------------------|

non-deterministic-expression

|--+-DATA CHANGE OPERATION----+---------------------------------|
   +-special-register---------+   
   '-built-in-global-variable-'   

注:
  1. 同じ文節を複数回指定することはできません。
構文図を読む構文図をスキップする
special-register

|--+-CURRENT CLIENT_ACCTNG-----+--------------------------------|
   +-CURRENT CLIENT_APPLNAME---+   
   +-CURRENT CLIENT_PROGRAMID--+   
   +-CURRENT CLIENT_USERID-----+   
   +-CURRENT CLIENT_WRKSTNNAME-+   
   +-CURRENT SERVER------------+   
   '-+-SESSION_USER-+----------'   
     '-USER---------'              

built-in-global-variable

|--+-QSYS2.JOB_NAME---------------+-----------------------------|
   +-QSYS2.SERVER_MODE_JOB_NAME---+   
   +-SYSIBM.CLIENT_HOST-----------+   
   +-SYSIBM.CLIENT_IPADDR---------+   
   +-SYSIBM.CLIENT_PORT-----------+   
   +-SYSIBM.PACKAGE_NAME----------+   
   +-SYSIBM.PACKAGE_SCHEMA--------+   
   +-SYSIBM.PACKAGE_VERSION-------+   
   +-SYSIBM.ROUTINE_SCHEMA--------+   
   +-SYSIBM.ROUTINE_SPECIFIC_NAME-+   
   '-SYSIBM.ROUTINE_TYPE----------'   

構文図を読む構文図をスキップする
column-constraint

|--+-----------------------------+--+-+-PRIMARY KEY-+--------------+--|
   '-CONSTRAINT--constraint-name-'  | '-UNIQUE------'              |   
                                    +-references-clause------------+   
                                    '-CHECK--(--check-condition--)-'   

datalink-options

   .-LINKTYPE URL-.  .-NO LINK CONTROL--------------------------.   
|--+--------------+--+------------------------------------------+--|
                     '-FILE LINK CONTROL--+-file-link-options-+-'   
                                          '-MODE DB2OPTIONS---'     

file-link-options

   .--------------------------------------.   
   V                                  (1) |   
|----+-INTEGRITY ALL----------------+-----+---------------------|
     +-+-READ PERMISSION FS-+-------+         
     | '-READ PERMISSION DB-'       |         
     +-+-WRITE PERMISSION FS------+-+         
     | '-WRITE PERMISSION BLOCKED-' |         
     +-RECOVERY NO------------------+         
     '-+-ON UNLINK RESTORE-+--------'         
       '-ON UNLINK DELETE--'                  

注:
  1. 5 つの file-link-options をすべて指定する必要がありますが、指定する順序は任意です。
構文図を読む構文図をスキップする
column-alteration

                .---------------------------------------------------------------------------------------------------------.   
                |                                  .------------------------------------------------------------------.   |   
                V                                  V                                                              (1) |   |   
|--column-name----+-SET--+----------------------+----+-default-clause-------------------------------------------+-----+-+-+--|
                  |      '-DATA TYPE--data-type-'    +-generated-alteration-------------------------------------+       |     
                  |                                  +-NOT NULL-------------------------------------------------+       |     
                  |                                  | .-NOT HIDDEN--------.                                    |       |     
                  |                                  +-+-------------------+------------------------------------+       |     
                  |                                  | '-IMPLICITLY HIDDEN-'                                    |       |     
                  |                                  '-FIELDPROC--external-program-name--+--------------------+-'       |     
                  |                                                                      |    .-,--------.    |         |     
                  |                                                                      |    V          |    |         |     
                  |                                                                      '-(----constant-+--)-'         |     
                  |       .------------------------------.                                                              |     
                  |       V                          (1) |                                                              |     
                  +-DROP----+-DEFAULT--------------+-----+--------------------------------------------------------------+     
                  |         +-NOT NULL-------------+                                                                    |     
                  |         +-GENERATED------------+                                                                    |     
                  |         +-IDENTITY-------------+                                                                    |     
                  |         +-ROW CHANGE TIMESTAMP-+                                                                    |     
                  |         '-FIELDPROC------------'                                                                    |     
                  '-identity-alteration---------------------------------------------------------------------------------'     

generated-alteration

     .-GENERATED ALWAYS-----. (2)                                       
|--+-+----------------------+------+------------------+-------------+--|
   | '-GENERATED BY DEFAULT-'      '-identity-options-'             |   
   |            .-ALWAYS-.                                          |   
   '-GENERATED--+--------+--+-as-row-transaction-timestamp-clause-+-'   
                            '-as-row-transaction-start-id-clause--'     

identity-alteration

   .---------------------------------------------.       
   V                                             | (1)   
|----+-SET--+-INCREMENT BY--numeric-constant-+-+-+--------------|
     |      +-+-NO MINVALUE----------------+-+ |         
     |      | '-MINVALUE--numeric-constant-' | |         
     |      +-+-NO MAXVALUE----------------+-+ |         
     |      | '-MAXVALUE--numeric-constant-' | |         
     |      +-+-NO CYCLE-+-------------------+ |         
     |      | '-CYCLE----'                   | |         
     |      +-+-NO CACHE-------+-------------+ |         
     |      | '-CACHE--integer-'             | |         
     |      '-+-NO ORDER-+-------------------' |         
     |        '-ORDER----'                     |         
     '-RESTART--+------------------------+-----'         
                '-WITH--numeric-constant-'               

注:
  1. 同じ文節を複数回指定することはできません。
  2. GENERATED は次の場合にのみ指定できます。すなわち、列のデータ・タイプが ROWID (または ROWID データ・タイプに基づく特殊タイプ) である場合、列が ID 列である場合、identity-options が指定された場合、as-row-transaction-timestamp-clause が指定された場合、as-row-transaction-start-id-clause が指定された場合、または、列が行変更タイム・スタンプである場合です。
構文図を読む構文図をスキップする
unique-constraint

|--+-----------------------------+--+-PRIMARY KEY-+--(---------->
   '-CONSTRAINT--constraint-name-'  '-UNIQUE------'      

   .-,-----------.      
   V             |      
>----column-name-+--)-------------------------------------------|

referential-constraint

|--+-----------------------------+--FOREIGN KEY----------------->
   '-CONSTRAINT--constraint-name-'                

      .-,-----------.                         
      V             |                         
>--(----column-name-+--)--references-clause---------------------|

references-clause

|--REFERENCES--table-name--+-----------------------+------------>
                           |    .-,-----------.    |   
                           |    V             |    |   
                           '-(----column-name-+--)-'   

   .-ON DELETE NO ACTION--------.  .-ON UPDATE NO ACTION-. (1)   
>--+----------------------------+--+---------------------+------|
   '-ON DELETE--+-RESTRICT----+-'  '-ON UPDATE RESTRICT--'       
                +-CASCADE-----+                                  
                +-SET NULL----+                                  
                '-SET DEFAULT-'                                  

check-constraint

|--+-----------------------------+------------------------------>
   '-CONSTRAINT--constraint-name-'   

                                 .--------------------------------------------------------.       
                                 V                                                        | (2)   
>--CHECK--(--check-condition--)----+----------------------------------------------------+-+------|
                                   +-ON INSERT VIOLATION SET--column-name-- = --DEFAULT-+         
                                   '-ON UPDATE VIOLATION PRESERVE--column-name----------'         

period-definition

|--SYSTEM_TIME--(--begin-column-name--,--end-column-name--)-----|

注:
  1. ON DELETE と ON UPDATE 文節は、どの順序で指定しても構いません。
  2. 同じ文節を複数回指定することはできません。
構文図を読む構文図をスキップする
partitioning-clause

                   .-RANGE-.                           
|--PARTITION BY--+-+-------+--range-partition-spec-+------------|
                 '-HASH--hash-partition-spec-------'   

range-partition-spec

      .-,--------------------.        .-,-----------------.      
      V                      |        V                   |      
|--(----partition-expression-+--)--(----partition-element-+--)--|

partition-expression

                .-NULLS LAST--.   
|--column-name--+-------------+---------------------------------|
                '-NULLS FIRST-'   

partition-element

|--+-+---------------------------+--boundary-spec--+------------------+--+-------------------+-+--|
   | '-PARTITION--partition-name-'                 '-media-preference-'  '-memory-preference-' |   
   |                                                            (1)                            |   
   '-boundary-spec--EVERY--(--integer-constant--+--------+--)----------------------------------'   
                                                +-DAY----+                                         
                                                +-DAYS---+                                         
                                                +-MONTH--+                                         
                                                +-MONTHS-+                                         
                                                +-YEAR---+                                         
                                                '-YEARS--'                                         

boundary-spec

|--+-----------------+--+---------------+-----------------------|
   '-starting-clause-'  '-ending-clause-'   

starting-clause

                            .-,------------.                       
             .-FROM-.       V              |       .-INCLUSIVE-.   
|--STARTING--+------+--+-(----+-constant-+-+--)-+--+-----------+--|
                       |      +-MINVALUE-+      |  '-EXCLUSIVE-'   
                       |      '-MAXVALUE-'      |                  
                       '-+-constant-+-----------'                  
                         +-MINVALUE-+                              
                         '-MAXVALUE-'                              

注:
  1. partition-element のこの構文が有効なのは、数値データ・タイプまたは日時データ・タイプの partition-expression が 1 つだけ存在する場合です。
構文図を読む構文図をスキップする
ending-clause

                        .-,------------.                       
           .-AT-.       V              |       .-INCLUSIVE-.   
|--ENDING--+----+--+-(----+-constant-+-+--)-+--+-----------+----|
                   |      +-MINVALUE-+      |  '-EXCLUSIVE-'   
                   |      '-MAXVALUE-'      |                  
                   '-+-constant-+-----------'                  
                     +-MINVALUE-+                              
                     '-MAXVALUE-'                              

hash-partition-spec

      .-,-----------.                                 
      V             |                                 
|--(----column-name-+--)--INTO--integer--PARTITIONS-------------|

add-partition

|--+-+----------------+--boundary-spec--+------------------+--+-------------------+-+--|
   | '-partition-name-'                 '-media-preference-'  '-memory-preference-' |   
   '-integer--+-HASH PARTITIONS-+---------------------------------------------------'   
              '-HASH PARTITION--'                                                       

attach-partition

|--+----------------+--+---------------+--FROM--table-name1-----|
   '-partition-name-'  '-boundary-spec-'                      

materialized-query-definition

|--(--select-statement--)--refreshable-table-options------------|

refreshable-table-options

                                                   .------------------------------------.       
                                                   V                                    | (1)   
|--+-DATA INITIALLY DEFERRED--+--REFRESH DEFERRED----+-MAINTAINED BY USER-------------+-+------|
   '-DATA INITIALLY IMMEDIATE-'                      '-+-ENABLE QUERY OPTIMIZATION--+-'         
                                                       '-DISABLE QUERY OPTIMIZATION-'           

注:
  1. 同じ文節を複数回指定することはできません。MAINTAINED BY USER を指定しなければなりません。
構文図を読む構文図をスキップする
materialized-query-table-alteration

|--+-(--select-statement--)--+---------------------------+-+----|
   |                         '-refreshable-table-options-' |   
   |      .------------------------------------.           |   
   |      V                                    | (1)       |   
   '-SET----+-REFRESH DEFERRED---------------+-+-----------'   
            +-MAINTAINED BY USER-------------+                 
            '-+-ENABLE QUERY OPTIMIZATION--+-'                 
              '-DISABLE QUERY OPTIMIZATION-'                   

注:
  1. 同じ文節を複数回指定することはできません。

説明

table-name
変更する表を指定します。table-name は、 現行サーバーに存在する表を識別していなければなりません。この表は、ビュー、カタログ表、または宣言済み一時表であってはなりません。表名 がマテリアライズ照会表または履歴表を識別する場合、ADD 列定義、ALTER 列変更、または DROP COLUMN は使用できません。table-name がマテリアライズ照会表またはテンポラル表を識別する場合、 ATTACH PARTITION および DETACH PARTITION は使用できません。

ADD COLUMN column-definition

表に列を追加します。この表は履歴表にすることはできません。 表に行がある場合は、列の値はすべて、そのデフォルト値に設定されます。ただし、列が ROWID 列、または 生成列である場合を除きます。ROWID 列および生成列のデフォルト値は、データベース・マネージャーが生成します。 表に既に n 個の列がある場合、新規の列の順番 は n+1 になります。n+1 の 値は 8000 以下でなければなりません。

1 つの表には、1 つの ROWID と生成列の各タイプの 1 つのみを含められます。

FILE LINK CONTROL を指定した DataLink 列は、CASCADE の削除規則を伴う参照制約で従属表である表や、システム期間テンポラル表には追加できません。 ROWID 列は、システム期間テンポラル表に追加できません。

新しい列を追加した結果、すべての列の行バッファー・バイト・カウントの合計が、32766 (VARCHAR 列、VARBINARY 列または VARGRAPHIC 列を指定する場合は 32740) を超えてしまう場合は、列の追加はできません。さらに、LOB 列または XML 列を指定してある場合は、挿入または更新の時点で、すべての列のバイト・カウントの合計が 3 758 096 383 を超えていてはなりません。データ・タイプごとの列のバイト・カウントについて は、最大行サイズを参照してください。

表がシステム期間テンポラル表である場合、関連する履歴表にも列が追加されます。履歴表に追加された列については以下の属性がコピーされます。
  • 列名およびシステム列名
  • データ・タイプ
  • 長さ、精度、および位取り
  • FOR BIT DATA、FOR SBCS DATA、FOR MIXED DATA 属性
  • CCSID
  • 割り振り属性
  • NULL 属性
  • 非表示属性
  • フィールド手順
column-name
表に追加する列の名前を指定します。表の複数の列や、表のシステム列名 に同じ名前を使用してはなりません。SYSTEM_TIME という名前の列は、 期間を持つ表に追加できません。列名 は修飾しません。
FOR COLUMN system-column-name
列の IBM® i 名を指定します。表の複数の列名 またはシステム列名 に、同じ名前を使用してはなりません。

システム列名 が指定されず、また列名 が有効なシステム列名 でない場合には、システム列名が生成されます。 システム列名の生成方法に関する詳細については、列名の生成の規則を参照してください。

data-type
列のデータ・タイプを指定します。このデータ・タイプは、組み込みデータ・タイプまたは特殊タイプにすることができます。
built-in-type
組み込みデータ・タイプを指定します。 組み込みタイプの説明については、CREATE TABLEを参照してください。
distinct-type-name
列のデータ・タイプが特殊タイプになるよう指定します。この列の長さ、精度、および位取りは、それぞれ、特殊タイプのソース となっているタイプの長さ、精度、および位取りと同じになります。 スキーマ名なしの特殊タイプを指定すると、その特殊 タイプ名は、SQL パス上のスキーマを検索することで解決されます。
DEFAULT
列のデフォルト値を指定します。この文節は、同じ列定義 で複数回指定することはできません。次のタイプの列に対しては、システムがデフォルト値を生成するため、DEFAULT を指定できません。
  • ROWID 列
  • ID 列
  • 行変更タイム・スタンプ列
  • 行開始列
  • 行終了列
  • トランザクション開始 ID 列
  • 生成式列
XML 列のデフォルトは、NULL です。ただし、NOT NULL を指定した場合、デフォルトはありません。
DEFAULT キーワードの後に値が指定されていないか、DEFAULT 節が指定されていない場合、次のようになります。
  • 列が生成列である場合、デフォルトは生成列のタイプによって決まります。 これらの値については、GENERATED のキーワードを参照してください。
  • 列が NULL 可能の場合、デフォルト値は NULL 値になります。
  • 列が NULL 可能でない場合、デフォルト値は列のデータ・タイプによって決まります。
    データ・タイプ デフォルト値
    数値 0
    固定長文字またはグラフィック・ストリング ブランク
    固定長バイナリー・ストリング 16 進ゼロ
    可変長ストリング 0 のストリング長
    日付 既存の行の場合、0001 年 1 月 1 日に対応する日付。 追加した行の場合は、現在の日付。
    時刻 既存の行の場合は、0 時、0 分、0 秒に対応する時刻。追加した行の場合は、現在の時刻。
    タイム・スタンプ 既存の行の場合は、0001 年 1 月 1 日に対応する日付、および 0 時 0 分 0 秒 0 小数秒に対応する時刻。 追加した行の場合は、現在のタイム・スタンプ。
    データ・リンク DLVALUE('','URL','') に対応する値
    特殊タイプ 特殊タイプの対応するソース・タイプのデフォルト値
NOT NULL および DEFAULT を列の定義 から省いた場合、DEFAULT NULL の暗黙の指定が取られます。
constant
その列のデフォルト値としての定数を指定します。これは、割り当ておよび比較で説明している割り当て規則に従って、その列に割り当てることができる値を表す定数にする必要があります。 浮動小数点定数または 10 進浮動小数点定数は、SMALLINT、INTEGER、BIGINT、 DECIMAL、または NUMERIC 列に使用してはなりません。10 進定数には、小数点より右方に、その列に指定された位取りより多くの桁を含めてはなりません。
USER
INSERT または UPDATE の時点での USER 特殊レジスターの値をその列 のデフォルト値として指定します。 列のデータ・タイプは、USER 特殊レジスターの長さ属性と同じかそれより 大きい長さ属性を持つ CHAR または VARCHAR でなければなりません。 既存の行の場合、値は ALTER TABLE ステートメントの処理時の USER 特殊レジスターの値になります。
NULL
その列のデフォルト値として NULL を指定します。 NOT NULL を指定する場合は、同じ列の定義 内で DEFAULT NULL を指定してはなりません。
CURRENT_DATE
現在の日付を列のデフォルト値として指定します。 CURRENT_DATE を指定する場合は、列のデータ・タイプは DATE または DATE に基づく特殊タイプでなければなりません。
CURRENT_TIME
現在の時刻を列のデフォルト値として指定します。 CURRENT_TIME を指定する場合は、列のデータ・タイプは TIME または TIME に基づく特殊タイプでなければなりません。
CURRENT_TIMESTAMP または CURRENT_TIMESTAMP(integer)
現在のタイム・スタンプを列のデフォルト値として指定します。 CURRENT_TIMESTAMP を指定する場合は、列のデータ・タイプは TIMESTAMP また は TIMESTAMP に基づく特殊タイプでなければなりません。デフォルトとして使用される CURRENT_TIMESTAMP 特殊レジスター のタイム・スタンプ精度は、この特殊レジスターに指定された精度に関係なく、常に列のタイム・スタンプ精度と 一致します。
cast-function-name
この形式のデフォルト値は、特殊タイプやデータ・タイプ、BINARY、 VARBINARY、BLOB、CLOB、DBCLOB、DATE、TIME、または TIMESTAMP として定義された列でのみ使用することができます。 次の表は、これらのキャスト関数 の許可されている使用法を示します。
データ・タイプ キャスト関数名
BINARY、VARBINARY、BLOB、CLOB、または DBCLOB に基づく特殊タイプ N BINARY、VARBINARY、BLOB、CLOB、または DBCLOB *
DATE、TIME、または TIMESTAMP に基づく特殊タイプ N N (N の作成時に生成されたユーザー定義のキャスト関数) **
あるいは
DATE、TIME、または TIMESTAMP *
他のデータ・タイプに基づく特殊タイプ N (N の作成時に生成されたユーザー定義のキャスト関数) **
BINARY、VARBINARY、BLOB、CLOB、または DBCLOB BINARY、VARBINARY、BLOB、CLOB、または DBCLOB *
DATE、TIME、または TIMESTAMP DATE、TIME、または TIMESTAMP *
注 :

* 関数には、QSYS2 の暗黙的または明示的スキーマ名のデータ・タイプ (または、特殊タイプのソース・タイプ) の名前と一致する名前を指定する必要があります。

** 関数には、列の特殊タイプの名前と一致する名前を指定する必要があります。 スキーマ名で修飾する場合は、特殊タイプのスキーマ名と同じ名前 を指定する必要があります。修飾しない場合は、関数の解析から得られるス キーマ名は、特殊タイプのスキーマ名と同じ名前にする必要があります。

constant
定数を引数として指定します。この定数は、特殊タイプのソース・タイプの定数、あるいは、特殊タイプでない場合は、データ・タイプの定数の規則に準拠する必要があります。BINARY、VARBINARY、 BLOB、 CLOB、DBCLOB、DATE、TIME、および TIMESTAMP 関数の場合は、この定数をストリング定数にする必要があります。
USER
INSERT または UPDATE の時点での USER 特殊レジスターの値をその列 のデフォルト値として指定します。 列の特殊タイプのソース・タイプのデータ・タイプは、USER の長さ属性 と同じかそれより大きい長さ属性を持つ CHAR または VARCHAR でなければなりません。 既存の行の場合、値は ALTER TABLE ステートメントの処理時の USER 特殊レジスターの値になります。
CURRENT_DATE
現在の日付を列のデフォルト値として指定します。 CURRENT_DATE を指定する場合、列の特殊タイプのソース・タイプのデータ・タイプは、DATE にする必要があります。
CURRENT_TIME
現在の時刻を列のデフォルト値として指定します。 CURRENT_TIME を指定する場合、列の特殊タイプのソース・タイプのデータ・タイプは、TIME にする必要があります。
CURRENT_TIMESTAMP または CURRENT_TIMESTAMP(integer)
現在のタイム・スタンプを列のデフォルト値として指定します。 CURRENT_TIMESTAMP を指定する場合、列の特殊タイプのソース・タイプのデータ・タイプは、TIMESTAMP にする必要があります。デフォルトとして使用される CURRENT_TIMESTAMP 特殊レジスター のタイム・スタンプ精度は、この特殊レジスターに指定された精度に関係なく、常に列のタイム・スタンプ精度と 一致します。

指定した値が無効である場合、エラーが戻されます。

GENERATED
データベース・マネージャーが列の値を生成することを示します。その列が ID 列 (AS IDENTITY 文節で定義されたもの)、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、または生成式列であると見なされる場合、GENERATED を指定できます。 また、列のデータ・タイプが ROWID (または ROWID に基づく特殊タイプ) である場合も、GENERATED を指定できます。 その他の場合は、GENERATED を指定してはなりません。ID 列、ROWID 列、または行変更タイム・スタンプ列をシステム期間テンポラル表に追加することはできません。
列が NULL 可能な場合、既存の行にある列の値として NULL 値が割り当てられます。 それ以外の場合は、既存の行にある列の値は、以下のように生成列のタイプによって決まります。
  • IDENTITY では、各行の識別値を生成します。
  • ROW CHANGE TIMESTAMP では、ALTER TABLE ステートメントのタイム・スタンプに対応する値を使用
  • ROW BEGIN では、0001 年 1 月 1 日に対応する日付と、0 時 0 分 0 秒 0 小数秒に対応する時刻を使用
  • ROW END では、9999 年 12 月 30 日に対応する日付と、0 時 0 分 0 秒 0 小数秒に対応する時刻を使用
  • TRANSACTION START ID では、0001 年 1 月 1 日に対応する日付と、0 時 0 分 0 秒 0 小数秒に対応する時刻を使用
  • 生成式は、数値列の場合は 0、可変長文字ストリング列の場合は長さ 0 のストリング、固定長文字ストリング列の場合はブランクを使用します。
ALWAYS
行の挿入時または更新時にデフォルト値を生成しなければならない場合に、データベース・マネージャーが常に列の値を生成することを指定します。ALWAYS は推奨値です。
BY DEFAULT
行の挿入時または更新時にデフォルト値を生成しなければならない場合に、明示的な値が指定されていない限り、データベース・マネージャーが列の値を生成することを指定します。

ROWID 列の場合は、データベース・マネージャーは指定された値を使用しますが、その値は、既にデータベース・マネージャーか Db2® for i によって生成されている有効な固有の行 ID の値でなければなりません。

ID 列または行変更タイム・スタンプ列の場合は、データベース・マネージャーは指定された値を挿入または更新しますが、その ID 列または行変更タイム・スタンプ列がユニーク制約を持っているか、その ID 列または行変更タイム・スタンプ列を単独で指定するユニーク索引を持っている場合を除き、その値がその列の固有な値であるかどうかの検査は行いません。

AS IDENTITY
列が表の識別列であることを指定します。 1 つの表は識別列を 1 つだけ持つことができます。 識別列は、分散表内で使用することはできません。AS IDENTITY を指定できるのは、列のデータ・タイプが、厳密に位取りがゼロの数値タイプ (SMALLINT、 INTEGER、BIGINT、DECIMAL、または位取りがゼロの NUMERIC、 またはこれらのデータ・タイプに基づく特殊タイプ) である場合だけです。 DECIMAL または NUMERIC データ・タイプが指定された場合、精度は 31 以下でなければなりません。

識別列は、暗黙的に NOT NULL になります。 識別属性の説明については、CREATE TABLE内の AS IDENTITY 文節を参照してください。

FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
列がタイム・スタンプであり、値はデータベース・マネージャーによって生成されることを指定します。 データベース・マネージャーは、行が挿入されるたびに各行の列に値を生成し、また列が更新されるたびに各行に値を生成します。 行変更タイム・スタンプ列に生成される値は、その行の挿入または更新の時刻に対応するタイム・スタンプです。 1 つの SQL ステートメントを指定して複数の行が挿入される場合、行変更タイム・スタンプ列の値は、各行が挿入された時点を反映するために行ごとに異なる可能性があります。 生成された値が固有である保証はありません。
表には、行変更タイム・スタンプ列を 1 つだけ指定できます。データ・タイプ を指定 する場合は、精度 6 の TIMESTAMP であるか、または、精度 6 の TIMESTAMP に 基づく特殊タイプでなければなりません。行変更タイム・スタンプ列の場合、DEFAULT 節を指定することはできず、NOT NULL でなければなりません。
AS ROW BEGIN
列がタイム・スタンプ・データを含み、値がデータベース・マネージャーによって生成されることを指定します。データベース・マネージャーは、行が挿入されるたびに各行の列に値を生成し、また列が更新されるたびに各行に値を生成します。生成される値は、最新のトランザクションに関連付けられている開始時刻に対応するタイム・スタンプです。単一 SQL ステートメントで複数の行が挿入される場合、トランザクション開始タイム・スタンプ列の値は各行で同じになります。
システム期間テンポラル表の場合、行開始列の値は、トランザクション全体にわたり固有になるようにデータベース・マネージャーによって生成されます。 関連した履歴表に挿入される行の終了タイム・スタンプ値が開始タイム・スタンプ値より大きくなるように、タイム・スタンプ値が調整される可能性があります。 これは、競合するトランザクションがシステム期間テンポラル表の同じ行を更新しているときに行われる場合があります。 このタイム・スタンプ値の調整を行うには、SYSTIME_PERIOD_ADJ QAQQINI オプションを *ADJUST に設定する必要があります。 単一の SQL トランザクション内で複数の行が挿入または更新され、調整が必要ではない場合、行開始列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
行開始列は、システム期間テンポラル表で使用するためのもので、SYSTEM_TIME 期間の最初の列として必要です。 1 つの表は 1 つの行開始列しか持てません。data-type が指定されない場合、 列は TIMESTAMP(12) として定義されます。data-type を指定する場合は、TIMESTAMP(12) でなければなりません。この列には DEFAULT 節を指定できないため、NOT NULL として定義する必要があります。行開始列は更新できません。
既存の行の場合、列の値は、0001 年 1 月 1 日に対応する日付、および 0 時 0 分 0 秒 0 小数秒に対応する時刻に設定されます。
AS ROW END
これを指定すると、行が挿入されるとき、または行内のいずれかの列が更新されるときには常に、データベース・マネージャーによって列のデータ・タイプの値が割り当てられます。 割り当てられる値は TIMESTAMP ’9999-12-30-00.00.00.000000000000’です。システム期間テンポラル表では、行が削除されると、履歴行の行終了列の値に、行がいつ削除されたかが反映されます。 単一の SQL ステートメントで複数の行が削除される場合、履歴行の列の値は同じになります。
行終了列は、システム期間テンポラル表で使用するためのもので、SYSTEM_TIME 期間の 2 番目の列として必要です。 表には 1 つの行終了列のみを含めることができます。data-type が指定されない場合、 列は TIMESTAMP(12) として定義されます。data-type を指定する場合は、TIMESTAMP(12) でなければなりません。この列には DEFAULT 節を指定できないため、NOT NULL として定義する必要があります。行終了列は更新できません。
既存の行の場合、列の値は、9999 年 12 月 30 日に対応する日付、および 0 時 0 分 0 秒 0 小数秒に対応する時刻に設定されます。
AS TRANSACTION START ID
これを指定すると、行が表に挿入されるとき、または行のいずれかの列が更新されるときには常に、データベース・マネージャーによって値が割り当てられます。 データベース・マネージャーは、トランザクションごとに固有のタイム・スタンプ値、または NULL 値を割り当てます。 トランザクション開始 ID 列が NULL 可能で、値を調整する必要がない行開始列が表にある場合には、その列に NULL 値が割り当てられます。 それ以外の場合は、値が生成されます。単一の SQL トランザクション内で複数の行が挿入または更新される場合、トランザクション開始 ID 列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
トランザクション開始 ID 列は、システム期間テンポラル表で使用するためのもので、システム期間テンポラル表に必要です。 1 つの表は 1 つのトランザクション開始 ID 列しか持てません。data-type が指定されない場合、 列は TIMESTAMP(12) として定義されます。data-type を指定する場合は、TIMESTAMP(12) でなければなりません。トランザクション開始 ID 列には DEFAULT 節を指定できません。 トランザクション開始 ID 列は更新できません。
既存の行で、列が NULL 可能である場合、NULL 値が列の値として割り当てられます。 それ以外の場合、列の値は、0001 年 1 月 1 日に対応する日付、および 0 時 0 分 0 秒 0 小数秒に対応する時刻のタイム・スタンプに設定されます。
DATA CHANGE OPERATION
挿入された各行、列が更新されたすべての行、および履歴表が ON DELETE ADD EXTRA ROW で定義されている場合にシステム期間テンポラル表から削除されたすべての行に、データベース・マネージャーが値を生成することを指定します。 列には、以下のいずれかの値が含まれます。
I
挿入操作
U
更新操作
D
削除操作
data-type が指定されない場合、 列は CHAR(1) として定義されます。data-type を指定する場合は、CHAR(1) でなければなりません。この列には、DEFAULT 文節もフィールド・プロシージャーも指定できません。
既存の行で、列が NULL 可能である場合、NULL 値が列の値として割り当てられます。 それ以外の場合、列の値はブランクに設定されます。
special-register
挿入された各行、列が更新されたすべての行、および履歴表が ON DELETE ADD EXTRA ROW で定義されている場合にシステム期間テンポラル表から削除されたすべての行に、データベース・マネージャーによって特殊レジスターの値が割り当てられることを指定します。 データ変更ステートメントの時点での特殊レジスターの値が使用されます。 単一の SQL ステートメントを使用して複数の行が変更される場合、列の値は、すべての行で同じになります。
data-type は、以下の表に従って定義する必要があります。
特殊レジスター 列のデータ・タイプ
CURRENT CLIENT_ACCTNG VARCHAR(255)
CURRENT CLIENT_APPLNAME VARCHAR(255)
CURRENT CLIENT_PROGRAMID VARCHAR(255)
CURRENT CLIENT_USERID VARCHAR(255)
CURRENT CLIENT_WRKSTNNAME VARCHAR(255)
CURRENT SERVER VARCHAR(18)
SESSION_USER VARCHAR(128)
USER VARCHAR(18)
この列には、DEFAULT 文節もフィールド・プロシージャーも指定できません。
既存の行で、列が NULL 可能である場合、NULL 値が列の値として割り当てられます。 それ以外の場合、列の値は、長さ 0 のストリングに設定されます。
built-in-global-variable
挿入された各行、列が更新されたすべての行、および履歴表が ON DELETE ADD EXTRA ROW で定義されている場合にシステム期間テンポラル表から削除されたすべての行に、データベース・マネージャーによって組み込みグローバル変数の値が割り当てられることを指定します。 データ変更ステートメントの時点での組み込みグローバル変数の値が使用されます。 単一の SQL ステートメントを使用して複数の行が変更される場合、列の値は、すべての行で同じになります。
data-type は、以下の表に従って定義する必要があります。
組み込みグローバル変数 列のデータ・タイプ
QSYS2.JOB_NAME VARCHAR(28)
QSYS2.SERVER_MODE_JOB_NAME VARCHAR(28)
SYSIBM.CLIENT_HOST VARCHAR(255)
SYSIBM.CLIENT_IPADDR VARCHAR(128)
SYSIBM.CLIENT_PORT INTEGER
SYSIBM.PACKAGE_NAME VARCHAR(128)
SYSIBM.PACKAGE_SCHEMA VARCHAR(128)
SYSIBM.PACKAGE_VERSION VARCHAR(64)
SYSIBM.ROUTINE_SCHEMA VARCHAR(128)
SYSIBM.ROUTINE_SPECIFIC_NAME VARCHAR(128)
SYSIBM.ROUTINE_TYPE CHAR(1)
この列には、DEFAULT 文節もフィールド・プロシージャーも指定できません。
既存の行で、列が NULL 可能である場合、NULL 値が列の値として割り当てられます。 それ以外の場合、列の値は、数値列の場合は 0、可変長文字ストリング列の場合は長さ 0 のストリング、固定長文字ストリング列の場合はブランクに設定されます。
NOT NULL
列に NULL 値が入るのを防止します。NOT NULL を指定しないと、列に NULL 値が入ってもよいことを暗黙指定することになります。 列定義で NOT NULL を指定する場合は、列が ID 列でない限り、DEFAULT も指定する必要があります。行変更タイム・スタンプ列、行開始列、および行終了列には、NOT NULL が必要です。
NOT HIDDEN
列が SQL ステートメントの表の暗黙的参照に組み込まれることを示します。これはデフォルトです。
IMPLICITLY HIDDEN
名前で明示的に参照されない限り、列は SQL ステートメントから不可視であることを示します。例えば、SELECT * は、結果に隠し列を含みません。 表には、少なくとも 1 つの IMPLICITLY HIDDEN でない列が含まれていなければなりません。
column-constraint
列定義列制約 は、単一の列から 成る制約を定義するための簡便な手段です。 列 C の定義に列制約の指定がある場合、その効果は、C が識別された唯一の列である固有制約参照制約または検査制約が指定されている場合と同一です。
CONSTRAINT constraint-name
制約名 は、既に ALTER TABLE ステートメントで指定され、かつ既に現行サーバーに存在している制約名と同じであってはなりません。

この文節の指定がない場合、固有制約の名前がデータベース・マネージャーによって生成されます。

PRIMARY KEY
これは、1 つの列からなる基本キーを定義する簡便な手段です。 列 C の定義に PRIMARY KEY を指定した場合、その効果は、別個の文節として PRIMARY KEY(C) 文節を指定したのと同一です。

この文節は、複数の列定義 で指定してはなりません。 また列定義に UNIQUE 文節の指定がある場合には、この文節を指定してはなりません。 この列は、LOB 列、DATALINK 列、または XML 列であってはなりません。ソート・シーケンスを指定する場合、 列にフィールド・プロシージャーを含めることはできません。

基本キーを追加すると、CHECK 制約が暗黙的に追加され、その基本キーを構成する列で NULL を使用することはできないという規則が適用されます。

UNIQUE
これは、1 つの列からなるユニーク制約を定義する簡便な手段です。 列 C の定義に UNIQUE の指定がある場合、その効果は、別個の文節として UNIQUE(C) 文節が指定された場合と同一です。

この文節は、1 つの列定義で複数回指定することはできません。 また、列定義 で PRIMARY KEY が指定されている場合には、この文節を指定してはなりません。 この列は、LOB 列、DATALINK 列、または XML 列であってはなりません。ソート・シーケンスを指定する場合、 列にフィールド・プロシージャーを含めることはできません。

references-clause
列定義の REFERENCES 文節 は、1 つの列からなる外部キーを 定義する簡便な手段です。列 C の定義に REFERENCES 文節 の指定がある場合 、その効果は、C が識別された唯一の列である FOREIGN KEY 文節の一環とし てその REFERENCES 文節が指定されている場合と同一です。 表が宣言済みグローバル一時表、分散表、または履歴表である場合は、参照文節 を使用することはできません。 この列は、行変更タイム・スタンプ列であってはなりません。
CHECK(check-condition)
これを指定すると、単一の列だけを参照するという検査条件 の検査制約を簡略式で定義することができます。 したがって、列 C の列定義で CHECK を指定した場合、検査制約の検査 条件 では、C 以外の列を参照することができなくなります。結果は、 検査制約を別個の文節として指定した場合と同じです。

CHECK 制約の中で、FILE LINK CONTROL 列を持つ ROWID、XML、または DATALINK を参照することはできません。その他の制限事項については、ADD 検査制約を参照してください。

FIELDPROC
列のフィールド・プロシージャー出口ルーチンとして、外部プログラム名 を指定します。SQL が含まれていない ILE プログラムを指定する必要があります。 サービス・プログラムを指定することはできません。
このフィールド・プロシージャーは列の値のエンコードとデコードを行います。列に値が挿入されるときは、フィールド・プロシージャーに渡されてエンコードされて から挿入されます。列に入っている値が使用されるときは、フィールド・プロシージャーに渡されてデコードされてから使用されます。
また、フィールド・プロシージャーは、ALTER TABLE ステートメントの処理中にも呼び出されます。この呼び出しの場合、プロシージャーは Db2 に列のフィールド記述を提供します。フィールド記述は、エンコードされた値のデータ特性を定義します。一方、列で指定する情報では、デコードされた値のデータ特性を定義します。
constant
フィールド・プロシージャーの呼び出し時にフィールド・プロシージャーに渡すパラメーターを指定します。パラメーター・リストはオプションです。
ROWID または DATALINK の列、あるいは ROWID または DATALINK に基づく特殊タイプの列でフィールド・プロシージャーを定義することはできません。この列は、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、および生成式列であってはなりません。この列に、CURRENT DATE、CURRENT TIME、CURRENT TIMESTAMP、USER のいずれかのデフォルト値が入っていてはなりません。チェック条件でこの列を参照することはできません。ただし、NULL 述部で参照する場合は例外です。この列が外部キーの一部になっている場合は、対応する親キー列でも同じフィールド・プロシージャーを使用する必要があります。フィールド・プロシージャーを作成する方法の詳細については、『SQL プログラミング』を参照してください。
datalink-options
DATALINK 列に関連したオプションを指定します。 データ・リンク・オプション については、CREATE TABLEを参照してください。
BEFORE column-name
新しい列をどの列の前に追加するのかを指定します。名前を修飾してはなりません。また、表の既存の列を識別しなければなりません。 BEFORE 文節を指定しない場合は、行の末尾に列が追加されます。

ALTER COLUMN column-alteration

既存の ID 列の属性など、列の定義を変更します。 指定した属性だけが変更されます。それ以外のものは、未変更のままになります。表がシステム期間テンポラル表である場合は、対応する履歴表に変更が加えられます。ただし、ID や行変更タイム・スタンプなどの生成列属性はコピーされません。

column-name
変更したい列を識別します。名前を修飾してはなりません。また、表の既存の列を識別しなければなりません。 この名前で識別する列は、同じ ALTER TABLE ステートメントで追加ま たは除去しようとしている列であってはなりません。
SET DATA TYPE data-type
変更したい列の新しいデータ・タイプを指定します。 新しいデータ・タイプには、その列の既存のデータ・タイプとの互換性を保持させる必要があります。 データ・タイプの互換性に関する詳細については、割り当ておよび比較を参照してください。 以下の変更は許可されません。
  • 数値データ・タイプを文字ストリング・データ・タイプへ
  • 文字ストリング・データ・タイプを数値データ・タイプへ
  • 日時データ・タイプを文字ストリング・データ・タイプへ
  • 日時データ・タイプを異なる日時データ・タイプへ
XML 列の場合は、CCSID だけを変更できます。

指定した長さ、精度、および位取りは、既存の長さ、精度、および位取りに比較して、大きい場合も、小さい場合も、同じである場合もあります。 ただし、新しい長さ、精度、または位取りの方が小さい場合は、切り捨てまたは数値変換エラーが起こる場合があります。

指定した列にデフォルト値が入れられており、新しいデフォルト値を指定しない場合は、既存のデフォルト値で、割り当ておよび比較で説明している割り当て規則に従ってその列に割り当てることができる値を表す必要があります。

行変更タイム・スタンプ列 を、6 以外の精度のタイム・スタンプに変更することはできません。

行開始列、行終了列、またはトランザクション開始 ID 列を、12 以外の精度のタイム・スタンプに変更することはできません。

生成式列を必要な定義と異なるデータ・タイプおよび長さに変更することはできません。

表がシステム期間テンポラル表である場合、関連した履歴表でも列が変更されます。表がシステム期間テンポラル表である場合、ストリング長を短くする、精度を低くする、などのデータ損失が発生する可能性がある方法で列を変更することはできません。

列を固有キー、基本キー、または外部キーで指定する場合は、それらのキーの列の長さの新しい合計は 32766-n を超えてはなりません。ここで、n はヌルになることができる、指定した列の数です。

属性を変更すると、列への割り当てに関する規則に従って、列内の既存の値が新しい列属性に変換されます。ただし、ストリング値は切り捨てられるという例外を伴います。

列の データ・タイプ属性の変更が、表に定義されている行の許可または列マスクに 影響を及ぼすことがあります。列のデータ・タイプ属性が変更されると、 行の許可および列マスクは、新しい列属性を使用して再評価 されます。この再評価処理でエラーが検出される場合、 ALTER ステートメントは失敗します。

この列を参照する別の表に 行の許可または列マスクが定義されている場合、行の許可または列マスクは、 使用されるまで、または ALTER REGENERATE のオブジェクトになるまで 再評価されません。再評価でエラーがあると再生成、再生成が失敗するか、または、 列マスクまたは行の許可を使用する必要のある最初のステートメントが失敗するかのどちらかの結果になります。エラーを 修正するために、行の許可または列マスクを除去して再作成する必要がある場合があります。

SET default-clause
変更したい列の新しいデフォルト値を指定します。 指定するデフォルト値は、割り当ておよび比較で説明している割り当て規則に従って、その列に割り当てることができる値を表す必要があります。
SET GENERATED ALWAYS または GENERATED BY DEFAULT
データベース・マネージャーが列の値を生成することを示します。 列が ID 列 (AS IDENTITY 文節で定義されたもの)、行変更タイム・スタンプ列と見なされる場合、または列のデータ・タイプが ROWID (または ROWID に基づく特殊タイプ) である場合は、GENERATED を指定することができます。行開始列、行終了列、トランザクション開始 ID 列、および生成式列に使用できるのは、GENERATED ALWAYS のみです。それ以外の場合は、GENERATED を指定してはなりません。
AS IDENTITY
この列を表の ID 列に変更することを指定します。1 つの表は識別列を 1 つだけ持つことができます。 識別列は、分散表内で使用することはできません。AS IDENTITY を指定できるのは、列のデータ・タイプが、厳密に位取りがゼロの数値タイプ (SMALLINT、 INTEGER、BIGINT、DECIMAL、または位取りがゼロの NUMERIC、 またはこれらのデータ・タイプに基づく特殊タイプ) である場合だけです。 DECIMAL または NUMERIC データ・タイプが指定された場合、精度は 31 以下でなければなりません。

列は NULL 可能であってはなりません。列に明示的なデフォルト値があると、そのデフォルト値は削除されます。識別属性の説明については、CREATE TABLE内の AS IDENTITY 文節を参照してください。

as-row-transaction-timestamp-clause
この列を表の行開始列または行終了列に変更することを指定します。この列は、TIMESTAMP(12) でなければなりません。デフォルトを持つことはできず、NULL 可能であってはなりません。
as-row-transaction-start-id-clause
この列を表のトランザクション開始 ID 列に変更することを指定します。この列は、TIMESTAMP(12) でなければならず、デフォルトを持つことはできません。
SET NOT NULL
列に NULL 値を含めることはできないことを指定します。表の既存の行にあるこの列の値は、すべて NULL 以外でなければなりません。 指定した列にデフォルト値があり、新しいデフォルト値を指定しない場合は、既存のデフォルト値は NULL であってはなりません。 SET NULL の DELETE 規則を伴う参照制約の外部キーで列が識別され、その外部キーに他の NULL 可能列がない場合は、SET NOT NULL は使用できません。
SET NOT HIDDEN または IMPLICITLY HIDDEN
列の隠し属性を指定します。
NOT HIDDEN
列が SQL ステートメントの表の暗黙的参照に組み込まれることを示します。
IMPLICITLY HIDDEN
名前で明示的に参照されない限り、列は SQL ステートメントから不可視であることを示します。例えば、SELECT * は、結果に隠し列を含みません。 表には、少なくとも 1 つの IMPLICITLY HIDDEN でない列が含まれていなければなりません。
SET FIELDPROC
列のフィールド・プロシージャー出口ルーチンとして、外部プログラム名 を指定します。SQL が含まれていない ILE プログラムを指定する必要があります。 サービス・プログラムを指定することはできません。
このフィールド・プロシージャーは列の値のエンコードとデコードを行います。列に値が挿入されるときは、フィールド・プロシージャーに渡されてエンコードされて から挿入されます。列に入っている値が使用されるときは、フィールド・プロシージャーに渡されてデコードされてから使用されます。
また、フィールド・プロシージャーは、ALTER TABLE ステートメントの処理中にも呼び出されます。この呼び出しの場合、プロシージャーは Db2 に列のフィールド記述を提供します。フィールド記述は、エンコードされた値のデータ特性を定義します。一方、列で指定する情報では、デコードされた値のデータ特性を定義します。
constant
フィールド・プロシージャーの呼び出し時にフィールド・プロシージャーに渡すパラメーターを指定します。パラメーター・リストはオプションです。
ROWID または DATALINK の列、あるいは ROWID または DATALINK に基づく特殊タイプの列でフィールド・プロシージャーを定義することはできません。この列は、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、および生成式列であってはなりません。この列に、CURRENT DATE、CURRENT TIME、CURRENT TIMESTAMP、USER のいずれかのデフォルト値が入っていてはなりません。フィールドのエンコード形式とデコード形式では、NULL 可能性属性が一致している必要があります。チェック条件でこの列を参照することはできません。ただし、NULL 述部で参照する場合は例外です。この列が外部キーの一部になっている場合は、対応する親キー列でも同じフィールド・プロシージャーを使用する必要があります。フィールド・プロシージャーの例については、『SQL プログラミング』トピック集を参照してください。
DROP DEFAULT
列の現行デフォルト値を除去します。 指定される列は、次のとおりです。
  • デフォルト値を持っていなければならず、ヌル属性が NOT NULL であってはなりません。 あるいは、
  • 列のデフォルトが DEFAULT NULL で定義された場合は NULL のデフォルト値を 持つことができます。
この新規のデフォルト値は NULL 値になります。
DROP NOT NULL
列の NOT NULL 属性を除去し、その列が NULL 値をもてるようにします。 デフォルト値の指定がない場合、またはデフォルト値がまだ存在していない場合は、新しいデフォルト値は NULL 値になります。 表の基本キーで列を指定する場合、もしくはその列が ID 列、行変更タイム・スタンプ列、行開始列、行終了列、または ROWID である場合は、DROP NOT NULL は使用できません。
DROP GENERATED
列の生成された属性をドロップします。 この列は、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、または生成式列でなければなりません。 バージョン管理がアクティブな場合、行開始列、行終了列、およびトランザクション開始 ID 列の生成属性を除去することはできません。
DROP IDENTITY
列の識別属性を除去して、列を単純な数値データ・タイプ列にします。 列が ID 列でない場合は、DROP IDENTITY は使用できません。
DROP ROW CHANGE TIMESTAMP
列の行変更タイム・スタンプ属性をドロップし、その列を単純なタイム・スタンプ列にします。 列が行変更タイム・スタンプ列でない場合は、DROP ROW CHANGE TIMESTAMP は使用できません。
DROP FIELDPROC
列のフィールド・プロシージャーを除去します。列でフィールド・プロシージャーが定義されていなければ、DROP FIELDPROC を使用できません。
identity-alteration
列の識別属性を変更します。 列は指定した表に存在しなければならず、また、既に IDENTITY 属性を使用して定義されていなければなりません。 属性の説明については、AS IDENTITY を参照してください。
RESTART
ID 列に入れる次の値を指定します。 WITH 数値定数 を指定していない場合は、この ID 列を最初に作成したときに暗黙的または明示的に指定されている開始値から、シーケンスが再開始されます。RESTART を指定しても、元の START WITH 値は変更されません。
WITH numeric-constant
この列に入れる次の値として数値定数 を使用すること を指定します。 numeric-constant は、この列に割り当てることのできる正または負の値で、小数点の右側にゼロ以外の数字がない厳密な数値定数でなければなりません。

DROP COLUMN

識別された列を表から除去します。

column-name
除去したい列を識別します。 列名は修飾してはなりません。 この名前は、指定した表の列を識別するものでなければなりません。 以下のものを示す名前であってはなりません。
  • この ALTER TABLE ステートメントで既に追加または変更された列
  • 表の唯一の列
  • 表の列の中で非表示であるものを除いた最後の列
  • パーティション表または分散表のパーティション・キー
  • システム期間テンポラル表の列
  • 履歴表の列
  • 期間の定義で参照される列
列が除去されると、その列に対して定義された列マスクはすべて 除去されます。列が、別の列の行の許可または列マスクの定義で参照されている場合、その列を除去することは できません。
CASCADE
除去される列に従属しているビュー、索引、トリガー、または制約もすべて 除去されることを指定します。1
RESTRICT
ビュー、索引、トリガー、マテリアライズ照会表、または制約が列に依存している場合、その列を除去できないことを指定します。 1

ある制約で参照されている列がすべて同一の ALTER TABLE ステートメントで除去される場合は、その除去が RESTRICT で妨げられることはありません。

ADD ユニーク制約

CONSTRAINT constraint-name
制約の名前を指定します。制約名 は、既に ALTER TABLE ステートメントで指定され、かつ既に現行サーバーに存在している制約名と同じであってはなりません。制約名は、スキーマ内で固有でなければなりません。

指定しない場合は、固有の制約名がデータベース・マネージャーによって生成されます。

UNIQUE (column-name,…)
識別された列で構成されるユニーク制約を定義します。 それぞれの column-name は、該当の表の列を識別する非修飾の名前でなければなりません。同じ列を複数回指定することはできません。この列は、LOB 列、DATALINK 列、または XML 列であってはなりません。ソート・シーケンスを指定する場合、列にフィールド・プロシージャーを含めることはできません。指定できる列の数は 120 を超えてはならず、その長さの合計は 32766-n を超えてはなりません。ここで、n は NULL が許されると指定された列の数です。表が履歴表である場合は、UNIQUE を使用できません。

指定する列のセットは、その表の他の UNIQUE 制約または PRIMARY KEY に指定されている列のセットと同じであってはなりません。 例えば、UNIQUE(A,B) は、UNIQUE(B,A) あるいは PRIMARY KEY(A,B) が該当の表に既に存在する場合には許されません。 一連の列に指定されている既存のどの非 NULL 値も固有の値にする必要があります。複数の NULL 値が許されます。

識別された列に固有索引が既に存在する場合は、その索引が固有制約索引として指定されます。 それ以外の場合は、固有キーの固有性をサポートするために固有索引が作成されます。 固有索引は、別個のシステム論理ファイルとしてではなく、システム物理ファイルの一部として作成されます。

PRIMARY KEY (column-name,…)
指定した列で構成される基本キーを定義します。それぞれの column-name は、該当の表の列を識別する非修飾の名前でなければなりません。同じ列を複数回指定することはできません。この列は、LOB 列、DATALINK 列、または XML 列であってはなりません。ソート・シーケンスを指定する場合、列にフィールド・プロシージャーを含めることはできません。指定する列の数は 120 を超えてはならず、それらの列の長さの合計は 32766 を超えてはなりません。 該当の表に既に基本キーが存在していてはなりません。表が履歴表である場合は、PRIMARY KEY を使用できません。

指定する列は、その表の他の UNIQUE 制約に指定されている列と同じであってはなりません。 例えば、PRIMARY KEY(A,B) は、その表に UNIQUE(B,A) が既に存在する場合には許されません。 指定した一連の列の既存の値は、固有でなければなりません。

基本キーを追加すると、CHECK 制約が 暗黙的に追加され、その基本キーを構成するどの列でも NULL を使用するこ とはできないという規則が適用されます。

指定した列に固有索引が既に存在している場合には、その索引は、基本索引として扱われます。 このような場合以外は、基本キーの固有性をサポートする 基本索引が作成されます。固有索引は、別個のシステム論理ファイルとしてではなく、システム物理 ファイルの一部として作成されます。

ADD referential-constraint

CONSTRAINT constraint-name
制約の名前を指定します。制約名 は、現行サーバーに既に存在している制約を識別するものであってはなりません。

指定しない場合は、固有の制約名がデータベース・マネージャーによって生成されます。

FOREIGN KEY
参照制約を定義します。 表が宣言済みグローバル一時表、分散表、または履歴表である場合は、FOREIGN KEY を使用することはできません。

以下の説明で T1 は、変更したい表を表しています。

(column-name,…)
参照制約の外部キーは、指定した列で構成されます。 各 column-name は、T1 の列を指定する非修飾名でなければなりません。同じ列を複数回指定することはできません。この列は、LOB 列、DATALINK 列、または XML 列であってはならず、また行変更タイム・スタンプ列であってもなりません。ソート・シーケンスを指定する場合、列にフィールド・プロシージャーを含めることはできません。 指定できる列の数は 120 を超えてはならず、その長さの合計は 32766-n を超えてはなりません。ここで、n は NULL が許可されるように指定された列の数です。
REFERENCES table-name
REFERENCES 文節で指定する表名 は、現行サーバー上に存在する基本表を示すものでなければなりませんが、カタログ表、宣言済み一時表、分散表、または履歴表を示すものであってはなりません。親がパーティション表の場合は、親のユニーク制約を適用するユニーク索引がパーティション化されていてはなりません。この表は、制約関係における親表と呼ばれます。

参照制約の外部キー、親キー、および親表が表にある既存の参照制約の外部キー、親キー、および親表と同じである場合は、その参照制約は重複 します。 重複する参照制約は許されますが、お勧めできません。

以下の説明で、T2 は親表を示しています。

(column-name,…)
参照制約の親キーは、ここで指定する列によって構成されます。 各 column-name は、T2 の列を指定する非修飾名でなければなりません。 同じ列を複数回指定することはできません。この列は、LOB 列、DATALINK 列、または XML 列であってはならず、また行変更タイム・スタンプ列であってもなりません。ソート・シーケンスを指定する場合、列にフィールド・プロシージャーを含めることはできません。指定できる列の数は 120 を超えてはならず、その長さの合計は 32766-n を超えてはなりません。ここで、n は NULL が許されると指定された列の数です。

この列名のリストは、T2 の基本キーまたは T2 に存在する UNIQUE 制約の列名のリストと同一でなければなりません。 名前はどのような順序で指定しても構いません。 例えば、(A,B) を指定すると、UNIQUE(B,A) として定義された固有制約はこの要件を満たします。 列名のリストの指定がない場合、T2 は基本キーを持たなければなりません。 列名のリストの省略は、基本キーの列の暗黙の指定を意味しています。

指定した外部キーは、T2 の親キーと同じ数の列を持たなければなりません。 外部キーの n 番目の列と親キーの n 番目の列の記述は、同一のデータ・タイプ、長さ、CCSID、および FIELDPROC を持つ必要があります。

表が空である場合を除き、表の使用に先立って、外部キーの値の妥当性を検査する必要があります。 外部キーの値は、ALTER TABLE ステートメントの実行中に妥当性を検査されます。 したがって、外部キーの NULL 以外の値はすべて、T2 の親キーの値と一致している必要があります。

FOREIGN KEY 文節によって指定する参照制約は、T2 が親で、T1 が従属の関係を定義します。

ON DELETE
親表の行が削除される時点で、従属表について行うアクションを指定します。 可能なアクションには以下の 5 つがあります。
  • NO ACTION (デフォルト)
  • RESTRICT
  • CASCADE
  • SET NULL
  • SET DEFAULT

外部キーの列に NULL が許される列がある場合を除いて、SET NULL を指定してはなりません。 T1 が更新トリガーを持つ場合には、SET NULL および SET DEFAULT を指定してはなりません。

T1 が削除トリガーを持つ場合には、CASCADE を指定してはなりません。

FILE LINK CONTROL を指定した DATALINK 列が T1 に含まれる場合には、CASCADE を指定してはなりません。

削除規則は、T2 の行が DELETE または波及削除操作の対象で、しかもその行が T1 に従属する行を持っている場合に適用されます。 p は、そのような T2 の行を表すと想定します。

  • RESTRICT または NO ACTION を指定した場合、エラーが生じ、行の削除は行われません。
  • CASCADE を指定すると、 T1 の p の従属行に削除操作が伝搬します。
  • SET NULL が指定された場合、T1 の p のそれぞれの従属行の外部キーの NULL 可能な列が NULL 値に設定されます。
  • SET DEFAULT を指定した場合、T1 の p の各従属行の外部キーの各列は、そのデフォルト値に設定されます。
ON UPDATE
親表の行が更新される時点で、従属表で行うアクションを指定します。

更新規則は、T2 の行が UPDATE または波及更新操作の対象で、しかもその行が T1 に従属行を持つ場合に適用されます。 p は、そのような T2 の行を表すと想定します。

  • RESTRICT または NO ACTION を指定した場合、エラーが生じ、行の更新は行われません。

ADD 検査制約

CONSTRAINT constraint-name
制約の名前を指定します。制約名 は、現行サーバーに既に存在している制約を識別するものであってはなりません。制約名は、スキーマ内で固有でなければなりません。

指定しない場合は、固有の制約名がデータベース・マネージャーによって生成されます。

CHECK (check-condition)
検査制約を定義します。表のどの行についても、検査条件 は真または不明のいずれかでなければなりません。

検査条件 は、検索条件 です。ただし、下記の条件は除きます。

  • 参照できるのは表の列だけであり、列名を修飾してはなりません。
  • check-condition で指定する式の結果を、ROWID、XML の各データ・タイプ、または FILE LINK CONTROL を伴う DATALINK データ・タイプにすることはできません。
  • 次のいずれも含めることはできません。
    • 副照会
    • 集約関数
    • 変数
    • グローバル変数
    • パラメーター・マーカー
    • シーケンス参照
    • LOB を含む複合式 (連結など)
    • OLAP の指定
    • ROW CHANGE 式
    • IS JSON、JSON_EXISTS、または REGEXP_LIKE の述部
    • 特殊レジスター
    • deterministic でない関数
    • 特殊タイプの作成に伴って暗黙に生成された関数以外のユーザー定義関数
    • 以下の組み込みスカラー関数
ON INSERT VIOLATION
挿入される行の check-condition が false の場合の処置 を指定します。この節が指定されていないと、 挿入の check-condition が false の場合はエラーが発生します。
SET column-name = DEFAULT
挿入操作で提供される値の代わりに、column-name のデフォルト値が表に 挿入されます。

column-namecheck-condition 内で参照されている必要があります。

ON UPDATE VIOLATION
更新される行に対する check-condition が false の場合の処置 を指定します。この節が指定されていないと、 更新の check-condition が false の場合はエラーが発生します。
PRESERVE column-name
column-name の現行値は、更新操作によって提供される値で置き換えられるのではなく、表に 残ります。

column-namecheck-condition 内で参照されている必要があります。

検索条件の詳細については、検索条件を参照してください。

DROP

PRIMARY KEY
基本キーの定義、およびその基本キーが親キーである参照制約すべてを除去します。 該当の表は、基本キーを持っていなければなりません。
UNIQUE constraint-name
制約名 で指定した固有制約、およびこの固有制約に依存する参照制約すべてを除去します。 制約名 は、該当の表の固有制約を識別していなければなりません。DROP UNIQUE は、PRIMARY KEY 固有制約を除去することはありません。
FOREIGN KEY constraint-name
制約名が constraint-name の参照制約をドロップします。 制約名 は、該当の表が従属している参照制約を識別していなければなりません。
CHECK constraint-name
検査制約 constraint-name をドロップします。制約名 では、表の検査制約を識別する必要があります。
CONSTRAINT constraint-name
制約 constraint-name をドロップします。制約名 では、表の固有、参照、または検査制約を識別する必要があります。 この制約が、PRIMARY KEY または UNIQUE の制約である場合、その基本キーまたは固有キーが親キーである参照制約もすべて除去されます。
CASCADE
固有制約に関して、除去される制約に従属している参照制約があれば、それもすべて除去されることを指定します。
RESTRICT
固有制約に関して、それに従属している参照制約がある場合は、その固有制約は除去できないことを指定します。

ADD パーティション化文節

パーティション化されていない表をパーティション化された表に変更します。 指定した表が分散表または既にパーティション化された表である場合は、エラーが戻されます。 DDS で作成された物理ファイルをパーティション化することはできません。パーティション化文節 の説明については、CREATE TABLEを参照してください。

データを含むパーティション化されていない表をパーティション化された表に変更する場合、 データ・パーティション間のデータ移動が必要になります。 範囲パーティションを使用する場合、表内のすべての既存のデータは、 指定された範囲パーティションに割り当て可能でなければなりません。

DROP PARTITIONING

パーティション化された表をパーティション化されていない表に変更します。 指定した表が既にパーティション化されていない表である場合は、エラーが戻されます。

データを含むパーティション化された表をパーティション化されていない表に変更する場合、 データ・パーティション間のデータ移動が必要になります。

ADD PARTITION add-partition

1 つ以上のパーティションをパーティション化された表に追加します。 指定する表は、パーティション表でなければなりません。パーティションの数は、256 以下でなければなりません。

データを含むパーティション化された表のハッシュ・パーティションの数を変更する場合、 データ・パーティション間のデータ移動が必要になります。

partition-name
パーティションに名前を付けます。 パーティション名 で、表内に既に存在するデータ・パーティションを識別してはなりません。

この文節の指定がない場合、固有のパーティション名がデータベース・マネージャーによって生成されます。

boundary-spec
範囲パーティションの境界を指定します。 指定した表が範囲パーティション化された表でない場合、エラーが戻されます。 開始文節 および終了文節 の両方を必ず指定する必要があります。境界スペック の説明については、CREATE TABLEを参照してください。
整数 HASH PARTITIONS
追加するハッシュ・パーティションの数を指定します。 指定した表がハッシュ・パーティション化された表でない場合は、エラーが戻されます。

ALTER PARTITION

範囲パーティション化された表のパーティションの境界を変更します。 指定した表が範囲パーティション化された表でない場合、エラーが戻されます。

データを含む表の複数のパーティションの境界を変更する場合、 データ・パーティション間でデータを移動する必要があります。 表内のすべての既存のデータは、指定された範囲パーティションに割り当て可能でなければなりません。

partition-name
変更するパーティションの名前を指定します。 パーティション名 で、表内に存在するデータ・パーティションを識別しなければなりません。
boundary-spec
範囲パーティションの新規の境界を指定します。 開始文節 および終了文節 の両方を必ず指定する必要があります。境界スペック の説明については、CREATE TABLEを参照してください。

DROP PARTITION

パーティション化された表のパーティションを除去します。 指定した表がパーティション化された表でない場合、エラーが戻されます。 パーティション化された表の最後に残ったパーティションを指定すると、エラーが戻されます。 PRESERVE ROWS オプションが指定されている場合とパーティションが空である場合を除き、システム期間テンポラル表からパーティションをドロップすることはできません。

partition-name
除去するパーティションの名前を指定します。 パーティション名 で、表内に存在するデータ・パーティションを識別しなければなりません。
DELETE ROWS
指定したパーティションのすべてのデータを廃棄することを指定します。 パーティションに保管されているすべてのデータは、削除トリガーを処理せずに表から削除されます。
PRESERVE ROWS
指定したパーティションのすべてのデータを残りのパーティションに移動することによって、 削除または挿入トリガーを処理せずにそのデータを保存することを指定します。 指定した表が範囲パーティション化された表である場合、PRESERVE ROWS を指定してはなりません。 ハッシュ・パーティションを除去すると、残りのデータ・パーティション間でデータの移動が必要になります。

ATTACH PARTITION

他の表を新規のデータ・パーティションとしてアタッチします。 アタッチされる表のデータは、アタッチ先の表の新規パーティションになります。 データ移動は一切ありません。 指定したターゲット表がパーティション化された表でない場合、エラーが戻されます。 ターゲット表に既に最大数のパーティションがある場合、エラーが戻されます。 表がハッシュ・パーティション化されている場合、エラーが戻されます。

アタッチされる表で、行レベルのアクセス制御または列レベルのアクセス制御のいずれかがアクティブになっている場合、アタッチ先の表の同じ制御をアクティブにする必要があります。 行権限や列マスクは、アタッチされる表からターゲット表に自動的に引き継がれるわけではありません。 列マスクおよび行権限は、必ずしも両方の表で厳密に同じである必要はありません。ただし、セキュリティーの観点では、同じであるのが最善です。 しかし、アタッチされる表の行レベルのアクセス制御がアクティブになっている場合には、アタッチ先の表でも行レベルのアクセス制御をアクティブにする必要があります。同様に、アタッチする表の列レベルのアクセス制御がアクティブになっており、 少なくとも 1 つの列マスクが使用可能になっている場合には、 アタッチ先の表でも列レベルのアクセス制御をアクティブにし、 対応する列の列マスクを使用可能にする必要があります。

partition-name
データ・パーティションの名前を指定します。 表の他のデータ・パーティションと同じ名前を指定することはできません。この文節が指定されず、ソース表がパーティション化されている場合は、 ソース表のパーティション名が使用されます。 その他の場合は、この文節が指定されていないと、固有のパーティション名がデータベース・マネージャーによって生成されます。
boundary-spec
新規パーティションの境界を指定します。 boundary-spec が指定されていない場合は、次のようになります。
  • ソース表は、単一パーティションでパーティション化された表でなければなりません。 そのパーティションの boundary-spec が暗黙的に使用されます。
  • ソース表のパーティション・キーの数とパーティション・キー名は、ターゲット表のものと同じでなければなりません。
範囲は、暗黙的であれ明示的であれ、既存のデータ・パーティションの範囲と重なり合ってはなりません。 境界スペック の説明については、CREATE TABLEを参照してください。 boundary-spec が指定された場合、 ソース表のデータは、指定された範囲に適合する必要があります。そうでないと、後続の SQL 操作が予測不能になる可能性があります。
FROM table-name1
新規パーティションのデータのソースとして使用する表を指定します。 表は、ターゲット表と同じリレーショナル・データベースに存在しなければなりません。指定した表がパーティション化された表でない場合、エラーが戻されます。 表がハッシュ・パーティション化されている場合、エラーが戻されます。 表は、ビュー、マテリアライズ照会表、宣言済みグローバル一時表、システム期間テンポラル表、履歴表、およびシステム表であってはなりません。 表に NOT LOGGED INITIALLY 属性があってはなりません。table-name1 の表定義は、複数のパーティションを持つことができず、以下の形で、変更される表と一致していなくてはなりません。
  • 列数が同じ。
  • 表内の同じ位置 (順に並べた時の同じ位置) にある列のデータ・タイプ、属性、フィールド・プロシージャー、生成式、デフォルト値、および CCSID が同じ。
  • 表内の同じ位置 (順に並べた時の同じ位置) にある列の NULL 可能特性が同じ。
  • ターゲット表に行変更タイム・スタンプ列がある場合、それに対応するソース表の列は、行変更タイム・スタンプ列でなければなりません。
  • 可変長または LOB データ・タイプの場合、表内の同じ位置 (順に並べた時の同じ位置) にある列の ALLOCATE 長が同じ。
table-name1 のデータが正しくアタッチされた後は、DROP TABLE table-name1 CASCADE と同等の操作が実行され、この表はデータを持たなくなり、データベースから削除されます。

DETACH PARTITION

パーティション化された表のパーティションをデタッチします。指定した表がパーティション化された表でない場合、エラーが戻されます。 1 つのパーティションを含む新しいパーティション化された表 table-name1 が作成され、デタッチされたパーティション・データが入ります。 partition-name を変更される表の最後に残ったデータ・パーティションにすることはできません。 変更する表は、システム期間テンポラル表や、強制される参照制約の親表であってはなりません。また、変更する表がハッシュ・パーティションを使用してはなりません。

ソース表が ID 列を含む場合、作成された表で対応する列は ID 列になりません。 ソース表のその他の列属性はすべて、作成された表の対応する列に定義されます。 ソース表に制約がある場合、作成された表に同様の制約は追加されません。

行レベルのアクセス制御または列レベルのアクセス制御のいずれかがアクティブである表からパーティションがデタッチされる場合、デタッチされたデータ用に作成される新しい表では、デタッチされたデータを保護するために、自動的に行レベルのアクセス制御がアクティブになります。 この新しい表に対して適切な行権限を定義するか、表の行レベルのアクセス制御を非アクティブにするまで、この表に直接アクセスしても行は返されません。

ソース表に対する特権は、作成された表に伝搬されません。

partition-name
デタッチするパーティションの名前を指定します。 partition-name は、表内に存在するデータ・パーティションを識別しなければなりません。
table-name1
表の名前を指定します。 暗黙的または明示的修飾子も含め、この名前で、現行サーバーに既に存在している別名、ファイル、 索引、表、またはビューを識別することはできません。

SQL 名が指定されている場合、表は、暗黙的または明示的修飾子で指定し ているスキーマ内に作成されます。

システム名が指定されている場合、表名は、修飾子で指定しているスキーマ内に作成されます。 修飾されない場合:
  • CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、表は、現行ライブラリー (*CURLIB) 内に作成されます。
  • そうでない場合、表は現行スキーマ内に作成されます。

指定されたパーティション表がジャーナルに記録された場合は、新しい表も同じジャーナルに記録されます。 そうでない場合は、新しい表もジャーナルに記録されません。

ADD MATERIALIZED QUERY マテリアライズ照会定義

基本表をマテリアライズ照会表に変更します。 指定した表が既にマテリアライズ照会表である場合、 あるいはその表が他のマテリアライズ照会表で参照されている場合は、エラーが戻されます。

選択ステートメント
表の基礎となる照会を定義します。 既存の表の列は、以下の特性を満たしていなければなりません。
  • 表の列の数は、選択ステートメント の結果列の数と同じでなければなりません。
  • 表の各列の列属性は、選択ステートメント 内の対応する結果列の列属性と互換性がなければなりません。

マテリアライズ照会表の選択ステートメント には、変更する表の参照、 変更する表に対するビュー、または他のマテリアライズ照会表を含めてはなりません。 マテリアライズ照会表の選択ステートメント を指定することについての詳細は、 CREATE TABLEを参照してください。

refreshable-table-options
基本表をマテリアライズ照会表に変更するためのマテリアライズ照会表オプションを指定します。
DATA INITIALLY DEFERRED
表内のデータを ALTER TABLE ステートメントの一部として検証しないことを指定します。 REFRESH TABLE ステートメントを使用して、マテリアライズ照会表にあるデータが、 その表を基礎とする照会の結果と同じになることを確証できます。
DATA INITIALLY IMMEDIATE
ALTER TABLE ステートメントの処理の一部として、 データを照会の結果から表内に挿入することを指定します。
REFRESH DEFERRED
表内のデータを REFRESH TABLE ステートメントを使用していつでもリフレッシュできるように指定します。 表内のデータは、REFRESH TABLE ステートメントの処理時または最後に更新された時のスナップショットとしての照会の結果のみを反映します。
MAINTAINED BY USER
マテリアライズ照会表がユーザーによって保守されるように指定します。 ユーザーは表に対して INSERT、DELETE、UPDATE、または REFRESH TABLE ステートメントを使用できます。
ENABLE QUERY OPTIMIZATION または DISABLE QUERY OPTIMIZATION
このマテリアライズ照会表を照会の最適化に使用できるかどうかを指定します。
ENABLE QUERY OPTIMIZATION
マテリアライズ照会表を照会最適化に使用できます。
DISABLE QUERY OPTIMIZATION
マテリアライズ照会表は照会最適化に使用されません。それでもその表を直接照会することはできます。

select-statement 内で直接または間接に参照されている 表で行レベルまたは列レベルのアクセス制御がアクティブになっていて、変更される表では行アクセス制御 がアクティブになっていない場合、変更される表に対して行アクセス制御が暗黙的にアクティブ化 されます。これにより、マテリアライズ照会表の内容への直接アクセスが制限されます。 表を明示的に参照する照会では、表内にデータがないことを示す警告が 戻されます。マテリアライズ照会表にアクセスするには、適切な行権限を作成します。またはふさわしいようであれば、マテリアライズ照会表に対する ALTER TABLE DEACTIVATE ROW ACCESS CONTROL を発行して、行レベルの保護を除去します。

ALTER MATERIALIZED QUERY マテリアライズ照会表変更

マテリアライズ照会表の属性を変更します。 表名でマテリアライズ照会表を識別する必要があります。

選択ステートメント
表の基礎となる照会を定義します。 既存の表の列は、以下の特性を満たしていなければなりません。
  • 表の列の数は、選択ステートメント の結果列の数と同じでなければなりません。
  • 表の各列の列属性は、選択ステートメント 内の対応する結果列の列属性と互換性がなければなりません。

マテリアライズ照会表の選択ステートメント には、変更する表の参照、 変更する表に対するビュー、または他のマテリアライズ照会表を含めてはなりません。 マテリアライズ照会表の選択ステートメント を指定することについての詳細は、 CREATE TABLEを参照してください。

refreshable-table-options
基本表をマテリアライズ照会表に変更するためのマテリアライズ照会表オプションを指定します。
DATA INITIALLY DEFERRED
表内のデータを ALTER TABLE ステートメントの一部としてリフレッシュも検証もしないことを指定します。 REFRESH TABLE ステートメントを使用して、マテリアライズ照会表にあるデータが、 その表を基礎とする照会の結果と同じになることを確証できます。
DATA INITIALLY IMMEDIATE
ALTER TABLE ステートメントの処理の一部として、 データを照会の結果から表内に挿入することを指定します。
REFRESH DEFERRED
表内のデータを REFRESH TABLE ステートメントを使用していつでもリフレッシュできるように指定します。 表内のデータは、REFRESH TABLE ステートメントの処理時または最後に更新された時のスナップショットとしての照会の結果のみを反映します。
MAINTAINED BY USER
マテリアライズ照会表がユーザーによって保守されるように指定します。 ユーザーは表に対して INSERT、DELETE、UPDATE、または REFRESH TABLE ステートメントを使用できます。
ENABLE QUERY OPTIMIZATION または DISABLE QUERY OPTIMIZATION
このマテリアライズ照会表を照会の最適化に使用できるかどうかを指定します。
ENABLE QUERY OPTIMIZATION
マテリアライズ照会表を照会最適化に使用できます。
DISABLE QUERY OPTIMIZATION
マテリアライズ照会表は照会最適化に使用されません。それでもその表を直接照会することはできます。
SET refreshable-table-alteration
表を保守する方法、または表を照会最適化に使用するかどうかを変更します。
MAINTAINED BY USER
マテリアライズ照会表がユーザーによって保守されるように指定します。 ユーザーは表に対して INSERT、DELETE、UPDATE、または REFRESH TABLE ステートメントを使用できます。
REFRESH DEFERRED
表内のデータを REFRESH TABLE ステートメントを使用していつでもリフレッシュできるように指定します。 表内のデータは、REFRESH TABLE ステートメントの処理時または最後に更新された時のスナップショットとしての照会の結果のみを反映します。
ENABLE QUERY OPTIMIZATION または DISABLE QUERY OPTIMIZATION
このマテリアライズ照会表を照会の最適化に使用できるかどうかを指定します。
ENABLE QUERY OPTIMIZATION
マテリアライズ照会表を照会最適化に使用できます。
DISABLE QUERY OPTIMIZATION
マテリアライズ照会表は照会最適化に使用されません。それでもその表を直接照会することはできます。

DROP MATERIALIZED QUERY

マテリアライズ照会表を変更して、その表がマテリアライズ照会表ではなくなるようにします。table-name によって指定される表は、マテリアライズ照会表として定義されている必要があります。列の定義は変更されませんが、この表はもはや照会最適化には使用できなくなり、 REFRESH TABLE ステートメントでの使用は無効になります。 表に対する行レベルと列レベルのアクセスは、 現在のアクティブ状態または非アクティブ状態のままになります。

ACTIVATE NOT LOGGED INITIALLY

この現行作業単位に対して表の NOT LOGGED INITIALLY 属性を活動化します。

このステートメントによって変更された表に対して同一作業単位内の INSERT、 DELETE、または UPDATE ステートメントによって行われた変更は、ログ (ジャーナル) に記録されません。

現行作業単位の完了時に NOT LOGGED INITIALLY 属性が非活動化され、後続の作業単位で表に対して行われるすべての操作はログ (ジャーナル) に記録されます。

表名 に対するデータ変更操作が保留中の場合、または表名 を参照するカーソルがコミット下で現在オープン状態である場合、トランザクション内の ACTIVATE NOT LOGGED INITIALLY は許可されません。

表がシステム期間テンポラル表または履歴表の場合、ACTIVATE NOT LOGGED INITIALLY は使用できません。 表に FILE LINK CONTROL が指定された DATALINK 列 がある場合や、表が分離レベル No Commit (NC) で実行されている場合、それは無視されます。

WITH EMPTY TABLE
表に現在あるすべてのデータが除去されます。この ALTER ステートメントが発行された作業単位がロールバックされると、表データは元の状態に戻らなくなります。 このアクションが要求されると、影響を受ける表に定義された DELETE トリガーは起動しません。

マテリアライズ照会表、または参照制約内の親には、WITH EMPTY TABLE を指定することはできません。 表が分離レベル No Commit (NC) を指定されて実行されている場合は、WITH EMPTY TABLE は無視されます。

WHERE 文節を使用しない DELETE ステートメントは一般に ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE と同等以上のパフォーマンスを示すうえ、ROLLBACK を使用して表の行の削除をロールバックすることを可能にします。

ADD PERIOD FOR period-definition

期間定義を表に追加します。

SYSTEM_TIME (begin-column-name, end-column-name)
システム期間を SYSTEM_TIME という名前で定義します。 表内に名前 SYSTEM_TIME の列があってはなりません。表に指定できる SYSTEM_TIME 期間は 1 つのみです。begin-column-name は ROW BEGIN として定義し、end-column-name は ROW END として定義する必要があります。

DROP PERIOD SYSTEM_TIME

SYSTEM_TIME 期間を表からドロップします。 表がシステム期間テンポラル表である場合、期間 SYSTEM_TIME はドロップできません。

ADD VERSIONING USE HISTORY TABLE history-table-name

これを指定すると、表はシステム期間テンポラル表になります。 表はシステム期間テンポラル表かまたは履歴表として既に定義されていてはなりません。表に SYSTEM_TIME 期間とトランザクション開始 ID 列が定義されている必要があります。 表をマテリアライズ照会表および分散表にすることはできません。 また、表に ROWID 列および FILE LINK CONTROL を指定した DATALINK 列が含まれてはなりません。 この表および履歴表で、NOT LOGGED INITIALLY 属性をアクティブにすることはできません。

この表の行の履歴バージョンは、データベース・マネージャーによって保持されます。 関連履歴表は、表の履歴行を保管するために使用されます。データベース・マネージャーは、行が表に挿入された時期とそれが更新または削除された時期を示す追加情報を記録します。 システム期間テンポラル表の行が更新されると、その行の直前のバージョンが保持されます。 システム期間テンポラル表のデータが削除されると、その行の古いバージョンが履歴レコードとして挿入されます。

この表に対する参照には、戻すデータのバージョンを指示する期間指定を含めることができます。

history-table-name
システム期間テンポラル表の履歴行を保持する履歴表を指定します。history-table-name は、現行サーバーに存在する表を指定するものでなければならず、カタログ表、既存のシステム期間テンポラル表、既存の履歴表、宣言済みのグローバル一時表、マテリアライズ照会表、およびビューのいずれでもありません。

指定する履歴表は、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、または期間を含むものであってはなりません。 この履歴表は、参照制約の一部であることも、固有キー制約や基本キー制約を持つこともできません。

表が履歴表として一度定義されると、その表に直接の挿入および更新は実行できません。 削除は可能です。

ON DELETE ADD EXTRA ROW
行がシステム期間テンポラル表から削除されると、削除された行が履歴表に追加されることを示します。 この追加の履歴行は、システム期間テンポラル表の期間指定の照会に対して戻されません。 この行が追加される際に、行開始列、行終了列、および生成式列の値が生成されます。
ON DELETE ADD EXTRA ROW 節は、システム期間テンポラル表に生成式列が含まれる場合に使用することを想定しています。 追加行の生成式列には、履歴表の追加行に至った削除操作に関する情報が含まれます。
システム期間テンポラル表と指定した履歴表は、同じスキーマ内にあって、列の数と順序が同じでなければなりません。 2 つの表の対応する列の以下の属性は同じでなければなりません。
  • 名前およびシステム列名
  • データ・タイプ
  • 長さ、精度、および位取り
  • FOR BIT DATA、FOR SBCS DATA、FOR MIXED DATA 属性
  • CCSID
  • NULL 属性
  • 非表示属性
  • フィールド手順
  • 日時の形式と区切り記号
  • ソート順序と言語 ID

履歴表にデータが含まれている場合、データが履歴行を正確に表すようにしてください。 データが履歴行の結果を正確に表さない場合、テンポラル照会が予期しない結果になる可能性があります。

行アクセス制御または列アクセス制御がシステム期間テンポラル表においてアクティブであるが、行アクセス制御が履歴表でアクティブでない場合、データベース・マネージャーは自動的に、履歴表での行アクセス制御をアクティブにし、デフォルトの行権限を履歴表に作成します。

DROP VERSIONING

表がもはやシステム期間テンポラル表でないことを指定します。 表はシステム期間テンポラル表でなければなりません。この表では、履歴データの記録と保守が行われなくなります。 列の定義および表のデータは変更されませんが、表はシステム期間テンポラル表としては扱われません。 SYSTEM_TIME 期間は保持されます。これ以降、この表を参照する照会では、表の SYSTEM_TIME 期間指定を指定することはできません。 システム期間テンポラル表と、関連する履歴表との関係は解除されます。履歴表はドロップされず、履歴表の内容は影響を受けません。

ACTIVATE ROW ACCESS CONTROL または DEACTIVATE ROW ACCESS CONTROL

有効な行の許可 が表内のアクセス可能な行のセットを制御するために Db2 によって 適用されるかどうかを指定します。

ACTIVATE ROW ACCESS CONTROL
表の行アクセス制御を活動化することを指定します。表が別名である場合は、基本表の行アクセス制御が活動化されます。宣言されたグローバル一時表 または QTEMP 中の表に対して行アクセス制御を活動化することはできません。

有効な行の許可が存在していて、行の許可の定義に指定された 権限 ID またはグループ・プロファイルにアクセス権を認めている場合を除いて、 デフォルトの行の許可が暗黙的に作成され、表のどの列へのアクセスも許可されません。 そのような行の許可がまだ存在していない状態で表を参照する照会では、 表内にデータがないことを示す警告が戻されます。

表に対するトリガーが存在 する場合、そのトリガーは SECURED 属性を指定して定義される 必要があり、READ トリガーであってはなりません。

ビューに関して、NOT SECURED 属性を指定して定義された INSTEAD OF トリガーが存在する場合、 そのビューの定義内で、この表を参照してはなりません。

この表がデータ操作ステートメントで参照されるとき、その表に対して作成されたすべての有効な行権限 (デフォルトの行権限を含む) が Db2 によって適用され、表の中でアクセス可能な行セットが制御されます。 活動化しようとするとエラーになる許可は、 許可定義にあるエラーがすべて解決されるまで活動化 できません。これには、 許可を除去し、変更した定義で再作成することが必要になることがあります。

マテリアライズ照会表が、行レベルのアクセス制御が活動化されている表に (直接的に、またはビューを介して間接的に) 依存しており、そのマテリアライズ照会表の行レベルのアクセス制御がまだ活動化されていない場合、 そのマテリアライズ照会表に対して行レベルのアクセス制御が暗黙的に 活動化されます。これにより、マテリアライズ照会表の内容への直接アクセスが制限されます。 行に対するそのような行権限が定義される前に表を照会で明示的に参照すると、表にデータがないことを示す警告が返されます。 マテリアライズ照会表にアクセスするには、適切な行権限を作成します。またはふさわしいようであれば、マテリアライズ照会表に対する ALTER TABLE DEACTIVATE ROW ACCESS CONTROL を発行して、行レベルの保護を除去します。

この表において行アクセス制御が既にアクティブとして定義されている場合、ACTIVATE ROW ACCESS CONTROL は無視されます。

表がシステム期間テンポラル表で、行アクセス制御が履歴表でまだアクティブでない場合、データベース・マネージャーは自動的に、履歴表での行アクセス制御をアクティブにし、履歴表に対してデフォルトの行権限を作成します。

DEACTIVATE ROW ACCESS CONTROL
表の行アクセス制御を非活動化することを指定します。この表がデータ操作ステートメントで参照されるとき、その表に対して定義された有効な行権限は Db2 によって適用されないため、表の中でアクセス可能な行セットは制御されません。

DEACTIVATE ROW ACCESS CONTROL は、行アクセス制御をこの表に対して活動化しないよう既に定義されている場合は、無視されます。

ACTIVATE COLUMN ACCESS CONTROL または DEACTIVATE COLUMN ACCESS CONTROL

有効な列マスク が、表から戻された列値をマスクするために Db2 によって 適用されるかどうかを指定します。

ACTIVATE COLUMN ACCESS CONTROL
表の列アクセス制御を活動化することを指定します。表が別名である場合は、基本表の列アクセス制御が活動化されます。

表に対するトリガーが存在 する場合、そのトリガーは SECURED 属性を指定して定義される 必要があり、READ トリガーであってはなりません。

ビューに関して、NOT SECURED 属性を指定して定義された INSTEAD OF トリガーが存在する場合、 そのビューの定義内で、この表を参照してはなりません。

表へのアクセスは制限されませんが、 この表がデータ操作ステートメントで参照されるときには、表に対して作成されたすべての有効な列マスク が Db2 によって適用されて、 照会の最終結果表で参照される列について戻される値のマスクや、 データ変更ステートメントで使用される新しい値の判別が行われます。 活動化しようとするとエラーになる列マスクは、 マスク定義にあるエラーがすべて解決されるまで活動化できません。これには、 列マスクを除去し、変更した定義で再作成することが必要になることがあります。

列レベルのアクセス制御が活動化中の表 に依存している (直接的に、またはビューを介して間接的に) マテリアライズ照会表があり、 そのマテリアライズ照会表では行レベルのアクセス制御がまだ活動化されていない場合、 そのマテリアライズ照会表に対して行レベルのアクセス制御が暗黙的に活動化されます。これにより、マテリアライズ照会表の内容への直接アクセスが制限されます。 行に対するそのような行権限が定義される前に表を照会で明示的に参照すると、表にデータがないことを示す警告が返されます。 マテリアライズ照会表にアクセスするには、適切な行権限を作成します。またはふさわしいようであれば、マテリアライズ照会表に対する ALTER TABLE DEACTIVATE ROW ACCESS CONTROL を発行して、行レベルの保護を除去します。

ACTIVATE COLUMN ACCESS CONTROL は、表に対して列アクセス制御を活動化するよう既に定義されている場合は無視されます。

表がシステム期間テンポラル表で、行アクセス制御が履歴表でまだアクティブでない場合、データベース・マネージャーは自動的に、履歴表での行アクセス制御をアクティブにし、履歴表に対してデフォルトの行権限を作成します。

DEACTIVATE COLUMN ACCESS CONTROL
表の列アクセス制御を非活動化することを指定します。表が データ操作ステートメント内で参照されるときに、表に対して定義されている有効な列マスク は Db2 によって適用されず、照会の最終結果表内で参照される列について戻される値が制御されたり、データ変更ステートメント で新しい値が使用可能かどうかが判別されることはありません。

DEACTIVATE COLUMN ACCESS CONTROL は、列アクセス制御をこの表に対して活動化しないよう既に定義されている場合は、無視されます。

VOLATILE または NOT VOLATILE

表名 のカーディナリティーを実行時に大きく変えることができるかをオプティマイザーに示します。揮発性は表の行数に適用され、表そのものに適用されるわけではありません。 デフォルトは NOT VOLATILE です。

VOLATILE
実行時に表名 のカーディナリティーを空から大規模に大きく変えることができることを指定します。 オプティマイザーは表にアクセスするとき、可能であれば通常は索引を使用します。
NOT VOLATILE
table-name のカーディナリティーが揮発性でないことを指定します。 この表を参照するアクセス・プランは、アクセス・プランが構築された時点の表のカーディナリティーに基づいたものになります。

media-preference

表またはパーティションの優先ストレージ・メディアを指定します。

UNIT ANY
どのストレージ・メディアも優先しません。使用可能なストレージ・メディアであればどのストレージ・メディアからでも表またはパーティションのストレージが割り振られます。表で UNIT ANY を指定すると、パーティションで指定する media-preference が使用されます。現時点で表またはパーティションがソリッド・ステート・ディスクのストレージに存在する場合に、他のメディアが使用可能な状態になっていれば、その表またはパーティションが非同期モードで他のメディアに移動することもあります。
UNIT SSD
ソリッド・ステート・ディスク・ストレージ・メディア を優先します。ソリッド・ステート・ディスクのストレージ・メディアが使用可能になっていれば、そのソリッド・ステート・ディスクのストレージ・メディアから表またはパーティションのストレージが割り振られます。 表で UNIT SSD を指定すると、パーティションで指定する media-preference は無視されます。現時点で表またはパーティションがソリッド・ステート・ディスクのストレージに存在しない場合に、ソリッド・ステート・ディスクのストレージ・メディアが使用可能な状態になっていれば、その表またはパーティションが非同期モードでソリッド・ステート・ディスクのストレージ・メディアに移動することもあります。

memory-preference

KEEP IN MEMORY
表のデータ が照会で使用されるときに、データを主記憶域プールに入れるかどうかを指定します。
NO
データは主記憶域プールに入れられません。
YES
データは主記憶域プールに入れられます。

列参照: ALTER TABLE ステートメントの ADD、ALTER、または DROP COLUMN 文節では、1 つの列を 1 回 だけ参照できます。 ただし、同じ ALTER TABLE ステートメント内で制約を追加またはドロップする場合は、同じ列を複数回参照できます。

操作の順序: ALTER TABLE ステートメント内での操作の順序は、次のとおりです。

  • 期間の除去
  • 制約の除去
  • マテリアライズ照会表の除去
  • パーティションの除去
  • パーティション化の除去
  • RESTRICT オプションが指定された列の除去
  • 他のすべての列定義の変更
    • CASCADE オプションが指定された列の除去
    • 列除去属性の変更 (例、DROP DEFAULT)
    • 列変更属性の変更
    • 列追加属性の変更
    • 列の追加
  • パーティションの変更
  • マテリアライズ照会表の追加または変更
  • パーティションまたはパーティション化の追加
  • 制約の追加
  • 期間の追加

上記の各段階内で、ユーザーが文節を指定する順序は、文節が実行される順序になります。ただし、これには例外が 1 つあります。 列のいずれかが除去される場合は、操作は列定義の追加または変更が行われ る前に論理的に実行されます。

QTEMP 考慮事項: ビューまたは別のジョブの QTEMP 内の論理ファイルが、変更される表に従属している場合は、それらはいずれも ALTER TABLE ステートメントの結果として除去されます。このようなオブジェクトの除去は、その変更がカーディナリティーの変更、メディア・プリファレンスの変更、メモリー・プリファレンスの変更、制約の追加または削除、行アクセス制御および列アクセス制御のアクティブ化または非アクティブ化である場合や、ACTIVATE NOT LOGGED INITIALLY が指定されている場合には行われません。

権限検査: 権限検査が実行されるのは、 変更中の表および ALTER TABLE ステートメント内で明示的に参照されるオブジェクト (例えば、 全選択で参照された表など) に対してのみです。 それ以外のオブジェクトには ALTER TABLE ステートメントでアクセスできますが、それらのオブジェクトに対する権限はまったく必要ありません。 例えば、除去される表に存在しているビューに対しても、除去される表を参照制約によって参照する従属表に対しても、権限はまったく必要ありません。

バックアップの推奨: 表を変更するにあたっては、あらかじめその表と従属ビュー、および論理ファイルの現行バックアップをとっておくことをぜひお勧めします。

パフォーマンスの考慮事項: 次のパフォーマンスに関する考慮事項は、表に対して列の追加、変更、または除去を行う際に ALTER TABLE ステートメントに適用されます。

  • 表内のデータはコピーできます。2

    列を追加および除去する場合は、データをコピーする必要があります。

    列を変更する場合は、通常、データをコピーする必要があります。 ただし、変更の内容が単に次のような場合は、データをコピーする必要はありません。

    • VARCHAR または VARBINARY 列の長さ属性が増やされる場合に、現行の長さ属性が 20 よりも大きい。
    • VARGRAPHIC 列の長さ属性が増やされる場合に、現行の長さ属性が 10 よりも大きい。
    • VARCHAR または VARBINARY 列の割り振られた長さが変更される場合に、現行および新規の割り振られた長さが共に 20 より小さいか同じである。
    • VARGRAPHIC 列の割り振られた長さが変更される場合に、現行および新規の割り振られた長さが共に 10 より小さいか同じである。
    • 列の CCSID が変更される場合に、古い CCSID と新規の CCSID との間で変換が不要である。 例えば、1 つの CCSID が 65535 である場合、データ変換は不要。
    • デフォルト値が変更される場合に、デフォルト値の長さが現行の割り振られた長さより大きくない。
    • DROP DEFAULT が指定されている。
    • DROP NOT NULL が指定されているのに、表の変更が完了した後も、少なくとも 1 つの NULL 可能列がその表の中に依然として存在している。

    フィールド・プロシージャーが定義されている列を変更するには、そのフィールド・プロシージャーを 2 回実行しなければならない場合があります。

  • 索引の再作成が必要になる可能性があります。3

    列が表に追加される場合や列が除去または変更されるときにそれらの列が索引キー内で参照されない場合は、索引を再作成する必要はありません。

    索引や制約のキー内で使用される列を変更する場合は、通常、その索引を再作成する必要があります。 ただし、次のような場合は、索引の再作成は不要です。

    • VARCHAR、VARBINARY、または VARGRAPHIC キーの長さ属性が増やされる場合。
    • 列の CCSID が変更される場合に、古い CCSID と新規の CCSID との間で変換が不要である。 例えば、1 つの CCSID が 65535 である場合。

生成列の追加: 既存の表に行変更タイム・スタンプ列、行開始列、 行終了列、トランザクション開始 ID 列、または生成式列を追加する場合は、変更操作の実行時に初期値が生成されます。

暗黙的に隠された列に対する考慮事項: 暗黙的に隠されたものとして定義された列は、ALTER ステートメントで明示的に参照できます。例えば、暗黙的に隠された列は、参照制約またはチェック制約の一部として、あるいはマテリアライズ照会表定義として指定できます。

マテリアライズ照会表の変更: 基本表が ALTER TABLE ステートメントによって最初にマテリアライズ照会表に変更されたときの分離レベルが、 マテリアライズ照会表の分離レベルになります。

ある表を照会最適化が使用可能なマテリアライズ照会表に変更すると、 その表を最適化で使用することが可能になります。 このため、表内のデータが正しいことを確認してください。 DATA INITIALLY IMMEDIATE 文節を使用して、表の変更時にデータをリフレッシュすることができます。

従属するビュー、索引、およびマテリアライズ照会表に対する ATTACH PARTITION の影響:
  • ソース表のビューと DDS 作成論理ファイルは除去されます。
  • ターゲット表を参照するビューに、新しいパーティションが含まれるようになりました。
  • アタッチの前にすべてのパーティションを参照していた DDS 作成論理ファイルに、新しいパーティションが含まれるようになりました。
  • ソース表のマテリアライズ照会表は除去されます。
  • ターゲット表のマテリアライズ照会表は保持されますが、新しいパーティションに関連付けられたデータを含むように、ユーザーがマテリアライズ照会表を更新する必要があります。
  • ターゲット表のパーティション化索引に対応する、ソース表のパーティション化 (複数のパーティションにわたらない) 索引は、 索引の論理ページ・サイズが同じである限り、ターゲット表のパーティション化索引の一部として保持されます。 論理ページ・サイズが異なる場合、そのパーティションの索引は除去されます。
  • ターゲット表のパーティション化索引に対応しない、ソース表のパーティション化 (複数のパーティションにわたらない) 索引は、除去されます。
  • ソース表の索引に対応しない、ターゲット表のパーティション化 (複数のパーティションにわたらない) 索引は、新しいパーティションを含むように変更されます。
  • ターゲット表の非パーティション化 (複数のパーティションにわたる) 索引は、新しいパーティションを含むように再作成されます。
従属するビュー、索引、およびマテリアライズ照会表に対する DETACH PARTITION の影響:
  • ソース表のビューに、デタッチされたパーティションは含まれなくなります。
  • デタッチの前にすべてのパーティションを参照していた DDS 作成論理ファイルは、残りのパーティションを含みます。
  • ソース表のマテリアライズ照会表は保持されますが、デタッチされたパーティションに関連付けられたデータを削除するように、ユーザーがマテリアライズ照会表を更新する必要があります。
  • ソース表のパーティション化 (複数のパーティションにわたらない) 索引は、デタッチされたパーティション索引を削除するように変更されます。
  • ソース表の非パーティション化 (複数のパーティションにわたる) 索引は、再作成されます。

行アクセス制御と列アクセス制御の使用に関する考慮事項:

明示的にアクティブ化される行アクセス制御: 表の行アクセス制御をアクティブにするために、ACTIVATE ROW ACCESS CONTROL 節が使用されます。 活動化されると、表のデフォルトの行の許可が暗黙的に作成され、表のどの行にもアクセスできなくなります。ただし、許可の定義で指定された許可 ID のアクセス権限を提供する別の行の許可が、後で使用可能になり、存在する場合を除きます。デフォルトの行の許可は、常に使用可能です。

表がデータ操作ステートメントで参照される場合、その表に作成されていたすべての使用可能な行の許可 (デフォルトの行の許可を含む) は、表のどの行をアクセス可能とするかを制御するために、Db2 によって暗黙的に適用されます。行アクセス制御検索条件は、使用可能なそれぞれの行の許可で検索条件に論理 OR 演算子を適用することによって派生されます。この派生された検索条件は、述部、グループ化、順序付けなどのユーザー指定の操作が処理される前に、表に対するフィルターとして動作します。この得られた検索条件は、権限定義で指定した許可 ID でこの表の特定の行にアクセスすることを許可します。 使用可能な行の許可を適用することによるフェッチ操作への影響の詳細については、副選択の説明を参照してください。使用可能な行の許可を適用することによるデータ変更操作への影響の詳細については、データ変更ステートメントを参照してください。

行アクセス制御は、DEACTIVATE ROW ACCESS CONTROL 文節を使用して行アクセス制御の実施を停止するまで実施されます。

表に対して行アクセス制御がアクティブになるときに作成される暗黙的な行の許可: ACTIVATE ROW ACCESS CONTROL 節を使用して表の行アクセス制御をアクティブにするとき、Db2 は表のデフォルトの行権限を暗黙的に作成します。 デフォルトの行の許可では、表に対するすべてのアクセスができなくなります。暗黙的に作成された行の許可は、基本表と同じスキーマ内にあり、名前は QIBM_DEFAULT_system-table-name_system_schema_name 形式です。

デフォルトの行権限は、常に使用可能になっています。

行アクセス制御が非活動化されるか、または表がドロップされると、デフォルトの行の許可はドロップされます。

列アクセス制御のアクティブ化: 表の列のアクセス制御をアクティブにするために、ACTIVATE COLUMN ACCESS CONTROL 節が使用されます。 表に対するアクセスは制限されませんが、データ操作ステートメントでこの表が参照される場合は、この表に対して作成されている使用可能なすべての列マスクが適用され、照会の最終結果表で参照される列値のマスクや、データ変更ステートメントで使用される新しい値の判別が行われます。

列マスクを使用して列値をマスクする場合、それらのマスクによって最終結果表の値が決まります。 列マスクがある列 (列名の単純参照であるか、式に組み込まれている) が最外部の選択リスト中に出現する場合、列に列マスクが適用されて最終結果表の値が生成されます。列が最外部の選択リスト中に出現しないものの、 最終結果表に関与する (例えば、ネストされた表式またはビュー内に出現する) 場合、最終結果表で使用できるように、ネストされた表式またはビューの結果表に戻される列に、列マスクが適用されます。

列マスクの適用は、ステートメント 内の他の節 (WHERE、GROUP BY、HAVING、SELECT DISTINCT、 および ORDER BY など) の操作に干渉しません。最終結果表に戻される行は同じままです。ただし、結果の行の値は、列マスクによってマスクされている場合があります。 そのため、マスクされた列が ORDER BY ソート・キーにも出現する場合、順序は元の列値に基づくものとなり、最終結果表でマスクされた値にその順序が反映されない可能性があります。 同様に、マスクされた値は、SELECT DISTINCT によって強制適用される固有性が反映されない可能性があります。 マスクされる列が式に組み込まれていると、列マスクは式の評価が行われる前に列に適用されるため、式の結果が異なる場合があります。 例えば、列 SSN に列マスクを適用すると、マスク値に対して DISTINCT 操作が行われるため、集約関数 COUNT(DISTINCT SSN) の結果が変わることがあります。一方、照会の式が、列マスク定義で列値のマスクに使用された式と同じである場合、照会の式の結果は変わらない可能性があります。例えば、照会の式が 'XXX-XX-' || SUBSTR( SSN, 8, 4) で、列マスク定義に同じ式が指定されているとします。この特定の例では、ユーザーは照会の式を列 SSN で置き換えて、同じ式が 2 回評価されるのを回避できます。

以下に、照会の結果の列値をマスクするために Db2 が列マスクを使用するコンテキストを示します。特定の制約事項が、いくつかのコンテキストに適用されることがあります。この制約事項は、分離リストで説明されています。
  • SELECT または SELECT INTO ステートメントの最外部 SELECT 節。あるいは、列が最外部の選択リスト内に出現しないものの最終結果表に関与する場合 は、対応するネストされた表式、共通表式、または列が出現するビューの最外部 SELECT 節。
  • INSERT、UPDATE、または MERGE ステートメントの新しい値を導き出すために使用される最外部 SELECT 節。
  • 上記ステートメントの最外部 SELECT 節の中、 SET 変数割り当てステートメントの右辺、VALUES INTO ステートメントの右辺、または VALUES ステートメントの右辺に出現する、スカラー全選択式。
列マスクは作成されますが、これが使用される可能性があるコンテキストのすべてが認識されるわけではありません。最終結果表内の列値をマスクするために、列マスク定義は Db2 によってステートメントにマージされます。列マスク定義は、ステートメントのコンテキストに取り込まれると、ステートメント内の特定の SQL セマンティクスと競合することがあります。したがって、状態によっては、ステートメントと列マスクの適用とを組み合わせることによりエラーが戻されることがあります。 以下に、エラーが戻される可能性のある状態を説明します。
  • 副選択の FROM 文節で再帰的共通表式を参照し、最終結果表の派生に再帰的共通表式の結果を使用する場合、列マスクは、再帰的共通表式の全選択で参照される列には適用できません。
  • ユーザー定義関数が NOT SECURED オプションで定義されている場合、この関数の引数は、列マスクが使用可能にされ、かつその表の列アクセス制御が活動化される列を参照していてはなりません。この規則は、ステートメントの任意の場所で参照されるユーザー定義関数に適用されます。
上記のエラー状態を回避するには、以下のいずれかのアクションを行う必要があります。
  • ステートメントの上記コンテキストを変更するか、ステートメントから削除する
  • 列マスクを使用不可にする
  • 列マスクをドロップし、定義を変更して、列マスクを再作成する
  • 表の列アクセス制御を非活動化する
状況によっては、ステートメントに SELECT DISTINCT または GROUP BY が 含まれていて、SELECT DISTINCT または GROUP BY の結果を直接または間接に導出する列 に列マスクが適用される場合、ステートメントが戻す結果が一定でないことがあります。 該当するのは、以下のような状況です。
  • 列マスク定義が、列マスクが適用される先の列と同じ表にある他の列を参照している。
  • 列が組み込みスカラー関数 (COALESCE、IFNULL、NULLIF、MAX、MIN、LOCATE など) の引数で参照されている。
  • 列が集約関数の引数で参照されている。
  • 列が式に組み込まれ、その式に非 deterministic 関数かまたは外部アクションのある関数が含まれている。

列が NULL 可能ではない場合、おそらく、列の列マスクの定義で列の NULL 値は考慮されません。外部結合の NULL 埋め込み表の場合、表の列アクセス制御がアクティブにされた後で、最終結果表の列値が NULL になる可能性があります。列マスクにより NULL 値をマスクできることを確実にするため、Db2 では、外部結合の NULL 埋め込み表の場合には列マスク定義に 1 番目の WHEN 文節として WHEN target-column IS NULL THEN NULL が追加されます。これにより、NULL 値が常に NULL 値として強制的にマスクされます。NULL 可能列の場合、これにより、NULL 値を他の値としてマスクすることができなくなります。例 4 に、この追加される WHEN 文節を示します。

INSERT、UPDATE、および MERGE では、新しい行の値を導出するときに列が参照されている場合に、その列に対して有効な列マスクがあれば、マスクされた値が新しい値を導出するために使用されます。オブジェクト表でも列アクセス制御がアクティブになっている場合、 新しい値を導出するために適用される列マスク は、定数や式ではなく、列自体を戻す必要があります。列マスクを列に適用した結果が列自体にならない 場合、新しい値を挿入または更新に使用できず、エラー が戻されます。新規の値を派生させるために列マスクの適用に使用される規則は、照会の最終結果表について前述したのと同じ規則に従います。挿入可能性と更新可能性に影響する列マスクの使用方法については、データ変更ステートメントを参照してください。

列マスクを適用できるのは、基本表の列のみです。ビュー、ネストされた表式、または共通表式の列が最終結果表に関係する場合、上記のエラー状態が、関係するビュー、ネストされた表式、または共通表式の内部で発生する可能性があります。

列アクセス制御は、XMLTABLE 組み込み関数には影響を与えません。XMLTABLE 関数の入力が、列マスクのある列の場合、列マスクは適用されません。

列アクセス制御は、DEACTIVATE COLUMN ACCESS CONTROL 文節を使用して列アクセス制御の実施を停止するまで実施されます。

列マスクとトリガー遷移変数: OLD ROW および OLD TABLE 遷移変数 の値に、マスクされた値が含まれることはありません。

SET 遷移変数 割り当てステートメント は、マスクされたデータを変数に割り当てることができます。列に違反チェック制約 が存在しない場合、マスクされたデータが列で挿入または更新され、エラーは発行されません。

行または列のアクセス制御の強制適用の停止: 表の行アクセス制御の強制適用を停止するために、DEACTIVATE ROW ACCESS CONTROL 節が使用されます。デフォルトの行の許可はドロップされます。停止された後は、データ操作ステートメントで表が参照される場合、明示的に作成された行の許可は適用されません。この表は、付与された特権に基づいてアクセスできます。

DEACTIVATE COLUMN ACCESS CONTROL 文節は、表の列アクセス制御の実施を停止する場合に使用します。停止された後は、データ操作ステートメントで表が参照される場合、列マスクは適用されません。最終結果表には、マスクされない列値が使用されます。明示的に作成された行の許可または列マスク (ある場合) は、そのままですが有効ではありません。

行と列のアクセス制御のセキュア・トリガー: データベース保全性のためにトリガーが使用されます。そのため、行と列のアクセス制御 (セキュリティー) とデータベース保全性の間でバランスが必要です。有効な 行の許可および列マスクは、遷移変数および遷移表の初期値には適用されません。トリガー表に適用される行アクセス制御と列アクセス制御も、 トリガー本体内で参照されている遷移変数または遷移表に対しては無視されます。トリガー・アクションの SQL ステートメントが遷移変数と遷移表に含まれる 機密データにアクセスするときのセキュリティー上の心配をなくすため、トリガーは SECURED オプションを指定して 作成または変更する必要があります。トリガーがセキュアでない場合、トリガー表に対して行および列のアクセス制御を実施することはできません。

行と列のアクセス制御におけるセキュアなユーザー定義関数: 行権限または列マスクの定義でユーザー定義関数を参照する場合、機密データが引数として関数に渡される可能性があるため、その関数は SECURED オプションを指定して変更する必要があります。

Db2 は SECURED オプションを、ユーザー定義関数に対するすべての変更の変更制御監査手順をユーザーが確立したことを宣言するアサーションと見なします。また、このような制御監査手順はユーザー定義関数のすべてのバージョンに適していると想定し、また後続のすべての ALTER FUNCTION ステートメント、または外部プログラムに対する変更は監査プロセスで確認されると想定します。

行と列のアクセス制御が適用されないデータベース操作: 行と列のアクセス制御を使用するためにデータベース保全性を犠牲にすることがないようにしてください。 主キー、ユニーク・キー、索引、チェック制約、および参照整合性に関係する列は、行と列のアクセス制御が適用されないようにする必要があります。 こういった列に対して列マスクを定義することはできますが、 それらの列マスクは、キー作成プロセス中、または、制約または RI の強制適用プロセス中には適用されません。

システム期間テンポラル表の定義: システム期間テンポラル表の定義には、以下の事柄が含まれます。
  • SYSTEM_TIME という名前のシステム期間。これは、行開始列と行終了列を使用して定義されます。 AS ROW BEGINAS ROW END、 および ADD PERIOD FOR period-definitionを参照してください。
  • トランザクション開始 ID 列。AS TRANSACTION START ID を参照してください。
  • システム期間データ・バージョン管理定義。これは、関連した履歴表の名前が含まれる ADD VERSIONING アクションを使用する、後続の ALTER TABLE ステートメントで指定されます。ADD VERSIONING USE HISTORY TABLE history-table-name を参照してください。
トランザクション開始 ID 列に関する考慮事項: トランザクション開始 ID 列で NULL 値が許可され、行開始列が存在し、その行開始列の値が他のトランザクションで生成された行開始列の値とは異なる固有の値になっている場合、トランザクション開始 ID 列には NULL 値が含まれます。列に NULL 値が含まれる可能性があるため、その列から値を取り出すときには、以下のいずれかの方式を使用することをお勧めします。
  • COALESCE ( transaction_start_id_col, row_begin_col)
  • CASE WHEN transaction_start_id_col IS NOT NULL THEN transaction_start_id_col ELSE row_begin_col END
システム期間テンポラル表と、行および列のアクセス制御に関する考慮事項: 行および列のアクセス制御は、システム期間テンポラル表と、関連する履歴表の両方に定義できます。
  • システム期間テンポラル表へのアクセス時、システム期間テンポラル表に定義された行および列のアクセス規則は、行がシステム期間テンポラル表に格納されているか履歴表に格納されているかに関係なく、システム期間テンポラル表から戻される行のすべてに適用されます。履歴表に定義された行および列のアクセス規則は、適用されません。
  • 履歴表に直接アクセスする際は、履歴表に定義された行および列のアクセス規則が適用されます。
システム期間テンポラル表が定義されていて、システム期間テンポラル表の行アクセス制御または列アクセス制御がアクティブであり、履歴表の行アクセス制御がまだアクティブでない場合、データベース・マネージャーは自動的に、履歴表での行アクセス制御をアクティブにし、履歴表に対してデフォルトの行権限を作成します。

履歴表の管理: 許可ユーザーの場合、履歴表に限定的な変更を直接行うことができます。 表からの行の削除、パーティションの追加および除去を行えます。

読み取り専用カーソルおよび読み取り専用ビュー: 読み取り専用 カーソルまたは読み取り専用ビューを判別するために使用されるルールは、 行アクセス制御および列アクセス制御の影響を受けません。使用可能な列マスクの適用の影響は、実行時まで不明です。したがって、書き込み可能カーソルまたは書き込み可能ビューに対するデータ変更操作は、実行時に依然として失敗することがあります。

代替構文: 以下の構文は、旧リリースとの互換性を維持するためにサポートされています。 この構文は標準構文ではないので、使用しないようにしてください。

  • INLINE LENGTH は ALLOCATE の同義語です。
  • ADD 制約が ALTER TABLE ステートメントの最初の文節である場合は、 ADD キーワードは任意指定ですが、指定することを強くお勧めします。 それ以外の場合は、ADD キーワードは必須です。
  • 参照制約内の FOREIGN KEY キーワードの後に制約名 (CONSTRAINT キーワードなし) を指定することもできます。
  • PART は PARTITION の同義語です。
  • PARTITION パーティション名 の代わりに、 PARTITION パーティション番号 を指定できます。 パーティション番号で、 表の既存のパーティションまたは ALTER TABLE ステートメントで以前に指定したパーティションを識別することはできません。

    partition-number を指定しない場合は、データベース・マネージャーによって固有のパーティション番号が生成されます。

  • VALUES は ENDING AT の同義語です。
  • SET MATERIALIZED QUERY AS DEFINITION ONLY は DROP MATERIALIZED QUERY の同義語です。
  • SET SUMMARY AS DEFINITION ONLY は DROP MATERIALIZED QUERY の同義語です。
  • SET MATERIALIZED QUERY AS (選択ステートメント) は、ADD MATERIALIZED QUERY (選択ステートメント) の同義語です。
  • SET SUMMARY AS (選択ステートメント) は、ADD MATERIALIZED QUERY (選択ステートメント) の同義語です。

カスケード効果

列を追加しても、SQL ビュー、マテリアライズ照会表、または大部分の論理ファイルに対するカスケード効果はありません。例えば、表に列を追加しても、従属するビューに列は追加されません (これらのビューが SELECT * 文節を指定して作成された場合でも)。

列を追加しても、その新しい列を組み込むために SQL トリガーが再作成されることはありません。

列を除去または変更した場合は、数種類のカスケード効果が生じる可能性があります。 表 1 に列を除去した場合のカスケード効果を示します。

表 1. 列の除去によるカスケード効果
操作 RESTRICT 効果 CASCADE 効果
ビューによって参照した列の除去 列の除去は許されません。 ビューおよびそのビューに従属しているビューすべてが除去されます。
非ビュー論理ファイルで参照する列の除去 この除去は可能で、次の場合に列が論理ファイルから除去されます。
  • 論理ファイルが、変更しようとしているファイルと形式を共用する。また、
  • 除去された列が、キー・フィールドとして使用されなかったり、選択/省略仕様で使用されない。また、
  • 形式が、論理ファイルにおいて別のベースオン・ファイルで再使用されない。
それ以外の場合は、列の除去は許されません。
この除去は可能で、次の場合に列が論理ファイルから除去されます。
  • 論理ファイルが、変更しようとしているファイルと形式を共用する。また、
  • 除去された列が、キー・フィールドとして使用されなかったり、選択仕様や省略仕様で使用されない。また、
  • 形式が、論理ファイルにおいて別のベースオン・ファイルで再使用されない。
それ以外の場合、論理ファイルは除去されます。
変更の始まり索引でキーの一部として、WHERE 節で、INCLUDE 節で、あるいは、列の ADD 節で明示的または暗黙的な列として参照された列の除去変更の終わり 索引の除去は不可能です。 索引は除去されます。
キーが存在する物理ファイルのキーで参照されている列の削除 (キーが主キーではない場合) その物理ファイルは、キーが存在しない物理ファイルに変更されます。 その物理ファイルは、キーが存在しない物理ファイルに変更されます。
固有制約の中で参照した列の除去 固有制約の中で参照した列がすべて同じ ALTER COLUMN ステートメントで除去され、しかもその固有制約が参照制約によって参照されていない場合は、それらの列および制約は除去されます。(したがって、この制約を満たすために使用された索引もすべて除去されます。) 例えば、列 A が除去され、固有制約 UNIQUE(A) または PRIMARY KEY(A) が存在し、この固有制約を参照する参照制約がない場合は、この操作が許されます。

それ以外の場合は、列の除去は許されません。

固有制約は、その固有制約を参照する参照制約と同じように、除去されます。 (したがって、それらの制約によって使用された索引もすべて除去されます。)
参照制約の中で参照した列の除去 参照制約の中で参照した列がすべて同時に除去される場合は、それらの列および制約は除去されます。 (したがって、外部キーによって使用された索引も除去されます。) 例えば、列 B が削除され、参照制約 FOREIGN KEY (A) が存在する場合は、この操作が許されます。

それ以外の場合は、列の除去は許されません。

参照制約は除去されます。(したがって、外部キーによって使用された索引も除去されます。)
SQL トリガーの中で参照した列の除去 列の除去は許されません。 SQL トリガーは除去されます。
MQT の中で参照した列の除去 列の除去は許されません。 MQT は除去されます。

表 2 に列の変更によるカスケード効果をリストしてあります。 (次の表で列の変更という場合は、データ・タイプ、精度、位取り、長さ、または NULL 可能性特性の変更を意味します。)

表 2. 列の変更によるカスケード効果
操作 効果
ビューによって参照した列の変更 変更が許されます。

表に従属しているビューが再作成されます。ビューの再作成時には、新しい列属性が使用されます。

非ビュー論理ファイルで参照する列の変更 変更が許されます。

表に従属している非ビュー論理ファイルが再作成されます。 論理ファイルが、変更しようとしているファイルと形式を共用する場合、および、形式が論理ファイルにおいて別のベースオン・ファイルで再使用されない場合は、論理ファイルの再作成時に新規の列属性が使用されます。

それ以外の場合は、論理ファイルの再作成時に新規の列属性は使用されません。 代わりに、現行の論理ファイル属性が使用されます。

索引のキーで参照される列の変更 変更が許されます。(したがって、通常、索引は再作成されます。)
固有制約の中で参照した列の変更 変更が許されます。(したがって、通常、索引は再作成されます。)

ユニーク制約が参照制約によって参照されている場合は、外部キーの属性がそのユニーク制約の属性 (フィールド・プロシージャーを含む) と一致しなくなります。その制約は定義済み検査保留状態に置かれます。

参照制約の中で参照した列の変更 変更が許されます。
  • 参照制約が定義済み検査保留状態にある場合は、変更が許され、その制約を使用可能状態に置く試みがなされます。 (したがって、通常、固有制約を満たすために使用した索引は再作成されます。)
  • 参照制約が使用可能状態にある場合は、その制約は定義済み検査保留状態に置かれます。
SQL トリガーの中で参照した列の変更 トリガーは再作成されます。
MQT の中で参照した列の変更 MQT が再作成されて新規属性が組み込まれます。

例 1: 1 文字の長さの RATING という名前の新しい列を、DEPARTMENT 表に追加します。

  ALTER TABLE DEPARTMENT
    ADD RATING CHAR

例 2: PICTURE_THUMBNAIL という名前の新しい列を EMPLOYEE 表に追加します。 PICTURE_THUMBNAIL を最大 1K 文字の長さの BLOB 列として作成します。

  ALTER TABLE EMPLOYEE
    ADD PICTURE_THUMBNAIL  BLOB(1K)

例 3: 次の列を持つ新たな表 EQUIPMENT が作成されていると想定します。

  EQUIP_NO
INT
  EQUIP_DESC
VARCHAR(50)
  LOCATION
VARCHAR(50)
  EQUIP_OWNER
CHAR(3)

表 EQUIPMENT に参照制約を追加して、所有者 (EQUIP_OWNER) が、表 DEPARTMENT に存在する部門番号 (DEPTNO) でなければならないようにします。ある部門が表 DEPARTMENT から除去された場合は、その部門が所有していた備品すべての所有者 (EQUIP_OWNER) の値は、所有者未定 (または NULL) に設定される必要があります。制約に、名前 DEPTQUIP を指定しています。

  ALTER TABLE EQUIPMENT
    FOREIGN KEY DEPTQUIP (EQUIP_OWNER)
      REFERENCES DEPARTMENT
      ON DELETE SET NULL

列 EQUIP_OWNER のデフォルト値を 'ABC' に変更します。

   ALTER TABLE EQUIPMENT
     ALTER COLUMN EQUIP_OWNER
     SET DEFAULT 'ABC'

列 LOCATION を除去します。ビュー、索引、または制約がその列に対して構築されている場合は、それらもすべて除去します。

   ALTER TABLE EQUIPMENT
     DROP COLUMN LOCATION CASCADE

SUPPLIER と呼ばれる新しい列が追加され、LOCATION と呼ばれる既存の列が除去され、新しい列 SUPPLIER に対する固有制約が追加され、基本キーが既存の列 EQUIP_NO に対して構築されるように、表を変更します。

   ALTER TABLE EQUIPMENT
     ADD COLUMN SUPPLIER INT
     DROP COLUMN LOCATION
     ADD UNIQUE SUPPLIER
     ADD PRIMARY KEY EQUIP_NO

列 EQUIP_DESC が可変長列であることに注意してください。25 という長さが割り振られている場合、次の ALTER TABLE ステートメントはその割り振られた長さを変更しません。

   ALTER TABLE EQUIPMENT
     ALTER COLUMN EQUIP_DESC
     SET DATA TYPE VARCHAR(60)

例 4: EMPLOYEE 表を変更します。各従業員の給与と歩合の合計が $30,000 を超えていなければならない、 という定義済みの REVENUE という名前の表検査制約を追加します。

  ALTER TABLE EMPLOYEE
    ADD CONSTRAINT REVENUE 
    CHECK (SALARY + COMM > 30000)

例 5: EMPLOYEE 表を変更します。前に定義した制約 REVENUE を除去します。

  ALTER TABLE EMPLOYEE
    DROP CONSTRAINT REVENUE 

例 6: EMPLOYEE 表を変更します。 列 PHONENO を変更して、電話番号として最大 20 文字まで受け入れます。

  ALTER TABLE EMPLOYEE
    ALTER COLUMN PHONENO SET DATA TYPE VARCHAR (20)

例 7: 基本表 TRANSCOUNT をマテリアライズ照会表に変更します。 選択ステートメント の結果は、 既存の表内の列と一致する列のセット (同じ列数および互換性のある属性) を提供する必要があります。

  ALTER TABLE TRANSCOUNT
    ADD MATERIALIZED QUERY
    (SELECT  ACCTID, LOCID, YEAR, COUNT(*) AS CNT
       FROM TRANS
       GROUP BY ACCTID, LOCID, YEAR )
    DATA INITIALLY DEFERRED
    REFRESH DEFERRED
    MAINTAINED BY USER 

例 8: バージョン管理を可能にするように CUSTOMER 表を変更します。

まず、バージョン管理に必要な列と期間定義を、行変更の ID 追跡に使用される 2 つの列とともに追加します。
ALTER TABLE CUSTOMER 
  ADD COLUMN SYSTEM_START TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN 
  ADD COLUMN SYSTEM_END TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END 
  ADD COLUMN TRANSACTION_ID TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID 
  ADD COLUMN AUDIT_TYPE_CHANGE CHAR(1) GENERATED ALWAYS AS (DATA CHANGE OPERATION) 
  ADD COLUMN AUDIT_USER VARCHAR(128) GENERATED ALWAYS AS (SESSION_USER) 
  ADD PERIOD FOR SYSTEM_TIME (SYSTEM_START, SYSTEM_END); 
次に、履歴表を作成します。
CREATE TABLE CUSTOMER_HISTORY LIKE CUSTOMER;
最後に、表のバージョン管理関係を定義します。
ALTER TABLE CUSTOMER ADD VERSIONING USE HISTORY TABLE CUSTOMER_HISTORY 
                         ON DELETE ADD EXTRA ROW;

列アクセス制御の例

例 1: SELECT DISTINCT ステートメントは、CUSTOMER 表にあるデータに基づいて、SALARY 値が 100,000 の行を 1 つ戻します。SALARY 値をマスクするために、列マスク SALARY_MASK が作成されます。CUSTOMER 表の列アクセス制御が活動化されると、SALARY 列に列マスクが適用されます。「MGR」権限 ID を 持つユーザーが SELECT DISTINCT ステートメントを発行します。SELECT DISTINCT ステートメントは、重複の除去は SALARY 列のマスクされない値に基づいているため、依然として 1 つの行を戻しますが、その行で戻される値は、マスクされた SALARY 値 (125,000 か 110,000 のいずれか) に基づきます。

CUSTOMER 表は、以下のようになっています。
SALARY COMMISSION EMPID
100,000 25,000 123456
100,000 10,000 654321
CREATE MASK SALARY_MASK ON CUSTOMER
   FOR COLUMN SALARY RETURN
      CASE WHEN(SESSION_USER = 'MGR')
              THEN SALARY + COMMISSION
           ELSE SALARY
      END
   ENABLE;

COMMIT;

ALTER TABLE CUSTOMER
   ACTIVATE COLUMN ACCESS CONTROL;

COMMIT;

SELECT DISTINCT SALARY FROM CUSTOMER;

例 2: SELECT DISTINCT ステートメントは、T1 表および T2 表のデータに基づき、COALESCE 関数を使用して T1.C1 値が 1 の 1 つの行を戻します。T1.C1 の値をマスクするために列マスク C1_MASK が作成されます。 表 T1 の列アクセス制御が活動化されると、表 T1 の列 C1 に列マスクが適用されます。「EMP」権限 ID を 持つユーザーが SELECT DISTINCT ステートメントを発行します。SELECT DISTINCT ステートメントは、重複の除去は COALESCE 関数からの T1.C1 のマスクされない値に基づいているため、依然として 1 つの行を戻しますが、この行で戻される値は、COALESCE 関数からの T1.C1 のマスクされた値に基づきます。戻される値は、2 または 3 のいずれかです。

INSERT INTO T1(C1) VALUES(1);
INSERT INTO T1(C1) VALUES(1);

INSERT INTO T2(C1) VALUES(2);
INSERT INTO T2(C1) VALUES(3);

CREATE MASK C1_MASK ON T1
   FOR COLUMN C1 RETURN
      CASE WHEN(SESSION_USER = 'EMP')
         THEN NULL
         ELSE C1
      END
   ENABLE;

COMMIT;

ALTER TABLE T1
   ACTIVATE COLUMN ACCESS CONTROL;

COMMIT;

SELECT DISTINCT COALESCE(T1.C1, T2.C1) FROM T1, T2;

例 3: CUSTOMER 表のデータに基づくと、カリフォルニア (CA) とイリノイ (IL) 州の最大収入は同じで、50,000 です。このため、SELECT DISTINCT ステートメントは 1 つの行を戻します。収入値をマスクするために列マスク INCOME_MASK が作成されます。CUSTOMER 表の列アクセス制御が活動化されると、INCOME 列に列マスクが適用され、MAX 集約関数が評価されます。ただし、列マスク INCOME_MASK は、イリノイ州では収入値 0 を 100,000 としてマスクします。このため、イリノイ州では最大収入は 100,000 になりますが、カリフォルニア州の最大収入は 50,000 のままです。SELECT DISTINCT ステートメントの述部で X.B が使用されています。このため、MAX(INCOME) 関数のオリジナルの INCOME 値とオリジナルの結果を保存しておく必要があります。したがって、SELECT DISTINCT ステートメントは依然として 1 つの行を戻しますが、この行の値は deterministic でない場合があります。つまり、この値は 'CA' 行からの 50,000、または 'IL' 行からの 100,000 である場合があります。

CUSTOMER 表は、以下のようになっています。

STATE INCOME
CA 40,000
CA 50,000
IL 0
IL 10,000
IL 50,000
CREATE MASK INCOME_MASK ON CUSTOMER
   FOR COLUMN INCOME RETURN
      CASE WHEN(INCOME = 0)
         THEN 100000
         ELSE INCOME
      END
   ENABLE;

COMMIT;

ALTER TABLE CUSTOMER
   ACTIVATE COLUMN ACCESS CONTROL;

COMMIT;

SELECT DISTINCT B FROM
   (SELECT STATE, MAX(INCOME) FROM CUSTOMER
      GROUP BY STATE)
      X(A, B)
   WHERE B > 10000;

例 4: 式 INCOME + RAND() は、RAND 関数が非 deterministic 関数であるため、非 deterministic です。SELECT DISTINCT ステートメントは、CUSTOMER 表のデータに基づいて 2 つの特殊行を戻す可能性が高くなります。しかし、1 つの行のみを戻すことがあります。収入値をマスクするために列マスク INCOME_MASK が作成されます。CUSTOMER 表の列アクセス制御が活動化されると、INCOME 列に列マスクが適用されます。これによって、両方の行のマスク値が同じになります。RAND 関数は非 deterministic 関数であるため、SELECT DISTINCT ステートメントは、依然として 2 つの特殊行を戻す可能性が高いですが、1 行のみを戻すことがあります。RAND 関数によって生じた不確実性によって SELECT DISTINCT ステートメントの結果が非 deterministic になります。

CUSTOMER 表は、以下のようになっています。

STATE INCOME
CA 40,000
CA 50,000
CREATE MASK INCOME_MASK ON CUSTOMER
   FOR COLUMN INCOME RETURN
      CASE WHEN(INCOME = 40,000)
         THEN 50000
         ELSE INCOME
      END
   ENABLE;

COMMIT;

ALTER TABLE CUSTOMER
   ACTIVATE COLUMN ACCESS CONTROL;

COMMIT;

SELECT DISTINCT A FROM
   (SELECT INCOME + RAND() FROM CUSTOMER)
      X(A)
   WHERE A > 10000;

例 5: 市が SJ、SFO、または OKLD の場合に州と市の名前を示す値を戻すために、CUSTOMER 表の STATE 列に対して列マスク STATE_MASK が作成されます。これ以外の場合、市は戻されず、州のみが戻されます。CUSTOMER 表の列アクセス制御が活動化されると、STATE 列を使用して結果をグループ化する SELECT ステートメントが発行されます。ただし、列マスク STATE_MASK で参照される CITY 列はグループ化列でないため、列マスク STATE_MASK がこのステートメントには適切でないことを示すエラーが戻されます。

CUSTOMER 表は、以下のようになっています。

STATE CITY INCOME
CA SJ 40,000
CA SC 30,000
CA SB 60,000
CA SFO 80,000
CA OKLD 50,000
CA SJ 70,000
NY NY 50,000
CREATE MASK STATE_MASK ON CUSTOMER
   FOR COLUMN STATE RETURN
      CASE WHEN(CITY = 'SJ')
          THEN CITY||', '||STATE
        WHEN(CITY = 'SFO')
          THEN CITY||', '||STATE
        WHEN(CITY = 'OKLD')
          THEN CITY||', '||STATE
        ELSE STATE
      END
   ENABLE;

COMMIT;

ALTER TABLE CUSTOMER
   ACTIVATE COLUMN ACCESS CONTROL;

COMMIT;

SELECT STATE, AVG(INCOME) FROM CUSTOMER
   GROUP BY STATE
   HAVING STATE = 'CA';

1 トリガーは、UPDATE OF 列リストまたはトリガー・アクション内の任意の場所で参照されている場合、 列に従属します。
2 記憶域が不足していて完全なコピーを作成できない場合は、必要なフリー・ストレージが約 16 ~ 32 メガバイトだけで済むという特殊コピーが実行されます。
3 再作成が必要な索引は、すべて、データベース・サーバー・ジョブによって非同期で再作成されます。
4 列を物理ファイルに追加する場合、列は、その物理ファイルの形式を共用する論理ファイルにも追加されます (ただし、その形式がその論理ファイルにおいて別の基準ファイルで再使用されない場合に限ります)。