# CHAPTER 4: データ定義言語

## 4.1 はじめに

The データ定義言語(DDL)コマンドはデータベースの構造を取り扱う コマンドです。利用可能なDDLコマンドの要約を以下に示します。

Table 4-1: データ定義言語コマンド

コマンド | 概要
`CREATE TABLE` | テーブル名、およびフィールドの各々の名前およびデータタイプを含むテーブル を作成します。
`DROP TABLE` | 既存のテーブルを削除します。
`ALTER TABLE` | レコードをダンプおよび再ロードせずに既存のテーブルの構造を変更します。 またテーブルのチェックサムを変更したり、レプリケーションのテーブルタイプを 定義したり、トリガを有効にしたり無効にしたりすることを含みます。
`RENAME` | テーブルまたはフィールドの名前を変更します。
`DISPLAY TABLE` | テーブルの構造を表示します。
`CREATE INDEX` | フィールドの検索を援助するメカニズムをセットアップします。
`DROP INDEX` | フィールド上のインデックスを削除します。
`CREATE RANGE CHECK` | フィールドのデータ確認検査をセットアップします。
`DROP RANGE CHECK` | フィールドのデータ確認検査を削除します。
`CREATE REFERENTIAL` | フィールドのデータに参照制約をセットアップします。
`DROP REFERENTIAL` | フィールドからデータの参照制約を削除します。
`CREATE VIEW` | 1つ以上のテーブルのフィールドから論理的なテーブルを作成します。
`DROP VIEW` | 論理的なテーブルを削除します。
`CREATE COMMENT` | テーブル、フィールド、モジュールあるいはトリガにコメントを付けます。
`DROP COMMENT` | テーブル、フィールド、モジュールあるいはトリガに関するコメントを削除します。
`DISPLAY PRIVILEGE` | テーブルのためのアクセス権を表示します。
`DISPLAY GRANT PRIVILEGE` | テーブルに対する特権許可オプションを表示します。
`GRANT PRIVILEGE` | テーブルまたはフィールドのアクセス権を変更します。
`REVOKE PRIVILEGE` | テーブルまたはフィールドのアクセス権を削除します。
`LOCK LEVEL` | テーブル上でロックするレベルをセットします。
`CREATE MODULE` | データディクショナリーへパーシスタント・ストアド・モジュールの定義を 作成します。
`UPDATE MODULE` | パーシスタント・ストアド・モジュール定義をモジュールシェアードライブラリ とリンクします。
`DROP MODULE` | データディクショナリーからパーシスタント・ストアド・モジュール定義を 取り除きます。
`DISPLAY MODULE` | パーシスタント・ストアド・モジュール定義を表示します。
`CREATE TRIGGER` | データディクショナリーへトリガをセットアップします。
`DROP TRIGGER` | データディクショナリーからトリガを取り除きます。
`DISPLAY DATABASE` | データベース中のテーブルを表示します。

## 4.2 CREATE TABLE

CREATE TABLEコマンドはデータベースの中にテーブルを作成します。それは テーブル名を指定し、そのフィールド名を指定し、データタイプの各属性の指定および テーブルの配置位置を含んでいます。もし指定されなければ、オプションは合理的な 初期値が与えられます。

Syntax 1

      CREATE [TABLE] table [|   (item {, item} [,constr {,constr}]) |]
                            |SET item {, item} [,constr {,constr}]  |

                                             [LOCATE [IN] location];

Syntax 2

         CREATE [TABLE] table [LOCATE [IN] location][FROM file];

  説明

  `item` | `attr [data_type [(param {,param})] [[NOT] NULL] [attr_constr]]`
  1. `constr` | プライムキーと外部キー制約条件です。次のうちの1つです。
         PRIMARY KEY [key_name] [ON] (attr {, attr}) [| BTREE      |]
                                                      | TIMESERIES |
  2.     FOREIGN KEY [key_name] [ON] (attr {, attr}) [| BTREE      |]
                                                      | TIMESERIES |
                      REFERENCES table (attr {, attr})
  `location` | 既存のディレクトリー名を指定します。ディレクトリー用の任意の有効な システムパスネームです。全てのファイルが指定されることを推奨します。 位置の指定にキーワードあるいは空のストリング("")で 指定された場合、テーブルは現在のデータベースディレクトリーに作成されます。
  `data_type` | table 4-2にリストされたうちの1つで、パラメータは括弧で囲まれます。 `data_type`が指定されない場合は`INTEGER`になります。
  1. `attr_const` | プライムキーと外部キー制約条件です。次のうちの1つです。
           PRIMARY KEY  [key_name] [|BTREE      |]
                                    |TIMESERIES |
  2.       FOREIGN KEY [key_name] [|BTREE      |] REFERENCES table (attr {, attr})
                                   |TIMESERIES |

  Table 4-2: データタイプパラメータと省略値

  データタイプ | パラメータ | 省略値
  `CHAR` | `(長さ, タイプ)` | (25,1)
  `BULK` | `(表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数)` | (20,20,20,1)
  `TEXT` | `(表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数)` | (20,20,20,1)
  `DATE` | `(フォーマットタイプ)` | (0)
  `TIME` | `(フォーマットタイプ)` | (0)
  `MICROTIMESTAMP` | `(フォーマットタイプ)` | (0)
  `DECIMAL` | `(最大の数, 小数位の数)` | (1,0)
  `DOLLAR` | `(最大のドル数字, フォーマットタイプ)` | (4,1)
  `REAL` | `(精度)` | (n) *
  `FLOAT` | N/A | N/A
  `LONGFLOAT` | N/A | N/A
  `SHORTINTEGER` | N/A | N/A
  `INTEGER` | N/A | N/A
  `LONGINTEGER` | N/A | N/A

  パラメータが指定されない場合、省略値が適用されます。

  `* n`は、マシンのFLOATの精度に依存します。

  詳細は、Data Typesを参照して ください。

注意

1. `item`が`CREATE TABLE`コマンドの中で指定されない場合、 対話型のインターフェースが起動されます。 これはテーブルを作成する最も単純な方法で、このマニュアルの 対話型インタフェースに記述 されています。
2. データベース名とテーブル名が指定された場合 (`データベース名:テーブル名`)、新しいテーブルは指定されたデータベースに 作成されます。ただしデータベースは既存のEmpressデータベースでなくては いけません。 データベース名が指定されない場合、テーブルは現在のデータベースの中に作成され ます。
3. テーブルは現在のデータベースディレクトリ以外のディレクトリに作成 することができます。それはリモートテーブルとして参照されます。 テーブルのデフォルト位置は、`LOCATE`オプションを指定しない限りテーブル は現在のデータベースに作成されます。ディレクトリからの相対パスを指定するよりも、 絶対パスを指定することを推奨します。指定するディレクトリは別のファイルシステム 上でも可能です。

   指定された位置がキーワード`DB`あるいは空のストリング("")で ある場合、それは現在のデータベースディレクトリを参照します。

   指定するディレクトリには、1つのデータベースのみからのテーブルであること が重要です。2つ以上のデータベースからのテーブルを保持するためにディレクトリを 使用することは、データファイルを破壊する恐れがあります。

   テーブルの位置は、`ALL`オプションを指定した`DISPLAY TABLE` コマンドで参照することができます。

   既存のテーブルは`ALTER TABLE`コマンドを使用して再配置することが 可能です。

   Empressによって提供されるインポート／エキスポートは、テーブルの位置 を保持しません。インポートする場合には、テーブルは全てデータベースディレクトリ に作成されます。テーブルをが再配置する必要があります。

   オペレーティングシステムコマンドを使用して、データベースディレクトリを削除 することにより、リモートテーブルのないデータベースを削除することができますが、 リモートテーブルがあるデータベースの場合には`emprmdb`ユーティリィティで 削除しなくてはなりません。これは、データベースに関連したオペレーティング システムファイルがすべて削除されることを保証します。 このユティリティは、Empress: Manual Pagesを参照してください。

4. フィールドが`NOT NULL`として指定される場合、Empressはそれに対する データ値として`NULL`を受け付けません。
5. テーブルもファイルから作成することができます。フィールドの情報は 与えられたファイルに含まれており、`DISPLAY TABLE DUMP INTO ファイル`コマンドによって作成されます。
6. Empressは、同じ名前のテーブルが同じデータベースの中に作成 されること許しません。

必要な特権

  `sys_tables`に対する`INSERT`特権

例

1. 簡単なテーブルの作成

   フィールド`number`、`name`、`phone`、 `credit_limit`を持ったテーブル`personnel`を定義するために、 `number`は32767までの整数を保持することができるように、`name`は 25文字まで、`phone`は15文字まで、`credit_limi`は999,999.99ドル まで保持することができるように作成します。

   |  |  | `CREATE` | `TABLE personnel ( number INTEGER, name CHAR (25,1), phone CHAR (15,1), credit_limit DOLLAR (6,1));`

   `number`は`INTEGER`として、`name`と`phone`は 最大の長さ25および15の`CHAR`タイプ1として各々定義されます。 `credit_limit`は6桁のドルを格納することができる`DOLLAR`として 定義されます。

2. フィールド名がEmpressキーワードである場合のテーブルを作成します。

   `date`, `amount`というフィールド名を持つテーブル`loans` を定義するには、次の用に作成します。

   |  |  | `CREATE` | `TABLE loans ( number INTEGER, name CHAR (25,1), date DATE (1), amount DOLLAR (6,1));`

   `number`は`INTEGER`として、`name`は25の最大の長さの `CHAR`タイプ1として定義されます。 `date`は`DATE`タイプ1として、`amount`は6桁のドルを格納 することができる`DOLLAR`として定義されます。

   `name`、`date`がEmpressキーワードであることに注意して ください。そのようなフィールド名は複雑な名として扱ってください。

3. 複雑な名前を持ち`NULL`データの入力を無効としたテーブルを作成 します。

   "auto parts"テーブルを定義するには、次のように指定します。

   |  |  | `CREATE` | `TABLE "auto parts" ( supplier CHAR (20, 1) NOT NULL, phone CHAR (8, 1), ATTR "part name" CHAR (15, 1), ATTR "part no." LONGINTEGER, price DOLLAR (4, 1));`

   `supplier`に`NOT NULL`が指定されているので、各レコードで データが必ず入力されなくてはなりません。複雑なテーブル名およびフィールド名が 引用符で囲まれることに注意してください。

4. テキスト属性を備えたテーブルを作成します。

   `customers`テーブルは1つの`CHAR`と2つの`TEXT` データタイプ属性を含んでいます。`name`を`NOT NULL`として 定義することにより、顧客名が常に入力されることを確認してください。

   |  |  | `CREATE` | `TABLE customers ( name CHAR (20, 1) NOT NULL, address TEXT (30, 124, 30, 1), comments TEXT (25, 0, 80, 1));`

   `address`は1行30文字を4行表示させるために30の表示長、 プライマリ記憶長は124としています。120でなく124としているのは、各行の終わりに 改行コードがあるためです。オーバーフロー記憶長は30にしています。メインテーブル に4行文の十分な保存域があるので、オーバーフロー記憶はあまり使用されないと 思われますが長いアドレスの場合に使用されます。

   `comments`はは長さが一定ではないと予想されますので、この属性のために プライマリ記憶長を大きく指定することは意味がありません。この場合オーバー フロー記憶が使用されますので記憶長は、一般的な端末のスクリーンの幅に合わせ80 または80の倍数にするのがベストです。

## 4.3 DROP TABLE

`DROP TABLE`コマンドはデータベースからテーブルを削除します。 データベースからテーブルを削除することは、さらにそのレコードをすべて削除します。

Syntax

      DROP table;

注意

1. このコマンドがデータベースからテーブル定義およびそのレコードを削除する ために使用されるので、注意して使用してください。
2. `DROP TABLE`コマンドはレコード削除制約を無視します。
3. テーブルが削除される場合、警告のメッセージは表示されません。
4. VIEWテーブルもこのコマンドで削除されます。
5. データディクショナリーテーブルは削除しないでください。

必要な特権

  `DROP`特権

例

  テーブル`personnel`を削除するのは以下のコマンドを実行します。

         DROP TABLE personnel;

## 4.4 ALTER TABLE

`ALTER TABLE`コマンドは、既存のテーブルの構造を変更します。 これは次のものを含んでいます。

- 新しいフィールド追加します。
- 既存のフィールドを削除します。
- フィールドのデータタイプやパラメータを変更します。
- テーブルを再配置します。
- 無効なトリガを有効にします。
- トリガの優先順位を変更します。
- リプリケーションマスターを有効または無効とします。
- リプリケーションマスターのオーダーを変更します。
- テーブルのチェックサムの設定を変更します。

Syntax 1

  |  |  | `ALTER [TABLE] table` | `[action { [:] action}];`

Syntax 2

         ALTER [TABLE] table LOCATE [IN] location;

Syntax 3

  |  |  | `ALTER [TABLE] table` | `|ENABLE |DISABLE` | `| |` | `|ALL TRIGGERS |TRIGGER trigger {, trigger}` | `|; |`

