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]]
constr プライムキーと外部キー制約条件です。次のうちの1つです。
  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になります。
attr_const プライムキーと外部キー制約条件です。次のうちの1つです。
  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. itemCREATE 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. 簡単なテーブルの作成

    フィールドnumbernamephonecredit_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));

    numberINTEGERとして、namephoneは 最大の長さ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));

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

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

  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));

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

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

    customersテーブルは1つのCHARと2つのTEXT データタイプ属性を含んでいます。nameNOT 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]]
constr1 Primary KeyまたはForeign Keyで抑制。以下のいずれかです。
  1. PRIMARY KEY [key_name] [ON] (attr {, attr}) [| BTREE      |]
                                                 | TIMESERIES |
  2. FOREIGN KEY [key_name] [ON] (attr {, attr}) [| BTREE      |]
                                                 | TIMESERIES | 
    
                       REFERENCES table (attr {, attr})
constr2 いずれか1つ。
  | 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. テーブルにチェックサムを加える場合、LONGVARBULKTEXTデータタイプのオーバーフロー(.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. テーブル名の変更

    テーブル名personnelemployeesに変更します。

       RENAME personnel TO employees;
    
    
  2. 複雑なテーブル名の変更

    テーブル名auto partspartsに変更します。

       RENAME "auto parts" TO parts;
    
    
  3. 複雑なフィールド名の変更

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

       RENAME parts."part no." TO numbers;
    
    
  4. 簡単なフィールド名を複雑な名前に変更する。

    テーブルpersonnelのフィールド名numberemployee 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 次のいずれか1つLIKEMATCH!MATCHSMATCH!SMATCHです。
pattern WHERE句で指定するパターンです。引用符で囲む必要があります。
file ファイル名。

注意

  1. ALLオプションのないDISPLAY TABLEコマンドはフィールド 情報、コメント、インデックス情報、制約条件を表示します。ALLオプション を指定した場合はトリガ定義、フィールドに関するコメント、範囲チェック、作成者、 ロックレベル、チェックサム変数(Empress: Database Administrator's GuideDirty 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データ構造を作成します。インデックスは、 フィールドへのアクセスを向上させます。インデックスは、TEXTBULKのデータタイプのような可変長データには作成できません。

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
いずれか1つ。 |BTREE
|TIMESERIES
|
|

省略値はBTREEです。

注意

  1. DISTINCTUNIQUEと同義語として使用されます。 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テーブルに制限を付加(社員1人にローン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です。 EXCLEXCLUSIVEと、またINCLINCLUSIVEと同義語です。 省略値は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部分は関数(MAXAVGなど)、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の更新により各基本テーブルの 各フィールドがそれぞれ更新されます。

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

    第3の条件は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 DATABASEDISPLAY 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 StringsEmpress 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にリストされたいずれか1つ。
grantee
いすれか1つ。 |CREATOR
|DBA
|PUBLIC
|username
|
|
|
|

特権を付与されるユーザ名。CREATORはテーブル作成者。 DBA はデータベース管理者。PUBLICは全てのユーザ。username はシステムのログイン名またはアカウント名です。

grantor
いずれか1つ。 |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(管理者)、ALLUSERがあります。

    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の 特権を与えることは、それらがDBACREATORになるとともにユーザ によって特権を継承する手段を提供します。

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

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

  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特権を ユーザmoscakilroyに付与します。

       GRANT SELECT, INSERT ON 'auto parts'
          TO mosca, kilroy;
    
    
  2. 特権を付与オプションを付けて付与

    ユーザofficecustomersテーブルの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 次のいずれか1つLIKE, MATCH, !MATCH, SMATCH, !SMATCH
pattern WHERE句で指定するパターン。引用符で囲む必要があります。
username システムのログイン名またはアカウント名。

注意

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

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

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

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

注意

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

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

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

  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にリストされたいずれか1つ。
grantee
いずれか1つ。 |CREATOR
|DBA
|PUBLIC
|username
|
|
|
|

特権を付与されたユーザ名。CREATORはテーブル作成者。DBAは デーベース管理者。PUBLICは全てのユーザ。usernameは システムのログイン名またはアカウント名。

grantor
いずれか1つ。 |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. パラメータモードとしてINOUTINOUTがあり それぞれ入力、出力、入出力となります。省略値は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 EXPRESSIONBEGIN EXPRESSIONの同一の外部ルーチン名は許可 されます。
      • BEGIN GROUPBEGIN GROUPの同一の外部ルーチン名は許可されます。
      • BODYBODYの同一に外部ルーチン名は許可されません。
      • END GROUPEND GROUPの同一の外部ルーチン名は許可されます。
      • END EXPRESSIONEND EXPRESSIONの同一の外部ルーチン名は許可され ます。
    • モジュールを横切る同一のルーチン名は許可されません。

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

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

    • 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_eventはaudit trail logを作成するために使用されます。

       CREATE MODULE procmodule
          PROCEDURE log_event ()
             EXTERNAL;
          END MODULE;
    
    
  2. 次の例はモジュール関数funcmoduleを作成します。このモジュール 機能は2つの機能replacenullroundupを宣言します。

    例の関数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;
    
    

    replacenullroundup関数がEmpressの組込み関数 nullvalroundと同じものであることに注意してください。 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_fileUSING dll_fileオプションと共に通常使用されます。

  2. モジュールが、古いバージョン(例えばバージョン8.20)からより新しい バージョン(例えばバージョン8.62)に変換される場合、その古いwrap.dllは 新バージョン上で実行することができません。 データベースがより新しいバージョンに改良される場合のみ、FROM dll_fileUSING 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プロシージャ です。パラメーターを備えたモジュールprocedureCREATE TRIGGER コマンドと共に使用されると、エラーメッセージを表示します。

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

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

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

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

  6. when_clauseFOR EACH ROWオプションに関係しています。 FOR EACH ROWCREATE 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 次のいずれか1つLIKE, MATCH, !MATCH, SMATCH, !SMATCH
pattern WHERE句で指定するパターン。引用符で囲む必要があります。
file ファイル名。

注意

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

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

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

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

  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';