Syntax 4

         ALTER [TABLE] table CHANGE TRIGGER trigger {, trigger}

            PRIORITY priority;

説明

  `action` | 以下の組み合わせ。
        |ADD    item {, item} [BEFORE attr]|
        |CHANGE item {, item}              |
        |DELETE attr {, attr}              |
        |ADD    [|LONGVAR|] CHECKSUM       |
                 |RECORD |
        |DELETE [|LONGVAR|] CHECKSUM       |
                 |RECORD |
        |ADD     constr1                   |
        |DELETE  constr2                   |
  `item` | `attr [data_type [(param {, param})] [[NOT] NULL]]`
  1. `constr1` | Primary KeyまたはForeign Keyで抑制。以下のいずれかです。
         PRIMARY KEY [key_name] [ON] (attr {, attr}) [| BTREE      |]
                                                      | TIMESERIES |
  2.     FOREIGN KEY [key_name] [ON] (attr {, attr}) [| BTREE      |]
                                                      | TIMESERIES |

                            REFERENCES table (attr {, attr})
  `constr2` | いずれか１つ。
        | PRIMARY KEY                     |
        | FOREIGN KEY [ON] (attr {, attr}) |
  `location` | 有効で存在するディレクトリ名。
  `data_type` | 以下に示すTable 4-2の中のひとつ。パラメータは括弧で囲まれます。 `data_type`が指定されない場合、省略値は `INTEGER`です。
  `trigger` | 有効で存在するトリガ名。
  `priority` | フロート番号。 例、 -1.2, 0, 1 , 2, 2.3 ... etc. 大きい数字 ほど優先度は高くなります。

注意

1. テーブル名の後に指定がない場合には、対話型の`ALTER TABLE`が起動され ます。それは全てのフィールドが変更できるように応答します。この例はこの マニュアルの対話型インタフェース で解説されています。
2. コマンド`ALTER table ADD attr;`は、テーブルの最後に データタイプintegerのフィールドが追加されます。
3. `ALTER TABLE`コマンドは古いテーブルファイルを削除する前に、 データベースディレクトリ内に新しいテーブルファイル(`.rel`ファイル)を 作成します。このコマンドによって要求されるディスクスペースはテーブルサイズの 少なくとも2倍で、新しいフィールドをテーブルに加える場合より多くなります。 一旦`ALTER TABLE`が完了すると、オリジナルのテーブルが削除され ディスクスペースが増えることになります。

   `ALTER TABLE`コマンドは新しいテーブルファイルを作成するので、新しい ファイルについてのUNIXアクセス権および所有権はumaskの設定(UNIXの)、および 所有者IDに依存します。

   `ALTER TABLE`コマンドがデータタイプの属性を変更する場合、 `ALTER TABLE`が完了するためにはテーブル内の全レコードを変換しなければ なりません。新しいデータタイプに変換できないレコードがある場合、 `ALTER TABLE`は異常終了し、オリジナルのテーブルは変更されません。

   `ALTER TABLE`コマンドがデータタイプの属性を変更する前に、フィールド から範囲チェックを削除します。範囲チェックはデータタイプと共に変換することが できません。

   `<CTRL+C>`のようなキーボード割り込みを使用して、 `ALTER TABLE`コマンドを中断することができます。 `ALTER TABLE`オペレーションは"安全です"。それはデータベースを破損 する可能性なしで中断することができるからです。`kill -9`を使用しての 割り込みはデータベースを破損する恐れがあります。

4. テーブルにチェックサムを加える場合、`LONGVAR`は`BULK`か `TEXT`データタイプのオーバーフロー(`.dtf`)ファイル用チェックサム を作成するために使用されます。`RECORD`はメイン(`.rel`) データファイル上のチェックサムを作成するために使用されます。 どちらも指定されない場合、チェックサムは、メイン(`.rel`)データファイル およびオーバーフロー(`.dtf`)ファイルの両方に当てはまります。 `ALTER`コマンドによって加えられたチェックサムは常に4バイトです。
5. コマンド`ALTER table LOCATE IN location`は別の ディレクトリにテーブルを移動させるために使用します。 `location`がキーワード`DB`あるいは空のストリング ("")の場合、テーブルは現在のデータベースディレクトリに移動されます。 `リモートテーブル`についてのさらに詳しい情報に関しては、 `CREATE TABLE`を参照してください。
6. VIEWテーブルに対しては、何も影響を与えません。
7. フィールドを追加、変更することによりテーブルを変更した場合、トリガに 影響はありません。トリガは、新しいテーブル構造のもとで正確に自動的に機能します。 フィールドがその後削除される場合、そのフィールドに明示的に接続されたトリガは すべて削除されます。

8. トリガは使用しない場合は無効に、使用する場合は有効にできます。

9. 多数のトリガが作成される場合、トリガ定義内の優先度は実行されるトリガの順序を 決定します。トリガが作成される場合、優先度は0.000にセットされます。 トリガの優先度を変更する`ALTER TABLE`コマンドを使用してください。

10. データディクショナリーテーブルに対して`ALTER TABLE`コマンドを 使用してはいけません。

必要な特権

  `ALTER`特権

例

1. フィールドの追加

   `loans`テーブルにデータタイプ`DATE(1)`の`due_date` という名前のフィールドを追加します。

   |  |  | `ALTER` | `loans ADD due_date DATE (1);`

2. フィールドのプロパティを変更します。

   `loans`テーブルの`name`フィールドを、新しいフィールドの追加と 共に25バイト`CHAR`から20バイト`CHAR`に変更します。

   |  |  | `ALTER` | `loans ADD due_date DATE (1) CHANGE name CHAR (20, 1);`

   `DISPLAY TABLE`コマンドでテーブル構造を表示させると以下のように なります。

          *** Table: loans ***

          Attributes:
            number               integer
            name                 char(20,1)
            date                 date(1)
            amount               dollar(6,1)
            due_date             date(1)

## 4.5 RENAME

`RENAME`コマンドはテーブル名、フィールド名を変更します。

Syntax

  Syntax 1:

  |  |  | `RENAME TABLE table [` | `| TO | | AS |` | `] new_table_name;`

  Syntax 2:

  |  |  | `RENAME ATTR[IBUTE] table.attr [` | `| TO | | AS |` | `] new_attr_name;`

  説明

  `new_table_name` | 有効なテーブル名。
  `new_attr_name` | 有効なフィールド名。

注意

1. フィールド名を変更する場合、オリジナルのフィールド名にはテーブル名を 付加しなければなりません。しかし、変更後のフィールド名にはテーブル名を付加して はなりません。

2. テーブル名、フィールド名の変更は既存のトリガに影響はありません。 トリガは、新しい名前のもとで正確に自動的に機能します。

3. VIEWテーブル名もこのコマンドで変更することができます。

必要な特権

  `ALTER`特権

例

1. テーブル名の変更

   テーブル名`personnel`を`employees`に変更します。

          RENAME personnel TO employees;

2. 複雑なテーブル名の変更

   テーブル名`auto parts`を`parts`に変更します。

          RENAME "auto parts" TO parts;

3. 複雑なフィールド名の変更

   フィールド名`part no.`を`numbers`に変更します。

          RENAME parts."part no." TO numbers;

4. 簡単なフィールド名を複雑な名前に変更する。

   テーブル`personnel`のフィールド名`number`を `employee number`に変更します。

          RENAME personnel.number TO "employee number";

## 4.6 DISPLAY TABLE

`DISPLAY TABLE`コマンドは、指定されたテーブルのフィールド名、 データタイプ、インデックス情報、コメント、範囲チェック、制約条件、 VIEWテーブルの場合は作成された`SELECT`文などのテーブル情報を表示します。

Syntax

  `DISPLAY table [ON [ATTR]` | | `attr |[NOT] match_op pattern` | `|] |`

  |  |  | `[ALL] [DUMP]` | `[` | `|INTO |ONTO` | `| file]; |`

  説明

  `match_op` | 次のいずれか１つ`LIKE`、`MATCH`、`!MATCH`、 `SMATCH`、`!SMATCH`です。
  `pattern` | `WHERE`句で指定するパターンです。引用符で囲む必要があります。
  `file` | ファイル名。

注意

1. `ALL`オプションのない`DISPLAY TABLE`コマンドはフィールド 情報、コメント、インデックス情報、制約条件を表示します。`ALL`オプション を指定した場合はトリガ定義、フィールドに関するコメント、範囲チェック、作成者、 ロックレベル、チェックサム変数(Empress: Database Administrator's Guide のDirty Readを 参照してください)、テーブル番号、レコード・サイズ、レコード数を表示します。

2. 特定のフィールドだけ表示したい場合には、`ON attr`あるいは パターンマッチング・オプションを使用してください。

3. `DISPLAY TABLE`コマンドに`DUMP`オプションが指定された場合、 出力は圧縮されダンプファイルからテーブルを作成するための情報を含んでいます。 ダンプファイル中の値は、Empressによって設定されたセパレータ文字によって 分離されます。この文字はEmpressシステム変数`MSVALSEP`によって 指定されます。セパレータの初期値は通常<Ctrl+V>(8進法26)です。

   ファイルへダンプされた情報から新しいテーブルを作成する場合には、`DUMP` オプションを指定します。`NULL`値を受け入れるフィールドは`n`の値 が、受け入れない場合は`y`がダンプファイルに書き込まれています。

4. `INTO file`あるいは`ONTO file`が指定された 場合、出力はターミナルへではなく指定されたファイルへ送られます。`ONTO` は既存ファイルに追加します。`INTO`は既存ファイルに上書きします。 どちらの場合もファイルが無い場合には作成します。

5. `DISPLAY TABLE`はVIEWテーブルにも使用できます。

6. テーブルサイズを取得するために、テーブルに対して`DISPLAY ALL`を 行います。テーブル番号を見つけ出し次に、対応するシステムファイルの ファイルサイズを見つけるシステムコマンドを使用します。例えば、UNIXでは、 コマンド`ls -l`は、ファイルの詳細表示を行ないます。 テーブル番号が15である場合、テーブルに対応するファイル名は`0015.rel` になります。詳細表示にはファイルサイズをバイト単位で表示します。

必要な特権

  `DISPLAY`特権

例

1. テーブル中の全てのフィールドを表示します。

   `loans`テーブルのフィールドを表示します。

          DISPLAY loans;

   以下の表示を行ないます。

          *** Table: loans ***

          Attributes:
            number                integer
            name                  char(25,1)
            date                  date(1)
            amount                dollar(6,1)

2. テーブルの詳細情報を表示します。

   `loans`テーブルの作成者、ロックレベル、レコード数情報を含めて表示 します。

          DISPLAY loans ALL;

   以下の表示を行ないます。

          *** Table: loans ***

          Attributes:
            number                integer
            name                  char(25,1)
            date                  date(1)
            amount                dollar(6,1)

          Creator: joe
          Lock Level: RECORD

          Table #: 8
          Records: 12
          Record size: 36

3. テーブル中の指定フィールドを表示します。

   `loans`テーブルの`name`フィールドを表示します。

          DISPLAY loans ON name ALL;

   以下のような表示を行ないます。

          ** Table: loans ***

          Attributes:
            name              char(25,1)

          Creator: joe
          Lock Level: RECORD

          Table #: 8
          Records: 12
          Record size: 36

4. システムファイルへテーブル情報を保存します。

   `personnel`テーブルの情報をファイル`p_desc`へ保存します。

          DISPLAY personnel INTO 'p_desc';

## 4.7 CREATE INDEX

`CREATE INDEX`コマンドは、単一のフィールドまたは複数のフィールド上に インデックスと呼ばれるEmpressデータ構造を作成します。インデックスは、 フィールドへのアクセスを向上させます。インデックスは、`TEXT`と `BULK`のデータタイプのような可変長データには作成できません。

Syntax

  `CREATE [` | `|UNIQUE |DISTINCT |[(]primary[,] overflow[)]` | `|] [index_method] INDEX [name] | |`

  |  |  | `[ON]` | `|table (attr, {, attr}) |table SET (attr, {, attr})` | `|; |`

  説明

  `name` | ユーザによって指定されたインデックス名。
  `primary` | プライマリインデックスファイル中の、インデックスが付けられたフィールドへの ポインタの数。省略値はEmpress管理変数`MSDBINDEXPRIMARY`に2 と設定されています。
  `overflow` | オーバーフローインデックスファイル中の、インデックスが付けられたフィールド へのポインタ数。省略値はEmpress管理変数`MSDBINDEXOVERFLOW`に15 と設定されています。
  | `index_method` |
  いずれか１つ。 | `|BTREE |TIMESERIES` | `| |`
  省略値は`BTREE`です。

注意

1. `DISTINCT`は`UNIQUE`と同義語として使用されます。 `UNIQUE`が指定された場合、同一の値または`NULL`値は許可されません。

2. 複合インデックスは、2つ以上のフィールドに作成されます。

3. インデックスは、プライマリ領域およびオーバーフロー領域という2つの領域に 格納されます。インデックスが付けられたフィールドの値が同一な値 のポインタはプライマリ領域が有効な数だけ格納され、全て使用されつくされた場合、 オーバーフロー領域に格納されます。オーバーフロー領域は無期限に成長することが できます。

   オーバーフローが0より大きい場合、無制限に同一値および`NULL`値が許可 されることに注意してください。オーバーフローが0として指定される場合、 フィールドの同一値が格納される最大数はプライマリに設定された数になり、 `NULL`値は許可されません。プライマリが1で、オーバーフローが0である場合 、同一値は許可されません。すなわち`UNIQUE`を指定するのと同じことになり ます。

4. 同一値の無効、`NULL`値の無効、同一値の最大数を許可する インデックスを作成することができます。 これらのフィールドに限界以上の同一値または`NULL`値を入力しようとすると エラーメッセージを出力します。

   ユニークなインデックスを作成しているフィールドに同一値を入力しようとすると 以下のメッセージを出力します。

          *** User Error *** duplicate value for 'attribute_value'

   説明`：attribute_value`は同一値です。この時インデックスは作成 されません。

   データがファイルからテーブルにロードされており、ユニークか制限された インデックスが付けられたフィールドに対して同一値が制限を越えて入力された場合、 Empressは次のエラーメッセージを出力します。

          *** User Error* ** duplicate value for 'attribute name' near line ###

   説明`：###`ファイル中の行数です。

   対話型のインターフェースの`INSERT`あるいは`UPDATE` コマンドにより、制限以上の同一値を入力しようとした場合、以下のエラーメッセージ を出力します。

          *** Duplicate Value *** attribute 'attribute name'

   `よろしいですか？ .`.プロンプトが再発行され同一値の変更を催促します。

   テーブルに既に同一値が存在する場合、Empressインポートユーティリィティ( `empimpt`)は、`-e`オプションが指定されていない場合エラーが発生 した時点で異常終了します。ユーティリィティempimptの詳細は Empress: Database Administrator's Guide を参照してください。

5. `index_method`が指定されない場合、省略値は`BTREE` です。

   `BTREE`インデックスは以下のフィールドの場合に推奨します。

   - インデックス値が再度周期的に生じる場合。
   - インデックス・データの分配が固定される場合。
   - キーインデックス値は、一定期間内で不変の場合。

   `TIMESERIES`インデックスは以下の場合に推奨します。

   - キーインデックス値は一定期間内でを劇的に転換する場合。
   - タイムスタンプのようにインデックス・データは常に新しい値の場合。
   - キーインデックス値は大きな範囲から成り、インデックスツリーの片側へ インデックス値が分配される場合。

6. 簡単な検索については、インデックスを指定することが勧められます。 インデックス名のためのシンタックスはテーブル名、属性名と同一です。

7. テーブルが約2,000バイトより大きい場合、検索条件となるフィールドに インデックスを作成するべきです。

8. インデックスを付けてはならないフィールドは次のとおりです。

   - 小さなテーブル。小さなテーブルについては、検索速度自体早いですので インデックスを作成する必要はありません。逆にインデックスを作成することにより、 ディスクスペースを余分に使用しインデックスを参照することで検索速度を遅くする 場合があります。

   - インデックスを付けてはならないフィールド例として、`性別`のような `男`か`女`、または`曜日`のような月曜から日曜のように値が 数種類のものがあります。

   - バッファー制限により、インデックスは2000文字以上のタイプ`CHAR` 属性に付けてはいけません。

9. `DISPLAY TABLE`コマンドはテーブルのインデックスを表示します。

10. インデックスはVIEWテーブルには作成できません。

11. `CREATE INDEX`コマンド実行中に、<Rubout>、<Delete> 、<Ctrl+C>などが押された場合、警告メッセージがターミナル上に表示され、 3秒以内に再び<Rubout>あるいは<Ctrl+C>が押されると `CREATE INDEX`コマンドを中断することができます。

    非常に大きなテーブルにインデックスを作成するとかなり時間を必要としますので、 中断する手段が存在することは大きな利点となります。偶然に中断キーを押して しまっても3秒経過すれば処理は続行しますのでリカバリできます。

    割り込みキーが押される場合、次のメッセージが表示されます。

           *** Interrupt *** hit another to abort

    上記メッセージ後、3秒以内に割り込みキーを押さなかった場合には、以下の メッセージを出力します。

           *** Resuming ***

    その後、`CREATE INDEX`を続行します。

12. `SELECT`コマンドは、必ずしもテーブル上でインデックスを使用するとは 限りません。フィールドがコマンドのWHERE句に使用され、WHERE句の中で適切な位置に ある場合、フィールド上のインデックスは使用されます。`AND`または `OR`オペレーションが存在する場合にはインデックスが使用されない場合が あります。 Empressには、`MSQUERYPLAN` という変数があります。この変数に値をセットした場合、インデックスに関する情報を 表示します。

13. インデックスが付けられたフィールドによってテーブルにアクセスする場合、 インデックスにロックを配置します。これはテーブル上のロックに関係ありません。 ロックを作成する試行数は、変数`MSINDEXRETRY`(初期値は5)によって制御 されます。また、再試行の間隔秒数は変数`MSINDEXSLEEP`(省略値は1)によって 制御されます。

    `SELECT`の中で、インデックスをロックすることができない場合、テーブル へのアクセスはインデックスを使用せずに行なわれます。更新系のオペレーションでは 行なわれません。

必要な特権

  `INDEX`特権

例

1. 簡単なインデックスの作成

   最も簡単なインデックス（名前なし、単一のフィールド、無制限の許可の同一値、 `NULL`値の許可)を、`personnel`テーブルの`name`フォールド に作成します。

          CREATE INDEX ON personnel (name);

2. ユニークインデックスの作成

   `personnel`テーブルの`number`フィールドにユニークインデックス を作成し、全ての個人番号がユニークになることを保証します。

          CREATE UNIQUE INDEX ON personnel (number);

3. 同一値の最大数に制限をつけインデックスを作成

   `loans`テーブルに制限を付加（社員１人にローン3つまで)しインデックス を作成します。インデックス名なしでプライマリは`3`、オーバーフロー `0`とします。

          CREATE (3, 0) INDEX ON loans (name);

4. 名前付きのインデックスの作成

   `personnel`テーブルの`name`フィールドに、`employee`と いう名前のインデックスを作成します。

          CREATE INDEX employee ON personnel (name);

5. 複合ユニークインデックスの作成

   `personnel`テーブルの社員の番号と名前に対して、組み合わせでユニーク な複合インデックスを`pers`という名前で作成します。

          CREATE UNIQUE INDEX pers ON personnel (number, name);

6. インデックス情報の表示

   `personnel`テーブルが、シンプルなユニークインデックスを `number`フィールドに、シンプルなユニークでないインデックスを `phone`フィールドに、`employee`という名前付きのシンプルな インデックスを`name`フィールドに、`pers`という名前付き のユニークな複合インデックスを、`number`フィールドと `name`フィールドに作成されている場合、`DISPLAY TABLE`コマンドを 実行すると以下のように表示されます。

          DISPLAY personnel;

          *** Table: personnel ***

          Attributes:
            number                 integer
            name                   char(25,1)
            phone                  char(15,1)
            credit_limit           dollar(6,1)

          Indices:  UNIQUE ON (number)
                    NORMAL (2,15) employee ON (name)
                    NORMAL (2,15) ON (phone)
                    UNIQUE pers ON (number, name)

## 4.8 DROP INDEX

`DROP INDEX`コマンドはインデックスを削除し、それによって使用される 記憶装置を解放します。

Syntax

  `DROP INDEX` | `|name [[ON] table]] |table SET attr {, attr} |table (attr {, attr}` | `|; | |`

注意

1. インデックス名が付けられていれば、削除時にフィールド名を指定する必要が ありません。インデックス名が付けられていない場合には、削除時にフィールド名を 指定する必要があります。

2. インデックス名が付けられているが、テーブル名の指定がない場合で、同じ名前の インデックスが他のテーブルにある場合には、どのテーブルのインデックスを削除 したいか応答があります。削除したくないテーブルであれば`n`をタイプし、 削除したいテーブルであれば`y`をタイプしてください。

必要な特権

  `INDEX`特権

例

1. シンプルな名前のないインデックスを削除

   `personnel`テーブルの`name`フィールドに作成されている、 シンプルな名前のないインデックスを削除します。

          DROP INDEX ON personnel (name);

2. 名前付きの複合インデックスを削除

   `personnel`テーブルの、`name`フィールドと`number` フィールドに作成された`pers`という名前のユニークな複合インデックスを 削除します。

          DROP INDEX pers;

   または

          DROP INDEX ON personnel (number, name);

## 4.9 CREATE RANGE CHECK

`CREATE RANGE CHECK`コマンドは、与えられたフィールド用のデータ確認 チェックを作成します。チェックは、個別の値、値の範囲、値のサイズ、パターン マッチング・テンプレートあるいはこれらの組み合わせとなります。

Syntax

  `CREATE RANGE [` | `|CHECK |CONSTRAINT` | `|] [ON] table.attr |` | `|[SET] range {, range} |(range {, range})` | `|; |`

  説明

  `range` |
  | `[IS]` | `|value |operator value |match_op pattern |BETWEEN value [boundary] [AND] value [boundary] |RANGE value [boundary] [TO] value [boundary]` | `| | | | |`
  `boundary` | 次のいずれか`INCLUSIVE`, `INCL`, `EXCLUSIVE`, `EXCL`です。 `EXCL`は `EXCLUSIVE`と、また`INCL`は`INCLUSIVE`と同義語です。 省略値は`INCLUSIVE`です。
  `operator` | 次のいずれか`=`, `!=`, `<`, `<=`, `>=`です。
  `value` | データタイプに対応した値。
  `match_op` | 次のいずれか`LIKE`, `MATCH`, `!MATCH`, `SMATCH`, `!SMATCH`です。
  `pattern` | `WHERE`句で指定するパターン。

注意

1. 複数の範囲指定はは`OR`で結合されます。

2. `RANGE CHECK`コマンドは追加的なものではありません。フィールドに対し レンジチェックを作成した場合、既存のレンジチェックはリプレースされます。

3. レンジチェックの作成は、既存のデータには影響しません。作成後の追加、更新 データに影響します。

4. 可変拡張文字(初期値は`$`)はパターンマッチングに特別の機能を持って いません。しかしながら、それが試みに変数を拡張させるのを防ぐために、それは2つ 指定しなくてはなりません(つまり、`$$`は、ストリングの`$`の値を 持っています)。

5. レンジチェックはVIEWテーブルにも作成できます。

6. レンジチェックは`DISPLAY TABLE ALL`コマンドで表示できます。

必要な特権

  `ALTER`特権

例

1. フィールドへのシンプルな範囲制約を作成します。

   `personnel`テーブルの`number`フィールドには、1から99までの 値しか許可しない。

          CREATE RANGE CHECK ON personnel.number
             SET BETWEEN 1 AND 99;

   `DISPLAY TABLE`コマンドをALLオプションを指定して実行します。

          DISPLAY personnel ALL;

          *** Table: personnel ***

          Attributes:
            number              integer
                  Range: range '1' i '99' i
            name                char(25,1)
            phone               char(15,1)
            credit_limit        dollar(6,1)

          Creator: joe
          Lock Level: RECORD

          Table #: 9
          Records: 7
          Record size: 45

2. 特定パターンとの一致を制約します。

   `loans`テーブルの`amount`フィールドを$25の倍数に制限します。

          CREATE RANGE CHECK ON loans.amount
             SET LIKE '*00', LIKE '*25', LIKE '*50', LIKE '*75';

   アスタリスクはワイルドカードです。`DISPLAY TABLE`コマンドでは 以下のように表示されます。

          DISPLAY loans ALL;

          *** Table: loans ***

          Attributes:
            number             integer
            name               char(25,1)
            date               date(1)
            amount             dollar(6,1)
                  Range: like '*00'
                         like '*25'
                         like '*50'
                         like '*75'

          Creator: joe
          Lock Level: RECORD

          Table #8:
          Records: 12
          Record size: 36

## 4.10 DROP RANGE CHECK

`DROP RANGE CHECK`コマンドはフィールドからデータ範囲チェックを削除 します。これは、フィールド上に設定されている全てにチェックを削除します。

Syntax

  `DROP RANGE [` | `|CHECK |CONSTRAINT` | `|] [ON] table.attr; |`

注意

1. フィールド名はテーブル名付きで指定しなくてはいけません。

2. VIEWテーブル名はテーブル名の位置に指定します。

必要な特権

  `ALTER`特権

例

  `loans`テーブルの`amount`フィールドに作成された全ての制約 を削除します。

         DROP RANGE CHECK ON loans.amount;

## 4.11 CREATE REFERENTIAL

データの挿入、削除において`CREATE REFERENTIAL`コマンドを使用して制約 を作成できます。参照の制約は、挿入、更新、削除の時にデータが第2のテーブル中の 条件を満たさなければ、挿入、更新、削除の処理を行なわないことを確証します。

Syntax

  `CREATE` | `|REFERENTIAL |REFER` | `| [ |` | `|CONSTRAINT |CHECK` | `|] [name] |`

  |  |  | `[ON] constrained` | `|INSERT |DELETE` | `| constraining; |`

  説明

  `name` | ユーザによって指定された制約名です。
  `constrained` | 制約されるフィールドをリストします。
  `|table (attr {, attr}) |table SET attr {, attr}` | `| |`
  `constraining` | 制約するフィールドをリストします。
  `|table (attr {, attr}) |table SET attr {, attr}` | `| |`

注意

1. 2つのテーブルが参照の制約に関係します。抑制されるテーブルは挿入、更新、 削除が行なわれることを制御されるテーブルです。抑制するテーブルは抑制された テーブルに対する処理を制御するために、データが使用されるテーブルです。

   参照の制約を確立するために、抑制されたテーブル中の1つ以上のフィールドは、 抑制するテーブル中の、1つ以上のフィールドに関係しています。

   以下の条件を参照の制約が作成されるために満たさなければなりません。

   - 抑制されるテーブル、抑制するテーブルはそれぞれ存在するテーブルを指定 しなければなりません。
   - 抑制されるフィールド、抑制するフィールドはそれぞれ存在するフィールドを指定 しなければなりません。
   - 抑制されるテーブルには`ALTER`特権を持っていなければなりません。
   - 抑制するテーブルには参照特権を持っていなければなりません。
   - 抑制するフィールド数とデータタイプは、抑制されるフィールド数とデータタイプ と同一でなければなりません。

2. Empressは、現在挿入と削除の2種類の参照の制約をサポートします。

   制約の挿入は、抑制されるテーブルに挿入されるデータについては、抑制される フィールドの値が抑制するテーブルの対応するフィールドの少なくとも1つのレコード と等しいに違いないことを暗示します。

   制約の削除は、抑制されるテーブルから削除されるデータについては、抑制される フィールドの値が抑制するテーブルの対応するフィールドの任意のレコードであり 等しくあってはならないことを暗示します。

   `UPDATE`ステートメントは`INSERT`の後に`DELETE`が行な われると見なすことができます。参考の制約はこのように評価されます。

3. 複数のフィールドが制約に関係することができます。それは与えられた制約の中で テーブル中のすべてのフィールドに指定することができます。複数のフィールドを指定 する制約は複雑な制約と呼ばれます。複雑な制約のもとで実行される抑制される テーブルに対するデータ・オペレーションについては、抑制するテーブル中の単一の レコードが条件を満たさなければなりません。

4. 参考の制約はVIEWテーブルに対しても有効です。

5. 制約は`DISPLAY TABLE`コマンドを使用して表示できます。

6. 参考の制約名は容易な参照のために使用されます。

必要な特権

  制約されるテーブルには`ALTER`特権を、制約するテーブルには `SELECT`特権が必要です。

例

1. 挿入制約の作成

   従業員でない人からローンを組まれないように、挿入制約を`loans.name`の 上で作成し、下記コマンドで`personnel.name`によって抑制します。

          CREATE REFER no_loan
             ON loans (name) INSERT personnel (name);

   作成された制約を参照します。

          DISPLAY loans;

          *** Table: loans ***

          Attributes:
            number          integer
            name            char(25,1)
            date            date(1)
            amount          dollar(6,1)

          Referential: no_loan (name) INSERT personnel (name)

   制約されているか、`loans`テーブルに`personnel`テーブルの `name`フィールドに存在しない名前を挿入してみます。

          INSERT INTO loans (name) VALUES ("Doe");

          *** User Error *** insert constraint 'no_loan' violation

2. 削除制約の作成

   ローンが残っている従業員を、`personnel`テーブルからの削除を防ぐため に、次の制約を作成します。

          CREATE REFER still_owes
             ON personnel (name) DELETE loans (name);

   作成された制約を参照します。

          DISPLAY personnel;

          *** Table: personnel ***

          Attributes:
            number             integer
            name               char(25,1)
            phone              char(15,1)
            credit_limit       dollar(6,1)

          Referential: still_owes (name) DELETE loans (name)

   制約されているか、`loans`テーブルに存在している名前を、 `personnel`テーブルから削除してみます。

          DELETE FROM personnel WHERE name = "Mosca";

          *** delete constraint 'still_owes' violation

3. 複雑な挿入制約

   `personnel`テーブルの、`name`フィールドと`number` フィールドによって、`loans`テーブルの`name`フィールドと `number`フィールドに挿入制約を作成します。

          CREATE REFER name_number ON
             loans (name, number) INSERT personnel (name, number);

   作成された制約を参照します。

          DISPLAY loans;

          *** Table: loans ***

          Attributes:
            number          integer
            name            char(25,1)
            date            date(1)
            amount          dollar(6,1)

          Referential: name_number (name, number) INSERT
                       personnel (name, number)

   `loans`テーブルへ挿入してみます。

          INSERT INTO loans (name, number) values ('Mosca' 5);

   両方の制約が満たされます。オペレーションが実行されます。

   `loans`テーブルに以下のコマンドを実行した場合。

          INSERT INTO loans (name, number) VALUES ('Mosca', 10);

   エラーメッセージを表示します。

          *** User Error *** insert constraint 'name_number' violation

   制約は満たされません。

4. 複数制約の作成

   `personnel`テーブルの`name`フィールドによって、`loans` テーブルの`name`フィールドに挿入制約を作成します。

          CREATE REFER name ON
             loans (name) INSERT personnel (name);

   `personnel`テーブルの`number`フィールドによって、`loans` テーブルの`number`フィールドに挿入制約を作成します。

          CREATE REFER number ON
             loans (number) INSERT personnel (number);

   作成した制約を参照します。

          DISPLAY loans;

          *** Table: loans ***

          Attributes:
            number              integer
            name                char(25,1)
            date                date(1)
            amount              dollar(6,1)

          Referential: name (name) INSERT personnel (name)
                       number (number) INSERT personnel (number)

   `loans`テーブルの`name`フィールドに`Mosca`を、 `number`フィールドに`5` (Moscaの個人番号) を入力します。

          INSERT loans SET name = 'Mosca', number = 5;

   両方の制約が満たされます。`personnel`テーブルの`name` フィールドと`number`フィールドにレコードを挿入する事は実行されます。

   `loans`テーブルの`name`フィールドに`Mosca`を、 `number`フィールドに`10` (Jonesの個人番号を挿入します。

          INSERT loans SET name = 'Mosca', number = 10;

   両方の制約が満たされます。`name`フィールド値がMoscaを引き受ける `personnel`テーブルおよび、`number`フィールド値に10が存在する ため、オペレーションが実行されます。両方の制約は満たされますがそれらが同じ レコードによって満たされないことに注意してください。

   コマンドで、`number`フィールドに1(未使用の個人番号)に対するMoscaの値 を備えた`loans`テーブルにレコードを挿入してください。

          INSERT loans SET name = 'Mosca', number = 1;

   以下の出力を行います。

          *** User Error *** insert constraint 'number' violation

   名制約がレコードによって、`name`フィールドのための値Moscaに満足で ある一方、`number`フィールドに対する1の値で制約を満たすレコードはあり ません。

## 4.12 DROP REFERENTIAL

`DROP REFERENTIAL`コマンドによって参照制約を削除できます。

Syntax

  `DROP` | `|REFERENTIAL |REFER` | `| [ |` | `|CONSTRAINT |CHECK` | `|] [name] |`

  |  |  | `[[ON] constrained` | `|INSERT |DELETE` | `| constraining]; |`

  説明

  `name` | ユーザによって指定された制約名。
  `constrained` | 制約されるフィールド名をリストします。
  `|table (attr {, attr}) |table SET attr {, attr}` | `| |`
  `constraining` | 制約するフィールド名をリストします。
  `|table (attr {, attr}) |table SET attr {, attr}` | `| |`

注意

  上記のシンタックスの場合において、指定された制約名がユニークでない場合、 Empressは抑制されるテーブル名での応答があります。`y`または `n`を返答してください。制約を削除したいテーブル名であったら`y`を、 削除したくないテーブルの場合は`n`を返答してください。

必要な特権

  `ALTER`特権

例

  `loans`テーブルの`no_loans`という名前の制約を削除します。

         DROP REFER no_loans;

## 4.13 CREATE VIEW

`CREATE VIEW`コマンドは1つ以上のテーブル上で論理的な テーブル(VIEW)を確立します。VIEWの構造は`SELECT`コマンドによって定義 されます。そしてVIEWによりもとのテーブルにアクセスできます。 VIEWの構造はデータディクショナリーに格納されます。

Syntax

      CREATE VIEW view [(attr { , attr})] AS select_command;

  説明

  `view` | VIEWテーブル名。
  `select_command` | `SELECT`文。`SELECTコマンド` を参照してください。

注意

1. VIEWの基本となるテーブルは、いくつかのファイルシステム上の、いくつかの データベースに存在することができます。分散型データにアクセスするためにVIEWを 使用することに関しては、Empress SQL: ユーザーズガイドを参照してください。

2. VIEWはシンプルにも複雑にもなりえます。シンプルなVIEWは単一のテーブルに アクセスして、テーブル中のフィールドのレコードにアクセスをします。複雑な VIEWは、共通のフィールド(複数可)上でリンクしたいくつかのテーブルに同時に アクセスします。この方法でレコードをリンクする操作はjoinと呼ばれます。 連結するSELECTコマンドについては、`SELECT` コマンドまたは、Empress SQL:ユーザーズ ガイドのクエリー言語トピックスを参照してください。

3. フィールド名はVIEWの中で指定することができます。フィールド名を指定する場合 、括弧でを囲まなくてはなりません。

4. `CREATE VIEW`コマンドの`SELECT`部分は関数(`MAX`、 `AVG`など)、`GROUP BY`句あるいは`HAVING`句を含んでいる 場合や`WHERE`句には、演算子あるいはサブクエリーを含む表現を含んでいる 場合もあり、キーワード`DISTINCT`が使用される場合があります。

5. VIEWはVIEW上で作成することができます(ネストされたVIEW)。すなわち、コマンド の`SELECT`部分のテーブルはVIEWでもかまいません。一般に、テーブルが検索 のために指定される場合は、VIEWが使用されても問題ありません。VIEWのデータへの アクセスは、基本となるテーブル上の特権によってではなくVIEW上の特権によって制御 されます。

6. VIEWの基本となるテーブルが削除された場合、VIEWを検索すると、テーブルが存在 しないと言うエラーメッセージを表示します。

   テーブルが削除される場合、VIEWが存在することの警告は与えられません。

7. VIEWの構造は`DISPLAY TABLE`コマンドを使用して表示することができます。 `DISPLAY TABLE`コマンドの`ALL`オプションが指定されると、VIEWを 作成するために使用されたる`SELECT`コマンドが表示されます。

8. VIEWは論理的な仮想のテーブルです。テーブルに使用できるコマンドの多くはVIEW 上で使用することができます。それらのコマンドは以下のとおりです。
   - `CREATE COMMENT`
   - `CREATE RANGE CHECK`
   - `CREATE REFERENTIAL CONSTRAINTS`
   - `DROP REFERENTIAL CONSTRAINTS`
   - `DELETE`
   - `DISPLAY`
   - `DROP COMMENT`
   - `DROP RANGE CHECK`
   - `DROP TABLE`
   - `DROP VIEW`
   - `GRANT/REVOKE PRIVILEGE`
   - `INSERT`
   - `RENAME`
   - `RUN REPORT`
   - `SELECT`
   - `UPDATE`

   VIEWに使用できないコマンドは次のとおりです。`ALTER`, `CREATE INDEX`, `DROP INDEX`, `EMPTY`, `LOCK LEVEL`, `SORT`.

9. レコードは、VIEWから検索できます。しかし、更新系の処理はは、ある条件を満た すVIEWに制限されます。シンプルなVIEWは通常条件を満たします。

   以下に、EmpressがVIEWに対する更新系の操作を許可する条件を示します。

   この条件は3つの規則で表現することができます。

   - 条件が次のもののうちの1つである場合、VIEWを更新するために使用される `WHERE`句は、条件の`AND`接続に制限されているに違いありません。

     - フィールドと定数の比較。
     - 同一テーブルの2つのフィールド間の比較。
     - 異なるテーブルの2つのフィールドの一致条件。

     次のものは除外します。

     - `NOT`条件。
     - `OR`接続。
     - テーブル間の一致(=)以外の比較。

   - 基本テーブルのフィールド間の一致条件が必要です。テーブル対テーブルは1対1で 結合されていなくてはなりません。

   - 基本テーブルには、他のテーブルとのジョインに含まれているフィールドの中に、 最低1つのキーがなければなりません。これはインデックスが必要であることを意味 します。

     VIEW上で許可される更新系操作のための第2の条件は、ジョインするための フィールド間の同等条件のグループごとに各1つだけのフィールドがVIEWに選択されて いることです。この条件で更新した場合には、VIEWの更新により各基本テーブルの 各フィールドがそれぞれ更新されます。

   第２の条件は、等しい基本テーブル中のフィールドのすべてのセットについては、 1つだけがVIEWに選択されます。VIEWが更新される場合、そのようなセット中のすべて のフィールドは、同じ値で更新されます。

   第３の条件は`NOT NULL`を指定したフィールドかユニークなインデックスを 持ったフィールドと関係しているということです。

必要な特権

  `sys_tables`に対する`INSERT`特権と基本テーブルの作成者。

例

1. シンプルなVIEWの作成

   `personnel`テーブルの`name`フィールドと`phone` フィールドを使用して、`employees`というシンプルなVIEWを作成します。

          CREATE VIEW employees AS
             SELECT name, phone FROM personnel;

   以下のコマンドを実行します。

          SELECT * FROM employees;

   このように表示されます。

          name          phone

          Kilroy        426-9681
          Mosca         544-2243
          Wladislaw     723-6073
          Jones         667-2951
          Peterson      978-6060
          Scarlatti     961-7363
          Jordan        964-3335

   `DISPLAY TABLE`コマンドでVIEWの構造を表示できます。

          DISPLAY employees;

          *** View: employees ***

          Attributes:
            name          char(25,1)
            phone          char(15,1)

   `DISPLAY TABLE`コマンドに`ALL`オプションを指定すると、VIEWを 作成した`SELECT`コマンドを参照できます。

          DISPLAY employees ALL;

          *** View: employees ***

          View: select attr 'name', attr 'phone' from 'personnel'

          Attributes:
            name          char(25,1)
            phone          char(15,1)

          Creator: joe

          Table #: 11
          Records: 7

2. 複雑なVIEWの作成

   VIEWを作ることが便利である理由は、2つ以上のテーブルからジョインする場合に、 VIEWを一度作成してしまえば毎回`SELECT`コマンドでジョインンする必要が なくなるからです。例えば、Jonesのローンおよび信用限度を示すために`loans` テーブルと`personnel`テーブルから`jonesloans`という名前のVIEWを 作成するには、以下のコマンドを実行します。

          CREATE VIEW jonesloans AS
             SELECT name, date, amount, credit_limit
             FROM loans, personnel
             WHERE loans.name = 'Jones' AND
             loans.name = personnel.name;

## 4.14 DROP VIEW

`DROP VIEW`コマンドはデータディクショナリーからVIEWを削除します。

Syntax

      DROP [VIEW] view;

  where:

  `view` | VIEWテーブル名。

注意

  VIEWの削除では警告メッセージは表示されません。

必要な特権

  `DROP`特権

例

  `jonesloans`というVIEWを削除します。

         DROP VIEW jonesloans;

## 4.15 CREATE COMMENT

`CREATE COMMENT`コマンドはテーブル、フィールド、モジュール、ルーチン あるいはトリガにコメントを作成します。コメントは、`DISPLAY DATABASE`か `DISPLAY TABLE`コマンドで表示できます。

Syntax

  Syntax 1:

  |  |  | `CREATE COMMENT [ON]` | `|TABLE |ATTR[IBUTE] |MODULE |ROUTINE |TRIGGER` | `table table.attr module module.routine trigger` | `| [SET] comment_string; | | | |`

  Syntax 2:

  |  |  | `COMMENT [ON]` | `|TABLE |ATTR[IBUTE] |MODULE |ROUTINE |TRIGGER` | `table table.attr module module.routine trigger` | `| [IS] comment_string; | | | |`

  説明

  `module` | `パーシスタントストアドモジュール名。`
  `routine` | `ルーチン名。モジュール名を先行させ指定します。Empressキーワード として扱われるため、引用符で囲む必要があります。`
  `trigger` | `トリガ名。`
  `comment_string` | `引用符で囲まれた文字列。`

注意

1. フィールドにコメントを作成する場合は、テーブル名を指定しなければいけま せん。

2. `CREATE COMMENT`はVIEWにも使用できます。

3. モジュール内の同じ名前を持ったルーチンは、外部名が違う場合でも共通の コメントを共有します。

必要な特権

  `ALTER`特権

例

1. テーブルにコメントを作成します。

   `loans`テーブルにコメントを作成します。

          COMMENT ON TABLE loans IS "Loans to Employees";

   `DISPLAY TABLE`コマンドでコメントが表示されます。

          DISPLAY loans;

          *** Table: loans ***

          Comment: Loans to Employees

          Attributes:

            number             integer
            name               char(25,1)
            date               date(1)
            amount             dollar(6,1)

2. フィールドにコメントを作成します。

   `loans`テーブルの`amount`フィールドにコメントを作成します。

       CREATE COMMENT ON ATTRIBUTE loans.amount
           SET 'Amounts must be multiples of $$25';

   2つのドル($)記号は、Empress変数の解釈を回避させるのに必要です。詳細は Variables and Stringsの Empress Conventionsを参照してください。

   `DISPLAY TABLE`コマンドに`ALL`オプションを指定すると コメントが表示されます。

          DISPLAY loans ALL;

          *** Table: loans ***

          Comment: Loans to Employees

          Attributes:

            number             integer
            name               char(25,1)
            date               date(1)
            amount             dollar(6,1)

          Comment: Amounts must be multiples of $25

          Creator: joe
          Lock Level: RECORD

          Table #: 8
          Records: 12
          Record size: 36

   特定のフィールドに関するコメントは、フィールドを指定した `DISPLAY TABLE`で表示することができます。

          DISPLAY loans ON amount ALL;

          *** Table: loans ***

          Comment: Loans to Employees

          Attributes:

            amount        dollar(6,1)

          Comment: Amounts must be multiples of $25

          Creator: joe
          Lock Level: RECORD

          Table #: 8
          Records: 12
          Record size: 36

## 4.16 DROP COMMENT

`DROP COMMENT`コマンドはテーブルまたはフィールドからコメントを削除 します。

Syntax

  `DROP COMMENT [ON]` | `|TABLE |ATTR[IBUTE] |MODULE |ROUTINE |TRIGGER` | `table table.attr module module.routine trigger` | `|; | | | |`

注意

  `DROP COMMENT`コマンドは同様にVIEWのコメントも削除できます。

必要な特権

  `ALTER`特権

例

  `loans`テーブルからコメントを削除します。

         DROP COMMENT ON TABLE loans;

## 4.17 GRANT PRIVILEGE

`GRANT PRIVILEGE`コマンドは、テーブルのアクセス特権をユーザに 与えます。特権を与えられたユーザもまた他のユーザに特権を与えることも可能です。 特権の削除は`REMOVE PRIVILEGE`コマンドで、表示は `DISPLAY PRIVILEGE`コマンドと`DISPLAY GRANT PRIVILEGE`コマンドで 行なえます。

Syntax

      GRANT privilege {, privilege} [ON] table [TO] grantee {, grantee}

         [AS grantor] [[WITH] GRANT [OPTION]];

  説明

  `privilege` | Table 4-3にリストされたいずれか１つ。
  `grantee` |
  いすれか１つ。 | `|CREATOR |DBA |PUBLIC |username` | `| | | |`
  特権を付与されるユーザ名。`CREATOR`はテーブル作成者。 `DBA` はデータベース管理者。`PUBLIC`は全てのユーザ。`username` はシステムのログイン名またはアカウント名です。
  `grantor` |
  いずれか１つ。 | `|CREATOR |DBA |username` | `| | |`
  特権を付与するユーザ名。`grantor`を指定しない場合、 省略値はコマンドを発行したユーザ名となります。

注意

1. 特権を以下に示します。

   Table 4-3: データベース特権

   特権 | 許可されるコマンド
   `ALTER` | `ALTER TABLE, CREATE/DROP COMMENT, CREATE/DROP RANGE CHECK, CREATE/DROP REFERENTIAL CONSTRAINT, LOCK LEVEL, RENAME`
   `BYPASS_LOCK` | `SELECT BYPASS_LOCK`
   `DELETE` | `DELETE, SELECT`
   `DISPLAY` | `DISPLAY TABLE`
   `DROP` | `DROP TABLE`
   `EMPTY` | `EMPTY TABLE`
   `INDEX` | `CREATE`/`DROP INDEX`
   `INSERT` | `INSERT`
   `SELECT` | `SELECT`
   `SORT` | `SORT`
   `UPDATE [(attr {, attr})]` | `UPDATE`, `SELECT` フィールドが指定された場合、特権は 指定フィールドのみ有効となります。

2. いくつかの特権を集めたグループ名で指定できます。グループ名には `DBA`(管理者)、`ALL`、`USER`があります。

   Table 4-4: データベース特権グループ

   特権タイプ | 特権
   `DBA` | `ALTER`, `DROP`, `EMPTY`, `INDEX`, `SORT`
   `ALL` | All privileges.
   `USER` | `BYPASS_LOCK`, `DELETE`, `DISPLAY`, `INSERT`, `SELECT`, `UPDATE`

3. `DBA`は変数 `MSDBADMINISTRATOR`によって`tabzero`に定義されます。 テーブルのCREATORはデータ・ディクショナリー中の `sys_tables`に定義されます。

   データベースの`DBA`およびテーブルの`CREATOR`は、適切な システムデータの更新により変更されます。`DBA`および`CREATOR`の 特権を与えることは、それらが`DBA`か`CREATOR`になるとともにユーザ によって特権を継承する手段を提供します。

4. テーブルにアクセスしようとした場合、ユーザのアクセス権がチェックされます。 ユーザがテーブル作成者または`DBA`ならば、その立場の特権が適用されます。

5. `CREATOR`または`DBA`は、テーブルの特権を付与できます。 特権の削除は特権を付与したユーザだけが実行できます。ただし`CREATOR`と `DBA`は特権の付与者として削除が可能です。

6. `GRANTOR`タイプは、特権の付与と削除を制御します。ディフォルトでは `grant`オプションにある特権だけ付与できます。

7. Empressは、各データベースが作成されているオペレーティングシステムによって セットされるファイル許可を使用します。Empressデータベース中のテーブルに アクセスするために、ユーザは適切なオペレーティング システムファイル許可および 適切なデータベース特権の両方を持っていなければなりません。 例えばUNIXでは、`DBA`は付与する特権に適合したファイル許可を他ユーザに 与えなくてはなりません。 ユーザがデータベース上で検索だけするのであれば、データベースのディレクトリに あるテーブルに対応するファイルについては読み取り許可があれば十分です。 ユーザがデータベースで更新系の操作をするのであればテーブルおよび システムテーブルに対応したファイルについて書き込み許可を与えられなければ なりません。これは`chmod`コマンドの使用により行うことができます。 (使用法はUNIXマニュアルを参照)。 ユーザがデータベース上の新しいテーブルを作成する必要があれば、データベースを 含んでいるディレクトリについての書き込み許可がユーザに与えられなくてはなりま せん。

8. `DBA`は、すべてのテーブル上の特権を付与することができます。この特権 を行使するには、譲渡者は`AS DBA`として特権を与えられなければなりません。 データディクショナリーの`tabzero`中の管理変数`MSDBDBAPRIVS` の中にはテーブル上のデフォルト特権が設定されています。この変数の初期値は次の 特権を有します。

   Table 4-5: DBAの特権初期値

   Grantor | Grantee | Privilege | Grant Option
   `DBA` | `DBA` | `DBA` 特権: `ALTER`, `DROP EMPTY`, `INDEX`, `SORT` | GRANTオプションなし。
   `DBA` | `DBA` | `USER` 特権: `BYPASS_LOCK`, `DELETE`, `DISPLAY`, `CREATOR`, `INSERT`, `SELECT`, `UPDATE` | `GRANTオプション付き。`

9. テーブルの作成者は、そのテーブル上の特権をすべて付与することができます。 テーブルが作成される場合、コマンドを出すユーザはテーブルの`CREATOR`に なります。データディクショナリーの`tabzero`中の管理変数`MSDBPRIVS` の中でテーブル上のデフォルト特権が設定されています。この変数の初期値は次の特権 を有します。

   Table 4-6: CREATORの特権初期値

   Grantor | Grantee | Privilege | Grant Option
   `CREATOR` | `CREATOR` | `DBA` 特権: `ALTER`, `DROP EMPTY`, `INDEX`, `SORT` | grantオプションはなし。
   `CREATOR` | username (作成者のログイン名) | `USER` 特権: `BYPASS_LOCK`, `DELETE`, `DISPLAY`, `CREATOR`, `INSERT`, `SELECT`, `UPDATE` | `GRANTオプション付き。`

10. 特権はテーブルと同様にVIEW上でも与えることが可能です。

必要な特権

  譲渡者は付与したい特権のgrant権限が必要です。

例

1. 特定ユーザへの特権付与

   `auto parts`テーブル上の`SELECT`特権と`INSERT`特権を ユーザ`mosca`と`kilroy`に付与します。

          GRANT SELECT, INSERT ON 'auto parts'
             TO mosca, kilroy;

2. 特権を付与オプションを付けて付与

   ユーザ`office`に`customers`テーブルの`INSERT`特権、 `UPDATE`特権、`DELETE`特権を作成者と同等に付与オプション を付けて付与します。

          GRANT INSERT, UPDATE, DELETE ON customers
             TO office
             AS CREATOR
             WITH GRANT OPTION;

3. 全ユーザに対して特権を付与

   `customers`テーブルの`SELECT`特権を全ユーザの作成者と同等に 付与します。

          GRANT SELECT ON customers
             TO PUBLIC
             AS CREATOR;

## 4.18 DISPLAY PRIVILEGE

`DISPLAY PRIVILEGE`コマンドは指定されたテーブルのアクセス特権を表示 します。

Syntax

  `DISPLAY` | `|PRIVILEGE |PRIV` | `| table [ON [ATTR] |` | `|attr |[NOT] match_op pattern` | `|] |`

  |  |  | `[` | `|ALL |AS | |` | `|DBA |CREATOR |username` | `| | |` | `|]; | | |`

  説明

  `match_op` | 次のいずれか１つ`LIKE`, `MATCH`, `!MATCH`, `SMATCH`, `!SMATCH`。
  `pattern` | `WHERE`句で指定するパターン。引用符で囲む必要があります。
  `username` | システムのログイン名またはアカウント名。

注意

1. `ALL`オプションを指定しない`DISPLAY PRIVILEGE`コマンドは、 指定したテーブルにあるユーザの特権を表示します。特権は画面の所定の位置に表示 され、全ての特権を保有している場合にはALLと表示されます。

2. 更新の特権があるフィールドとないフィールドがある場合には、更新可能な フィールド名を表示します。表示を特定フィールドに限定するには`ON フィールド名`またはパターンマッチのオプションを指定します。

3. `ALL`オプションを指定すると、ユーザの特権はそれを有する単位によって 分類されます。適用可能な場合、特権のリストは、`USER`、`PUBLIC`、 `DBA`、`CREATOR`で表示されます。

4. `AS DBA`オプションを指定すると、ユーザがデータベース管理者であれば 特権が表示され、そうでなければ何も表示されません。

5. `AS CREATOR`オプションを指定すると、ユーザがテーブル作成者であれば 特権が表示され、そうでなければ何も表示されません。

6. `AS username`オプションを指定すると、指定ユーザの特権が表示 されます。このオプションは`DBA`または`CREATOR`の場合に有効です。

7. `DISPLAY PRIVILEGE`はVIEW上の特権を表示することが可能です。

必要な特権

  なし

例

1. テーブルの特権を表示します。

   `loans`テーブルの自分の特権を表示します。

          DISPLAY PRIVILEGE loans;

   以下を表示します。

          ALL

2. 特権の分類を表示します。

   特権の分類を含めて表示します。

          DISPLAY PRIVILEGE loans ALL;

   以下を表示します。

          USER: delete display insert select update
          CREATOR: alter drop empty index sort

## 4.19 DISPLAY GRANT PRIVILEGE

`DISPLAY GRANT PRIVILEGE`コマンドは、指定されたテーブルの付与できる 特権の情報を表示します。

Syntax

  `DISPLAY GRANT` | `|PRIVILEGE |PRIV` | `| table [ON [ATTR] |` | `|attr |[NOT] match_op pattern` | `|] |`

  |  |  | `[` | `|ALL |AS | |` | `|DBA |CREATOR |username` | `| | |` | `|]; | | |`

  説明

  `match_op` | 次のいずれか１つ`LIKE`, `MATCH`, `!MATCH`, `SMATCH`, `!SMATCH`。
  `pattern` | `WHERE`句で指定するパターン。引用符で囲む必要があります。
  `username` | システムのログイン名またはアカウント名。

注意

1. `ALL`オプションを指定しない`DISPLAY GRANT PRIVILEGE`コマンド は、指定したテーブルにあるユーザの付与できる特権を表示します。特権は画面の所定 の位置に表示され、全ての特権を付与できる場合には`ALL`と表示されます。

2. 更新の特権を付与できるフィールドとないフィールドがある場合には、付与できる 更新可能なフィールド名を表示します。表示を特定フィールドに限定するには `ON フィールド名`またはパターンマッチのオプションを指定します。

3. `ALL`オプションを指定すると、ユーザの付与できる特権はそれを有する 単位によって分類されます。適用可能な場合、付与できる特権のリストは、 `USER`、`PUBLIC`、`DBA`、`CREATOR`で表示されます。

4. `AS DBA`オプションを指定すると、ユーザがデータベース管理者であれば 付与できる特権が表示され、そうでなければ何も表示されません。

5. `AS CREATOR`オプションを指定すると、ユーザがテーブル作成者であれば 付与できる特権が表示され、そうでなければ何も表示されません。

6. `AS username`オプションを指定すると、指定ユーザの付与できる 特権が表示されます。このオプションは`DBA`または`CREATOR`の場合に 有効です。

7. `DISPLAY GRANT PRIVILEGE`はVIEW上の付与できる特権を表示することが可能です。

必要な特権

  なし

例

1. 付与できる特権を表示します。

   `loans`テーブルに対する付与できる特権を表示します。

          DISPLAY GRANT PRIVILEGE loans;

   以下を表示します。

          USER: delete display insert select update

2. 付与できる特権を詳細に表示します。

   付与できる特権の詳細を表示します。

          DISPLAY GRANT PRIVILEGE loans ALL;

   以下を表示します。

          USER: delete display insert select update
          CREATOR: all
          DBA: all

## 4.20 REVOKE PRIVILEGE

`REVOKE PRIVILEGE`コマンドはテーブルからユーザの特権を削除します。

Syntax

      REVOKE privilege {, privilege} [ON] table [FROM] grantee {, grantee}

         [AS grantor];

  説明

  `privilege` | TABLE 4-3にリストされたいずれか１つ。
  `grantee` |
  いずれか１つ。 | `|CREATOR |DBA |PUBLIC |username` | `| | | |`
  特権を付与されたユーザ名。`CREATOR`はテーブル作成者。`DBA`は デーベース管理者。`PUBLIC`は全てのユーザ。`username`は システムのログイン名またはアカウント名。
  `grantor` |
  いずれか１つ。 | `|CREATOR |DBA |username` | `| | |`
  特権を付与するユーザ。`grantor`が指定されない場合、 省略値はコマンドの発行者となります。

注意

1. 3つの特権タイプ(`DBA`,`ALL`,`USER`)があります。 Table 4-4に示しています。

2. 付与者によって与えられた特権は、同じ付与者によって削除できます。しかしなが ら、`CREATOR`および`DBA`は、どんな特権も無効にすることができます。
3. 特権はテーブル同様に、VIEW上でも与えたり削除することができます。

必要な特権

  削除する特権の付与者でなくてはなりません。

例

  `auto parts`テーブル上のユーザ`mosca`が持つ`INSERT` 特権を削除します。

         REVOKE INSERT ON 'auto parts'
            FROM mosca;

## 4.21 LOCK LEVEL

`LOCK LEVEL`コマンドは、テーブルのロックレベルを設定します。次に `LOCK LEVEL`コマンドを発行するまでその設定は全ユーザに有効となります。

ロックレベルの設定は、マルチユーザシステムでデータベースを扱う場合の アクセス制御をすることを目的にしています。

Syntax

  `LOCK LEVEL [ON] table [IS]` | `|TABLE |GROUP [(n)] |RECORD [(n)] |NULL` | `|; | | |`

注意

1. `NULL`が指定された場合、指定テーブルのロックは無効となります。

2. `TABLE`が指定された場合、SQLコマンドの処理中はテーブル全体がロック されます。

3. `GROUP`が指定された場合、SQLコマンドの処理中は処理している 全レコード（テーブル全体でない）をロックします。

   SQLコマンドの中で使用されたフィールドにインデックスが無ければ、グループの ロックレベルはテーブルのロックレベルと同一になります。

4. `RECORD`が指定された場合、SQLコマンドが処理する各レコードだけが ロックされます。

5. `RECORD (n)`を指定された場合、SQLコマンドが処理する各レコードの 前後(n-1)分のレコードをロックします。

6. VIEWにロックレベルを設定しても効果はありません。

7. テーブルが作成された時に設定されるロックレベルは、データディクショナリー `tabzero`ファイル中のシステム変数`MSDBLOCKLEVEL`によて制御され ます。初期値は`RECORD`レベルです。

必要な特権

  ロックするテーブルに`ALTER`特権が必要です。

例

1. テーブルのロックを無効にします。

   `personnel`テーブルのロックレベルをNULLにします。

          LOCK LEVEL ON personnel IS NULL;

2. テーブルにレコードレベルのロックを設定します。

   `loans`テーブルをレコードレベルのロックに設定します。

          LOCK LEVEL ON loans IS RECORD;

## 4.22 CREATE MODULE

The `CREATE MODULE`コマンドはデータ・ディクショナリーへPSM (Parsistant Stored Module)モジュールの定義を格納するために使用されます。 これは、ユーザに定義された機能、オペレーター、手続きあるいは総計機能のための エントリーポイントを作成します。`UPDATE MODULE`コマンドは、モジュール 定義をモジュールロード可能なシェアードライブラリとリンクするために必要です。

Syntax

      CREATE MODULE module_name

         [LANGUAGE C [(lang_param {, lang_param})]]

  |  |  | `|module_procedure |module_function |module_operator |module_agg_func` | `|; { | | |` | `|module_procedure |module_function |module_operator |module_agg_func` | `|;} | | |`

         END MODULE;

  説明

  `module_name` | モジュール名。
  `lang_param` | 現在、Empressで使用していません。
  | `module_procedure` | 以下の定義を行ないます。
      [DECLARE] PROCEDURE procedure_name

         ([[| IN  |] [parameter_name] parameter_type
            | OUT |
            |INOUT|

         {, [| IN  |] [parameter_name] parameter_type}])
             | OUT |
             |INOUT|

         [ALLOCATE WORKSPACE |  nbytes  |]
                             | variable |

         EXTERNAL [BEGIN EXPRESSION external_routine_name]
                  [NAME external_routine_name]
                  [END EXPRESSION external_routine_name]

         [|PARAMETER STYLE SQL    |]
          |PARAMETER STYLE GENERAL|
  `module_function` | 以下の定義を行ないます。
      [DECLARE] FUNCTION function_name

         ([[IN] [parameter_name] parameter_type

         {, [IN] [parameter_name] parameter_type}])

         RETURNS return_type

         [ALLOCATE WORKSPACE |  nbytes  |]
                             | variable |

         EXTERNAL [BEGIN EXPRESSION external_routine_name]
                  [NAME external_routine_name]
                  [END EXPRESSION external_routine_name]

         [|PARAMETER STYLE SQL    |]
          |PARAMETER STYLE GENERAL|
  `module_operator` | 以下の定義を行ないます。
  `[DECLARE] OPERATOR` | `|PREFIX` | `|POSTFIX |INFIX [precedence] |COMPARISON |EQUALITY` | `| operator_name | | | |`
         ([[IN] [parameter_name] parameter_type

         {, [IN] [parameter_name] parameter_type}])

         RETURNS return_type

         [ALLOCATE WORKSPACE |  nbytes  |]
                             | variable |

         EXTERNAL [BEGIN EXPRESSION external_routine_name]
                  [NAME external_routine_name]
                  [END EXPRESSION external_routine_name]

         [|PARAMETER STYLE SQL    |]
          |PARAMETER STYLE GENERAL|
  `module_agg_func` | 以下の定義を行ないます。
      [DECLARE] AGGREGATE FUNCTION aggr_function_name

         ([IN] parameter_name] parameter_type

         {, [IN] [parameter_name] parameter_type})

         RETURNS return_type

         [ALLOCATE WORKSPACE | nbytes |]
                             |variable|

         EXTERNAL [BEGIN EXPRESSION external_routine_name]
                  BEGIN GROUP external_routine_name
                  BODY external_routine_name
                  END GROUP external_routine_name
                  [END EXPRESSION external_routine_name]

         [|PARAMETER STYLE SQL    |]
          |PARAMETER STYLE GENERAL|

注意

1. EmpressのPSMには、現在Cプログラミング言語だけがサポートされて います。今後、他の言語がサポートされるかもしれません。

   Cプログラミングでの記述は大文字、小文字両方とも可能です。

2. パラメータモードとして`IN`、`OUT`、`INOUT`があり それぞれ入力、出力、入出力となります。省略値は`IN`です。

3. `parameter_type`には3種類のグループがあります。

   MSデータタイプ | Empress SQLデータタイプです。 データタイプを参照してください。
   汎用データタイプ | Empress汎用データタイプです。Empress: ユーザ定義関数 のData Type Correspondences を参照してください。
   Cデータタイプ
   | Cプログラミング言語のデータタイプです。 データタイプの前に、キーワード`C`を付け、引用符で囲まなくてはなりま せん。`"C long"`

   パラメータは違うグループの混在も許可します。

            (number "C long",
             string CHAR,
             amount GENERIC FLOAT)

4. `return_type`は、`parameter_type`のように 異なるグループを持つ可能性があります。

5. 以下に示す5つのオペレータークラスがあります。

   - `PREFIX`
   - `POSTFIX`
   - `INFIX [precedence]`
   - `COMPARISON`
   - `EQUALITY`

   `INFIX`オペレータークラスの`precedence`は、`1`, `2`,`3`,`4`,`5`,`6`, `right`。 booleanオペレターは、`1`,`2`のみ有効、省略値は2です。 数学オペレーターは、すべて、省略値は`4`です。

6. パラメータスタイルは、`PARAMETER STYLE GENERAL`または `PARAMETER STYLE SQL`です。省略値は`PARAMETER STYLE GENERAL`です。

7. 下記に、手続き、機能、オペレーターおよび統計機能に説明します。

   名前のルール

   - データベース中には同一のモジュール名は許可されません。
   - モジュールの中には、
     - パラメータが違えば同一名のルーチンは許可されます。
     - `BEGIN EXPRESSION`BEGIN EXPRESSIONの同一の外部ルーチン名は許可 されます。
     - `BEGIN GROUP`BEGIN GROUPの同一の外部ルーチン名は許可されます。
     - `BODY`BODYの同一に外部ルーチン名は許可されません。
     - `END GROUP`END GROUPの同一の外部ルーチン名は許可されます。
     - `END EXPRESSION`END EXPRESSIONの同一の外部ルーチン名は許可され ます。
   - モジュールを横切る同一のルーチン名は許可されません。

   モジュール名、ルーチン名および外部名の前方または後方のブランクは無視され ます。先頭はアンダースコア(_)または、英字で始まり、アンダースコアまたは英数字 で構成され、最大31文字以内で構成されなくてはなりません。

8. `external_routine_name`は５つに分類されます。

   - external begin expressionルーチン名
   - external begin groupルーチン名
   - external bodyルーチン名
   - external end groupルーチン名
   - external end expressionルーチン名

   集計関数は5つ全てのクラスが存在しますが、他のルーチンではbegin groupと end groupは存在しません。

   外部BODYルーチン名は、統計機能と他のルーチン用の外部名節のために、 (`NAME`)とBODY節(`BODY`)によって指定されます。 省略時の外部BODY名はルーチン名と同じです。

   External begin groupとend groupルーチン名は、統計関数のために指定されます。 一般的にbegin group expressionルーチン名はリターン値のために、初期化と end groupルーチンで使用されます。

9. `ALLOCATE WORKSPACE`が指定された場合、Empressは自動的に PSMのために作業用スペースの確保と開放を行ないます。

   変数名がworkspaceに対して与えられる場合、外部ルーチンの中で同一の変数名を 定義しなくてはなりません。

10. `CREATE MODULE`が完了したら手続き、機能、オペレーター、統計機能を 使用するためにはモジュール定義をモジュールロード可能なシェアードライブラリと リンクするために、`UPDATE MODULE`を実行しなくてはなりません。

11. 詳細は、ユーザ定義関数マニュアルの Persistent Stored Modules (PSM)を参照してください。

必要な特権

  `DBA`特権

例

1. 次の例はモジュール手続き`procmodule`を作成します。 例の手続き`log_even`tはaudit trail logを作成するために使用されます。

          CREATE MODULE procmodule
             PROCEDURE log_event ()
                EXTERNAL;
             END MODULE;

2. 次の例はモジュール関数`funcmodule`を作成します。このモジュール 機能は2つの機能`replacenull`と`roundup`を宣言します。

   例の関数`replacenull`は、`NULL`値を指定された文字列に変換 します。関数`roundup`は、指定された10進数字を四捨五入します。

          CREATE MODULE funcmodule
             FUNCTION replacenull (stringvalue CHAR, defaultstring CHAR)
                RETURNS CHAR
                EXTERNAL;
             FUNCTION roundup (number GENERIC FLOAT, digits GENERIC FLOAT)
                RETURNS GENERIC FLOAT
                EXTERNAL;
             END MODULE;

   `replacenull`と`roundup`関数がEmpressの組込み関数 `nullval`と`roundと`同じものであることに注意してください。 `nullval`および`round`は、この例の中で使用することができない Empressキーワードです。

3. 次の例はモジュール・オペレーター`opermodule`を作成します。 例のオペレーター`concatenation`は文字データを連結します。この オペレーターはEmpressオペレーターconcatと同じものです。

          CREATE MODULE opermodule
             OPERATOR INFIX concatenation
                (str1 "C char", str2 "C char")
                RETURNS "C char"
                EXTERNAL;
             END MODULE;

4. 次の例はモジュール集計関数`aggrmodule`を作成します。 例の集計関数`ssd`は、集計のxデータの2乗された標準偏差に関連した最終の 総計の値を算出します。

          CREATE MODULE aggrmodule
             AGGREGATE FUNCTION ssd (LONGFLOAT)
                RETURNS LONGFLOAT
                ALLOCATE WORKSPACE somespace
                EXTERNAL BEGIN GROUP ssdigrp
                         BODY ssdrfns
                         END GROUP ssdtgrp;
             END MODULE;

   例中の外部ルーチンは、EMPRESS: ユーザ定義関数を参照してください。

## 4.23 UPDATE MODULE

`UPDATE MODULE`コマンドはモジュール定義をモジュールロード可能な シェアードライブラリとリンクします。

Syntax

      UPDATE MODULE module_name [FOR system_name] [|FROM | dll_file];
                                                   |USING|

  説明

  `module_name` | モジュール名。
  `system_name` | Empress RDBMSライセンスで有効なシステムID。
  | `dll_file` | 動的にロード可能なシェアードライブラリオブジェクトファイル名。

注意

1. PSMルーチンのインプリメンテーションを備えたモジュールを更新するために、 `UPDATE MODULE`コマンドは、`FROM dll_file`か `USING dll_file`オプションと共に通常使用されます。

2. モジュールが、古いバージョン(例えばバージョン8.20)からより新しい バージョン(例えばバージョン8.62)に変換される場合、その古い`wrap.dll`は 新バージョン上で実行することができません。 データベースがより新しいバージョンに改良される場合のみ、`FROM dll_file` か`USING dll_file`オプションのない`UPDATE MODULE`コマンドを使用 してください。 この場合、与えられたモジュール用の`wrap.dll`ファイルを再生成します。

3. モジュールが動的なロード可能なシェアードライブラリオブジェクトファイル の内容かパスが変更された場合、`UPDATE MODULE`コマンドを使用することが できます。

4. `system_name`は以下のコマンドで取得できます。

          empvers

   上記コマンドはシステムプロンプトで実行し、以下のような表示がされます。

         EMPRESS V8.62
         (c) Copyright Empress Software Inc. 1983, 2002
       for Intel x86 running Linux OS Release 2.0 with libc.so.6 (ELF)
       [linux-libc6-x86]
       Port Code DOCS-08.62-A-00-S-ENG
       Port Code DOSV-08.62-A-00-S-ENG
       Port Code HYPM-08.62-A-00-S-ENG
       Port Code JDBC-08.62-A-00-S-ENG
       Port Code ODBC-08.62-A-00-S-ENG
       Port Code RDBM-08.62-A-00-S-ENG
       Installed in: /home/staff/joe/empress/v8.62

   システム名は、鍵括弧で囲まれた中に示されます。`linux-libc6-x86`

必要な特権

  `DBA`特権

例

  下記コマンドは、動的なロード可能なシェアードライブラリオブジェクトファイル `procmodule.dll`からのモジュール`procmodule`を更新します。

         UPDATE MODULE procmodule FROM 'procmodule.dll';

## 4.24 DROP MODULE

`DROP MODULE`コマンドはデータベースデータディクショナリーから モジュール定義を削除します。モジュールに定義されるどんな機能、手続き、 オペレーターおよび総計機能も使用できなくなります。

Syntax

      DROP MODULE module_name;

  説明

  `module_name` | モジュール名。

注意

  モジュール削除には警告メッセージは表示されません。

必要な特権

  `DBA`特権

例

  下記は、`procmodule`という名前のモジュールを削除します。

         DROP MODULE procmodule;

## 4.25 DISPLAY MODULE

`DISPLAY MODULE`コマンドは、データベースデータディクショナリーからの モジュール定義を表示します。

Syntax

  `DISPLAY MODULE [module_name] [ALL] [DUMP] [` | `|INTO |ONTO` | `| file]; |`

  説明

  `module_name` | モジュール名。

注意

1. モジュール名が指定されない場合、`DISPLAY MODULE`コマンドは データベース中のすべてのモジュールの定義を表示します。

2. `ALL`オプションのない`DISPLAY MODULE`コマンドは、 このモジュールが利用可能なシステム、モジュール中のすべてのSQLで起動する ルーチンおよびそれらの外部名前を表示します。

   モジュールがどのシステムにも有効でない場合(`NONE`表示)は、作成されたが リンクされていない(`UPDATE MODULE`コマンドで)ことを意味します。

3. `DISPLAY MODULE`コマンドに`ALL`オプションを指定すると、 次のモジュールについての補足情報を提供します。パラメーター情報、 リターンデータタイプ、パラメータースタイル、モジュールの作成者、 モジュール番号、モジュールを作成したプログラミング言語(現在はCプログラミング 言語のみです)。

4. `DUMP`が指定された場合、出力は圧縮され、スクリプトファイルを 作成するために使用することができます。

5. `INTO file`または`ONTO file`が指定された 場合、出力はターミナルへではなく指定されたファイルへ送られます。 `ONTO`は追記しますが`INTO`はファイルに上書きします。 またどちらもファイルが存在しない場合はファイルを作成します。

必要な特権

  `DISPLAY`特権

例

  以下に表示の違う`DISPLAY MODULE`コマンドを示します。

         * DISPLAY MODULE;

           aggrmodule
           funcmodule
           opermodule
           procmodule

         * DISPLAY MODULE funcmodule;

           ****  Database: repairs  ****

           ***  Module: funcmodule  ***

               Available for systems:
                 NONE

               replacenull                     function
                 External Name:                  replacenull

               roundup                         function
                 External Name:                  roundup

         * DISPLAY MODULE ALL;

           ****  Database: repairs  ****

           ***  Module: aggrmodule  ***

               Available for systems:
                 NONE

               ssd                             aggregate function

           ***  Module: funcmodule  ***

               Available for systems:
                 NONE

               replacenull                     function
               roundup                         function

           ***  Module: opermodule  ***

               Available for systems:
                 NONE

               fact                            postfix operator

           ***  Module: procmodule  ***

               Available for systems:
                 NONE

               log_event                       procedure

         * DISPLAY MODULE funcmodule ALL;

           ***  Module: funcmodule  ***

               Available for systems:
                 NONE

               replacenull                     function
                 Number of Parameters:           2
                      1)   in      stringvalue         character(25,1)
                      2)   in      defaultstring       character(25,1)
                 Return Data Type:               character(25,1)
                 Parameter Style:                general
                 External Name:                  replacenull

               roundup                         function
                 Number of Parameters:           2
                      1)   in      number              generic float
                      2)   in      digits              generic float
                 Return Data Type:               generic float
                 Parameter Style:                general
                 External Name:                  roundup

               Creator:         zsu
               Module #:        2
               Language:        C

         * DISPLAY MODULE DUMP;

           aggrmodule
           funcmodule
           opermodule
           procmodule

## 4.26 CREATE TRIGGER

`CREATE TRIGGER`コマンドはデータベースデータディクショナリーへ トリガ定義を作成します。

Syntax

  `CREATE TRIGGER trigger_name` | `|BEFORE |AFTER` | `| |`

  |  |  | `|DELETE |INSERT |UPDATE [ OF (attr {, attr})] |SELECT [ OF (attr {, attr})]` | `| {, | | |` | `|DELETE |INSERT |UPDATE [ OF (attr {, attr})] |SELECT [ OF (attr {, attr})]` | `| } | | |`

         ON table [FOR EACH ROW [when_clause]]

         EXECUTE procedure_name;

  説明

  `trigger_name` | トリガ名。トリガの命名規約はテーブル名、フィールド名と同様です。
  `when_clause` | 以下のシンタックスです。
  |  |  | `WHEN` | `|b_expr |(b_expr) |b_expr AND b_expr |b_expr OR b_expr |NOT b_expr` | `| | | | |`
  `b_expr`はブール式です。ブール式の詳細はWHERE句を参照してください。 サブクエリーはサポートしていません。 フィールド名の前には`NEW.`または`OLD.`が付けられます。 参照フィールドは、トリガが作成されたテーブルから行なわれます。
  `procedure_name` | PSM (パーシスタントストアドモジュール)のプロシージャ名です。

注意

1. トリガを作成する時に指定する`procedure_name`は、`CREATE MODULE`コマンドで定義されていない場合にはエラーメッセージを表示します。

   トリガを使用する前には、`UPDATE MODULE`を発行する必要があります。 発行しないと`procedure_name`が存在しない旨のエラーメッセージを表示 します。

2. トリガのための`procedure`はパラメーターのないPSMプロシージャ です。パラメーターを備えたモジュール`procedure`が`CREATE TRIGGER` コマンドと共に使用されると、エラーメッセージを表示します。

3. `FOR EACH ROW`オプションなしで作成されるトリガは`ステート メントトリガ`と呼ばれます。SQLコマンドが実行され、オペレーションが複数の レコードに適用される場合でも、それはファンクションを起動します。

   `FOR EACH ROW`オプションで作成されるトリガは`列トリガ`と 呼ばれます。オペレーションがデータのレコードに適用されるごとに、それは ファンクションを起動します。

4. トリガはステートメント/オペレーション(`INSERT`、`DELETE`、 `UPDATE`)が列/レコードの上で試みられる前、あるいはオペレーションが完了 した後に、明示することができます。 `SELECT`トリガの場合には、`SELECT`操作が完了した後だけに、 明示することができます。

5. `UPDATE`および`SELECT`トリガは対応する複数のフィールドを指定する ことができます。フィールドが指定されない場合、テーブル内の全てのフィールドが 対象となります。

6. `when_clause`は`FOR EACH ROW`オプションに関係しています。 `FOR EACH ROW`が`CREATE TRIGGER`コマンドの中で指定されていない 場合、`when_clause`は割り当てることができません。 一旦アクセスされたレコードが`where_clause`の条件を満たす場合、 `FOR EACH ROW`オプションのために割り当てられたトリガが有効となります。

7. `when_clause`の指定はWHERE句の指定と似ています。サブクエリーは サポートされていません。

8. `when_clause`の中でフィールド値を使用する場合。

   - `UPDATE`トリガについては、`INSERT`トリガのために既存の フィールド値(次のように指定された `old.attr`)、および新しい フィールド値(次のように指定された`new.attr`)を参照します。
   - `INSERT`トリガについては、新しいフィールド値を単に参照することが できます。既存のフィールド値は意味がありません。
   - `BEFORE DELETE`トリガについては、既存のフィールド値を単に参照 することができます。新しいフィールド値は意味がありません。
   - `AFTER DELETE`トリガについては、既存のフィールド値も新しい フィールド値も意味があります。
   語句を間違えた場合、エラーメッセージは表示されません。また、フィールド値は `NULL`として扱われます。

9. updateトリガを使用する場合。

   - 列トリガについては、トリガが起動されるかどうかは既存のレコード および新しい値を比較して決定されます。複数のフィールドが指定された場合指定 されたフィールドだけがチェックされます。フィールドの指定がない場合は全ての フィールドがチェックされます。対応する値が同じである場合、トリガは起動されません。
   - ステートメントトリガについては、値がチェックされずにトリガを起動 します。値が更新の前後でに同じでも、トリガは起動されます。

10. テーブル名およびフィールド名(`RENAME`コマンドによる)の変更は既存 のトリガに効果がありません。トリガは、新しい名前のもとで正確に自動的に機能 します。

11. フィールドの変更(`ALTER TABLE`コマンドによる)より、テーブルを 変更してもトリガに効果がありません。トリガは、新しいテーブル構造のもとで正確に 自動的に機能します。フィールドが削除された場合、設定されたトリガはすべて削除 されます。

12. トリガはVIEWに対しても有効です。

13. トリガは、`ALTER TABLE`コマンドの使用により一時的に無効にしたり 有効にしたりできます。トリガの作成時は自動的に有効となります。

14. 多数のトリガが同じ出来事のために作成される場合、トリガ定義内の優先度は 実行されるトリガ手続きの順序を決定します。トリガが作成される場合、優先度は 0.000にセットされます。トリガの優先度を変更する場合は`ALTER TABLE` コマンドを使用します。

15. トリガ定義は`DISPLAY TABLE table_name ALL`コマンドによって表示 できます。

必要な特権

  `ALTER`特権

例

  `loans`テーブルが更新される場合のトリガ、`history_log`を 作成します。手続き`log_event`は更新を記録するために実行されます。

  最初のステップはユーザに定義された手続きを作成することです。この例における 手続きは以下に示す`user.c`内にあります。

         #include   <usrfns.h>
         #include   <time.h>

         static void  print_rec (void*   mr,
                                 void*   rec,
                                 char*   tag)
         {
            extern  char*   mrganame (addr);

            void*           attr;
            int             i;
            char*           val;

            for (i = 1; ; ++i)
            {
               attr = mrigeta (mr, i);
               if (attr == 0)
               break;

               val = mrgetvs (rec, attr);
               if (val == 0)
                  val = "(NULL)";

               printf ("\t%s %s = '%s'\n",
                        tag, mrganame (attr), val);
            }
         }

         static void  trigger_proc (char*  procname)
         {
            extern  char*   mrgname ();
            extern  int     strcmp ();

            time_t  t;
            void*   mr;
            void*   newrec;
            void*   oldrec;
            char*   s;

            mspsm_trig_get_record_info (& mr, & oldrec, & newrec);

            printf ("+++ Trigger Procedure +++  %s  for table '%s'\n",
                     procname, mrgname (mr));
            time (& t);
            printf ("\ttime: %s", ctime (& t));
            if (oldrec == 0)
                printf ("\tNo Old Record\n");
            else
                print_rec (mr, oldrec, "Old");
            if (newrec == 0)
                printf ("\tNo New Record\n");
            else
                print_rec (mr, newrec, "New");
         }

         void    log_ins_upd_del ()
         {
             trigger_proc ("log_ins_upd_del");
         }

  emppsmccコマンドでソースファイル`user.c`をコンパイルして、共有される オブジェクトファイル`user.dll`を作成します。

         emppsmcc -o user.dll user.c

  次のステップはモジュールおよびトリガを定義します。そして共有される オブジェクトファイル`user.dll`をモジュール定義にリンクします。

         CREATE MODULE for_trigger
            PROCEDURE log_event ( )
            EXTERNAL NAME log_ins_upd_del;
         END MODULE;

         CREATE TRIGGER history_log BEFORE
            INSERT OR DELETE OR UPDATE
            ON loans FOR EACH ROW
            EXECUTE log_event;

         UPDATE MODULE for_trigger FROM 'user.dll';

  表示コマンドを実行します。

         DISPLAY TABLE loans ALL;

  以下の表示をします。

         *** Table: loans ***

         Attributes:
           number                integer
           name                  char(25,1)
           date                  date(1)
           amount                dollar(6,1)

         Triggers:
           history_log
             before
             insert or delete or update
             for each row
             execute log_event
             priority 0.000
             enable

         Creator: joe
         Lock Level: RECORD

         Table #: 8
         Records: 12
         Record size: 36

  下記にトリガからのサンプル出力を示します。

         INSERT loans VALUES (5, 'Mosca', '2 Mar 1998', '999'
                              3, 'Jones', '7 Feb 1998', '800');

         +++ Trigger Procedure +++  log_ins_upd_del  for table 'loans'
                 time: Tue Mar  3 10:55:49 1998
                 No Old Record
                 New number = '5'
                 New name = 'Mosca'
                 New date = '2 March     1998'
                 New amount = '$999.00'
         +++ Trigger Procedure +++  log_ins_upd_del  for table 'loans'
                 time: Tue Mar  3 10:55:49 1998
                 No Old Record
                 New number = '3'
                 New name = 'Jones'
                 New date = '7 February  1998'
                 New amount = '$800.00'

         UPDATE loans SET amount = '999.99' WHERE date > '31 Dec 1997';

         +++ Trigger Procedure +++  log_ins_upd_del  for table 'loans'
                 time: Tue Mar  3 10:55:49 1998
                 Old number = '5'
                 Old name = 'Mosca'
                 Old date = '2 March     1998'
                 Old amount = '$999.00'
                 New number = '5'
                 New name = 'Mosca'
                 New date = '2 March     1998'
                 New amount = '$999.99'

         DELETE loans WHERE amount > 800;

         +++ Trigger Procedure +++  log_ins_upd_del  for table 'loans'
                 time: Tue Mar  3 10:55:49 1998
                 Old number = '5'
                 Old name = 'Mosca'
                 Old date = '2 March     1998'
                 Old amount = '$999.99'
                 No New Record

  上記のトリガが`FOR EACH ROW`オプションなしで定義された場合には、

         INSERT loans VALUES (5, 'Mosca', '2 Mar 1998', '999'
                              3, 'Jones', '7 Feb 1998', '800');

  以下のような表示を行います。

         +++ Trigger Procedure +++  log_ins_upd_del  for table 'loans'
                 time: Tue Mar  3 10:55:49 1998
                 No Old Record
                 New number = '5'
                 New name = 'Mosca'
                 New date = '2 March     1998'
                 New amount = '$999.00'
                 No Old Record
                 New number = '3'
                 New name = 'Jones'
                 New date = '7 February  1998'
                 New amount = '$800.00'

## 4.27 DROP TRIGGER

`DROP TRIGGER`コマンドはデータベースデータディクショナリーから トリガ定義を削除します。

Syntax

      DROP TRIGGER trigger_name

  説明

  `trigger_name` | トリガ名。

注意

1. `DROP TRIGGER`はデータディクショナリーからトリガ定義を削除します。 トリガを削除しますがモジュール手続きは削除しません。モジュール手続きを削除する には`DROP MODULE`を使用してください。

2. トリガ定義を削除する代わりに`ALTER TABLE`コマンドの使用により 一時的にトリガを無効または有効になることができます。

必要な特権

  `ALTER`特権

例

  トリガ`history_log`を削除します。

         DROP TRIGGER history_log;

  `loans`テーブルのデータディクショナリーからトリガを削除します。

## 4.28 DISPLAY DATABASE

`DISPLAY DATABASE`コマンドは、データベースの名前、およびデータベース 中のテーブルの名前を表示します。

Syntax

  `DISPLAY` | `|DATABASE |DB` | `| [database] [ON [TABLE] |` | `|table |[NOT] match_op pattern` | `|] |`

  |  |  | `[ALL] [DUMP]` | `[` | `|INTO |ONTO` | `| file]; |`

  説明

  `match_op` | 次のいずれか１つ`LIKE`, `MATCH`, `!MATCH`, `SMATCH`, `!SMATCH`。
  `pattern` | `WHERE`句で指定するパターン。引用符で囲む必要があります。
  `file` | ファイル名。

注意

1. キーワード`DATABASE`は、`DB`と指定することができます。

2. データベース名が指定された場合、指定されたデータベース中のテーブルの名 がリストされます。データベース名が指定されない場合、現在のデータベース中の テーブルの名がリストされます。

3. テーブル名が指定された場合、そのテーブルのための情報だけが表示され ます。パターン・マッチが指定された場合、パターンと一致するテーブルの情報が表示 されます。

4. `ALL`が指定された場合、データベース中の各ユーザに作成された テーブルの構造も表示されます。`DUMP`は単なるデータベース中のテーブル名 をリストして、簡潔な形式で表示します。`ALL`が`DUMP`と共に使用 される場合、テーブル定義を含んで簡潔な形式で表示します。

5. `INTO file`または`ONTO file`が指定された 場合、出力はターミナルへではなく指定されたファイルへ送られます。`ONTO` は追記し、`INTO`は既存のファイルを上書きします。両方ともファイルが無い 場合には、ファイルを作成します。

6. データベースにテーブルがない場合、コマンドは単なるデータベースの名前を 表示します。

7. データベース中のテーブルと共に表示されます。

必要な特権

  データベース自体を表示するのに特権は必要しないが、テーブルについては `SELECT`特権が必要となります。

例

1. データベース中の全てのテーブルを表示すます。

   以下のコマンドでデータベース中の全テーブルを表示します。

          DISPLAY DB;

   以下の表示を行います。

          **** Database: repairs ****

          auto parts
          customers
          loans
          personnel

2. 全てのテーブルについて構造も表示します。

   全てのテーブルについて構造も表示します。

          DISPLAY DB ALL;

   以下の表示を行います。

          ***Database: repairs ****

          *** Table: auto parts ***

          supplier            char(20,1) Not Null
          phone               char(8,1)
          part name           char(25,1)
          part no.            longinteger
          price               dollar(4,1)

          *** Table: customers ***

          name                char(20,1) Not Null
          address             text(30,124,30,1)
          comments            text(25,1,80,1)

          *** Table: loans ***

          number              integer
          name                char(25,1)
          date                date(1)
          amount              dollar(6,1)

          *** Table: personnel ***

          number              integer
          name                char(25,1)
          phone               char(15,1)
          credit_limit        dollar(6,1)

3. 指定されたテーブルの構造を表示します。

   `loans`テーブルの構造を表示します。

          DISPLAY DB ON loans ALL;

   以下の表示を行います。

          **** Database: repairs ****

          *** Table: loans ***

          number             integer
          name               char(25,1)
          date               date(1)
          amount             dollar(6,1)

4. データベース中の全てのテーブル名をファイルに保存します。

   下のコマンドで全テーブル名を`dblist`ファイルへ保存します。

          DISPLAY DB INTO 'dblist';