# 第二章: プロダクトの新機能と機能強化

## 2.1. 大文字と小文字の区別しない

ユーザーは initfile 中の Empress 環境変数 MSCASEINSENSITIVE をセットするよって、 システムを大文字と小文字の区別しないように設定できます。例えば、

            MSCASEINSENSITIVE=X

`MSCASEINSENSITIVE` をセットした後に、作成されたテーブル、ビュー、インデックス、アトリ ビュート、 参照とストアドプロシジャーなどのデータベースコンポーネントは大文字と小文 字の区別しません。

`MSCASEINSENSITIVE` をセットした後に、作成されたデータベースコンポー ネントは大文字と小文字の区別しません。

## 2.2. ストアドプロシジャー(PSM)の中で Empress の Dynamic/Embedded SQL を使用すること

Empress のストアドプロシジャーはユーザに定義された関数、プロシジャー、集計関数、 オペレーターおよびトリガを含むことのダイナミックにロード可能なライブラリです。 ユーザに定義されたデータベースオブジェクトとして保存可能なプロシジャーはストアドプロシジャーと呼ばれます。 Empress バージョン 8.62 では、ユーザが、Empress Dynamic/Embedded SQL インターフェース(DSQL/ESQL)を使用して、ストアドプロシジャーを書くことができます。

### 2.2.1 DSQL/ESQL で書かれたストアドプロシジャーをコンパイルする方法

DSQL/ESQL で書かれたストアドプロシジャーは Empress ユティリィティ「empesql」 でプリコンパイルすることができます。その後、「emppsmcc」でコンパイルして、ダイナミッ クリンクライブラリを生成します。

### 2.2.2 トリガの中で使用された新しい予約カーソル名

トリガの為に、次の2つ新しい予約カーソル名は

            emptrig_cursor_old
            emptrig_cursor_new

Empress バージョン __ TAG_VERSION__に導入されます。古い/新しい、 挿入された/更新された/削除されたレコードの値をアクセスするために、使用することができます。

Empress トリガでは、FETCH シンタックスが以下のように定義されます：

            EXEC SQL FETCH  | emptrig_cursor_old |  [attr_list]
                            | emptrig_cursor_new |

                    INTO    | value_list                |
                            | SQL descriptor desc_name  |

注意：

予約されたカーソルについては、ユーザが宣言する (Declare) こと、オープン/クロスすること、 ドロプすることができません。FETCH のオプションも使えません。例えば、next, prior, absolute <position>, related <position>。

UPDATE シンタックスが以下のように定義されます：

            EXEC SQL UPDATE |<table>| SET |attr-list VALUES variable-list    |
                            |CURRENT|     |attr = variable {,attr = variable}|

            WHERE CURRENT OF emptrig_cursor_new;

注意：

UPDATE コマンドについては、ユーザがテーブル名を指定するか、 あるいは現在のテーブルを指定するためにキーワード「current」を使用することができます。 テーブル名が指定されるられる場合、テーブルチェックが実行されます。

"emptrig_cursor_old" は UPDATE コマンドで使用することが出来ません。UPDATEコマンドが "after trigger" で使用されている場合には、効果がありません。

予約されたカーソルは通常の DSQL/ESQL プログラムで使用できません。 そうでなければ、次のメッセージが生成されます：

    "fetch/update trigger cursor と abort trigger operation はトリガプロシジャー
    のみ使用できます。"

### 2.2.3 ABORT TRIGGER

ABORT TRIGGER コマンドは次のシンタックスを持っています：

            EXEC SQL TRIGGER ABORT;

トリガプロシジャーのみ、使用できます。そうでなければ、次のメッセージが生成されます：

    "fetch/update trigger cursor と abort trigger operation はトリガプロシジャー
    のみ使用できます。"

### 2.2.4 メモリ割付け

2つの新しいメモリ割付けステートメントが導入されます。さらに、これは通常の ESQL/DSQL プログラムの中で使用することができます。

            EXEC SQL MEMORY ALLOCATE <variable> '(' | constant    | ')'
                                                    | <variable>  |

            EXEC SQL MEMORY REALLOCATE <variable> '(' | constant   | ')'
                                                      | <variable> |

次のステートメントはメモリを解放するために使用することができます。

            EXEC SQL MEMORY FREE <variable> {, <variable>}

### 2.2.5 INIT と EXIT

ストアドプロシジャー（PSM）の中で使用された時、次のステートメントが無効です：

            EXEC SQL INIT;
            EXEC SQL DATABASE is "db";
            EXEC SQL EXIT;

ストアドプロシジャー（PSM）で、データベースを変更するために、「db:table」 を使用するべきです。

## 2.3. Empress 速度性能改良

Empress バージョン 8.62 は、Empress バージョン 8.60 と比較して、SQL 実行を著しく改善しました。

## 2.4 データベースロール

Empress バージョン 8.62 では、データベースロールの概念を導入しました。 ロールは、特権の管理しやすいことを目指しています。それらは、データベーステーブルへのアクセスをコントロールし、 より容易なデータベース管理を行います。

ロールは一般にタイトルあるいは一セットの特権であります。ロールは標準の SQL ステートメントを使用して、作成と削除することができます。

ロールは、許可によって、単一のユニットへユーザを集めることを可能にします。

「ユーザ」は SQL データにアクセスする実際の人あるいはプログラムのいずれかです。 ユーザはスキーマ外です。ユーザーを作成し、削除し、 かつ実際の人/プログラムにマッピングするために使用される方法は各ベンダーの自分のインプリメンテーションで定義されます。 Empress は、ユーザを作り、削除し、かつマッピングする特別のコマンドを提供しません。

ANSI SQL-99 標準に基く、Empressは「create role」、「grant role」、 「revoke role」と「drop role」コマンドをサポートします。

「create role」コマンドのシンタックスは次のとおりです：

        create role ROLE;

「create role」ステートメントは、ユーザではなくロールを定義します。 ロール名はデータベーススキーマで定義されたユーザ名と一致することが出来ません。 例えば、dba, user, PUBLIC, など。

「grant role」コマンドのシンタックスは次のとおりです：

        grant ROLE {, ROLE } to GRANTEE {, GRANTEE } [ WITH ADMIN OPTION ]

「grant role」ステートメントは、PUBLIC を含む(オプション)1つ以上の GRANTEE に、1つ以上のロールの使用を与えます。ROLE の譲渡者はもちろん、譲渡可能な ROLE (WITH ADMIN OPTION)として保持しなければなりません。

オプション WITH ADMIN OPTION は譲渡可能なロールを定義します。

「revoke role」コマンドのシンタックスは次のとおりです：

        revoke [ ADMIN OPTION FOR ] ROLE {, ROLE } FROM GRANTEE {, GRANTEE }
                               { RESTRICT | CASCADE }

「revoke role」ステートメントは、1つ以上の GRANTEE からの1つ以上の ROLE の使用を不可にします。

ADMIN OPTION FOR は、譲渡者が ROLE の譲渡を不可能にします。

「revoke role」ステートメントが CASCADE を指定する場合、それは関連したロールをカスケード廃止します。 「revoke role」ステートメントが RESTRICT を含んでいる場合、無効にされているロールに依頼しているロールがなければ、廃止は成功します。

「drop role」コマンドのシンタックスは次のとおりです：

        drop role ROLE;

ROLEの作成者だけがそれを削除ことができます。ロールの使用を与えられた各ユーザ/ロールのために、RDBMS は次の廃止コマンドを呼びます。

        revoke ROLE from GRANTEE restrict.

例えば、ユーザ joe が次のシーケンスのコマンドを入力した場合：

        joe:     create role SUPPORT;
        joe:     grant SUPPORT to peter with admin option;
        joe:     grant SUPPORT to TECH;
        joe:     drop role SUPPORT;

peter はもう一人のユーザです。また、SUPPORT と TECH はロールです。「drop role」 コマンドは自動的に次の2つのコマンドを実行します：

                 revoke SUPPORT from TECH restrict;
                 revoke SUPPORT from peter restrict;

しかしながら、joe が SUPPORT ロールを削除する前に、peter は他のユーザに SUPPORT ロールを譲渡しました。 そのために、ロールを削除することができないので、「drop role」 コマンドは失敗します。

ロールは「display role」コマンドを使用して見ることができます。シンタックスは次のとおりです：

       display role [ROLE] [all] [| into | FILE];
                                  | onto |

このコマンドはデータベースにあるロールを表示し、 Empress の対話型の SQL の中で使用することができます。 ロールが指定されない場合、すべてのデータベースロールの情報が表示されます。 より多くの詳細を表示するために、キーワード「all」を使用して下さい。

「into」と「onto」のオプションを使うことによって、このコマンドはロール情報を新しいファイル、 或いは、既存のファイルに出力します。

display コマンドについて、詳しく、次のコマンドを使用してください：

                    help display;

データベースロールについて、詳しく、次のコマンドを使用してください：

                    help role;

## 2.5. SQL の拡張

Empressバージョン8.62で、次の SQL 拡張を加えました。

            select attr1 = "ABC", attr2 from tableX

attr1 = "ABC" が結果セット中の第1のカラムに値を ”ABC" にします。

## 2.6. SET オペレーションのデータタイプ変換の改善

Empress バージョン 8.62 で、セットオペレーションのためのデータ変換を含めました。

例えば,

            select attr1 from t1
                    union all
            select attr2 from t2

仮に、attr1 が char(10) として定義され、attr2 が char(20) として定義される、 上記の SQL ステイトメントは、次のように修正して、Empress バージョン 8.60 で実行することができます:

            select attr1 convert to char(20) from t1
                    union all
            select attr2 from t2

Empress バージョン 8.62 では、データの変換は自動的に行 います。

データの変換は次の4つのデータタイプカテゴリーの中で行われます。

            Numeric
            Char/Text
            Bulk
            Date/Time/Microtimestamp

Empress はカテゴリー間の変換をサポートしません。カテゴリー間の変換はシステムの「CONVERT TO」を使用して下さい。

## 2.7 新しい変数

バージョン 8.62 では、以下の新しい環境変数が導入されます。

- MSCASEINSENSITIVE
- MSDBLOCKGRANULARITY
- MSDBPUBLICPRIVILEGES
- MSDBVERSION_FEATURES
- MSNTMPFILECACHE
- MSQUOTEDIDENTIFIERS
- MSSELEXTFETCH
- MSSELMAXROWS
- MSSELTIMEOUT
- MSTMPFILECACHESIZE

詳しく、 [Volume A5: Database Administrator's Guide]を参照して下さい。

## 2.8 ユーザが定義できるロック粒度

Empress バージョン 8.62 では、ユーザに定義できるロック粒度が、 LOCK LEVEL コマンドに導入されます。LOCK LEVEL コマンドは、テーブルのロックレベルをセットします。 RECORD および GROUP ロックレベルに「n」粒度の設定が導入されます。

新しいシンタクス：

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

- RECORD を指定した場合には、レコード個とにをロックします。
- RECORD (n) を指定した場合には、レコードを囲む周辺 n レコードをロックします。これはページロックを構成しています。

例えば：

100 の連続したレコードがトランザクション処理で更新したときに、ロックレベルは RECORD に設定されているときに、トランザクションはコミットやロールバックされるまでに、 ロックマネジャーに100 ロックが必要です。

ロックレベルは RECORD(5) に設定されているときに、トランザクションはコミットやロールバックされるまでに、 ロックマネジャーに約 20 ロックが必要です。

ロック粒度値を選ぶことは、並行処理と性能のトレードオフです。

## 2.9 SELECT ステートメントのトリガ

DELETE、UPDATE および INSERT 文のトリガに加えて、Empress RDBMS は、SELECT 文のトリガを導入します。SELECT 文のトリガは、データベースに格納され、 かつ、ユーザがデータベースで SELECT コマンドを実行するとき、Empress RDBMS エンジンによって自動的に実行されるプロシージャです。

Empress RDBMS はレコード単位またはステートメント単位の SELECT トリガ を提供します。

SELECT 文にトリガを付けることは Empress にデータベース競争の優位を与えて、 次の目的を達成するために使用することができます:

- データベーステーブルアクセスにより高いレベルのセキュリティをインプリメントすることが出来ます。
- データベーステーブルアクセスの統計
- 企業データウェアハウスシステムでの情報のモニターリング
- データベース WEB 出版にクエリータイプおよびユーザプリファランスを記録すること

新しい SELECT トリガコマンドシンタックスは標準の「create trigger」コマンドに従います。

      create  trigger TRIGGER | before |
                              | after  |

        |              delete                    |
        |              insert                    |
        | update [ of ( ATTR_NAME {, ATTR_NAME}) |
        | select [ of ( ATTR_NAME {, ATTR_NAME}) |

        { ,  |              delete                    | }
             |              insert                    |
             | update [ of ( ATTR_NAME {, ATTR_NAME}) |
             | select [ of ( ATTR_NAME {, ATTR_NAME}) |

        on TABLE [for each row [when CONDITION]]

        execute PROCEDURE_NAME;

データベーストリガはテーブルに関係しているパラメーターのないプロシージャです。 指定された SQL ステートメントが実行される場合、Empress RDBMS は自動的にトリガを実行します。

トリガはオペレーション(INSERT、DELETE、UPDATE)がレコードの上で実行する前に、 あるいはオペレーションが完成した後、実行すると明示することができます。 SELECT トリガの場合には、SELECT オペレーションが完成した後だけ、実行されます。

トリガに関連する UPDATE および SELECT ステートメント属性リストを指定することができます。 属性が指定されない場合、それはテーブルのすべて属性を意味します。

「when CONDITION」は「for each row」と一緒に使わなければなりません。「when CONDITION」は「for each row」が使用されている場合には、「when CONDITION」に満たしたレコードのみ、トリガが実行されます。

「when」文中のアトリビュートはトリガに関連したテーブルの属性です。属性に「new」と「old」 がつけられます。サブクエリーをサポートしません。

トリガを削除するために、「drop trigger」コマンドは使用されます。

シンタクス：

         drop trigger TRIGGER;

「display trigger」について、以下のコマンドを実行して下さい。

                    help display;

トリガを有効にする/無効にする、又は、プライオリティを変更するについて、以下のコマンドを実行して下さい：

                    help alter;

## 2.10 マルチスレッドのクライアント

バージョン 8.62 では、Empress ODBC/JDBC クライアントをマルチスレッドクライアントにしました。

前の Empress バージョンでは、例えば、スレッドの中で Empress ドライバーを使用することができるかもしれません。 しかし、スレッドの中でオペレーションは順番に並べて実行されます。バージョン 8.62 では、 真実の並列実行をサポートします。複数のスレッドの中で ODBC および JDBC クライアント/サーバードライバーを使用することができます。

Empress の ODBC/JDBC Local Access ドライバーはスレッドセーフです。スレッドアプリケ−ションで使用できますか、 真実の並列実行が提供されていません。

マルチプロセッサーシステムにおいては、マルチスレッドアプリケーションが真実の並列実行を提供し、 1つ以上の無関連のタスクを同時に実行することができます。2つのプロセッサーアーキテクチャー上で走る、 マルチスレッドアプリケーションがシングルスレッドアプリケーションより大きな性能改良ができます。しかしながら、 データベースアプリケーションは通常計算集約的ではありません。スレッドを使うことによって、性能改良に結びつかないかもしれません。

スレッドは強力な利点を持っているにもかかわらず、スレッドを使うことによってそのコストがあります。例えば、 スレッドの同期とスケジューリングによるオーバーヘッド、強いプログラミング訓練、難しいマルチスレッドアプリケーションのデバッグ など。

データベースアプリケーションプログラマは、スレッドの使用の決定を非常に注意深くとるべきです。

Empress ODBC または JDBC のクライアント/サーバードライバーを使用するデータベースアプリケーションでの真実の並列実行を得るために、 各スレッドとそれらの独自のデータベース接続を関連させることにより、同時 SQL オペレーションを行えます。

## 2.11 Empress JAVA 対話式 SQL

Empress の JAVA の対話型の SQL はグラフィカルな JAVA SQL クライアントプログラムです。これはスタンドアロンの JDBC プログラムとしてセットアップされ、ローカルの　Empress　データベースの構造、テーブルとデータをブラウズするまたは SQL を実行することが出来ます。

Empress の JAVA の対話型の SQL は「empjavasql」コマンドで起動することができます。

## 2.12 ANSI SQL-99 セットオペレーションのサポート

Empress バージョン 8.62 は ANSI SQL-99 UNION、UNION ALL、EXCEPT、EXCEPT ALL、INTERSECT と INTERSECT ALL をサポートします。

詳しく、 [Volume A4 SQL リファレンス]を参照して下さい。

## 2.13 ANSI SQL-99 外部結合のサポート

Empress バージョン 8.62 アプリケーションプログラムインターフェイスは ANSI SQL-99 外部結合のサポートします。

       LEFT OUTER JOIN
       RIGHT OUTER JOIN
       FULL OUTER JOIN

詳しく、 [Volume A4 SQL リファレンス]を参照して下さい。

## 2.14 Empress インポートユーティリィティの増強

Empress インポートユーティリィティ empimpt は バージョン V8.62 で、使っているバージョンの codeset と異なる codeset で作成されたインポートファイルからデータベースをインポートすることができます。

empimpt は codeset オプションを含んでおり、さらに利用可能なコードセットの一覧を表示します。

Empress ユーティリィティ empvers はバージョン V8.62で、codeset 情報を表示します。

例えば、

            empimpt -codeset SJIS db1.exp db2

empimpt はコードセット SJIS で格納される db1.exp をネイティブコードセット(例えばEUC-JP)に変換して、 データベースをインポートします。

詳しく、Empress インポートユーティリィティ empimpt の説明を参照して下さい。 (i.e. man empimpt、或は、empimpt -help)

## 2.15 予約語

バージョン 8.62 に導入された新しい予約語があります。導入された新しい予約語は次のとおりです：

            ?
            ADMIN
            CASCADE
            CURRENT
            DBA
            FIRST
            LAST
            MASTERS
            MINUS
            OJ
            REPLICATES
            RESTRICT
            ROLE
            SUBSET
            {
            {D
            {TS
            }

次の予約語が無効になります:

            CENTER
            CENTRE
            INPUT
            LEFTRIGHT
            MOVE
            PRECISION
            SHARE

バージョン 8.62 の中に、ユーザーの予約語を扱う能力を増加します。

例えば、SIN、COS および LOG は数学関数のための予約語ですが、CREATE TABLE コマンドの中で属性名として使用することができます。

            CREATE TABLE TABLEX (SIN INT, COS INT, LOG CHAR(10));

これは前の Empress バージョンに使用不可です。

## 2.16 Java データソース と JNDI のサポート

バージョン V8.62 では、 Empress JDBC カテゴリー 2 ドライバが Java データソースおよび Java Naming and Directory Interface (JNDI) をサポートします。

JDBC 2.0 標準拡張　API　は、データソース (javax.sql.DataSource インターフェース) の概念を導入しました。 データソースは、使用するデータベースあるいは他の資源を指定するための標準的なオブジェクトです。 ユーザが便利性とポータビリティのために、ロジカルネームによってデータベースにアクセスすることができます。

Empress は、サンマイクロシステムズ JDBC 仕様に定義された「ベーシック・インプリメンテーション」によって、 DataSource インターフェースをインプリメントしました。

DriverManager の代わり、DataSource オブジェクトは、必要な場合、修正することができる特性を持っています。データソースが、 異なるサーバーあるいは同じサーバーの異なる位置に移動されるか、Empress 接続サーバーのポート番号が変わった場合、 データソースオブジェクトの中でこれらの特性をすべて修正することができます。 利点はデータソースのプロパティを変更することができるによってそのデータソースにアクセスするユーザのJavaアプリケーションを変更する必要がありません。

この機能は前の JDBC DriverManager のより強力です。データソースおよび JNDI に関するさらに詳しい情報は、 サンマイクロシステムズのJDBC パッケージの仕様を参照してください。

Java データソースおよび JNDI を使用する Java アプリケーションは、次の2つのグループを import しなければなりません。

            import javax.naming.*;
            import javax.sql.DataSource;

## 2.17 ODBC インターフェース

### 2.17.1 ODBC マネジャー経由の ODBC ローカルアクセス

V8.62 で、マイクロソフトウインドウズの ODBC アプリケーションは、ODBC マネージャーと共に、Empress ODBC ローカルアクセスドライバを使用することができます。マイクロソフト　Visual Basic　かマイクロソフト ACCESS のような ODBC 準拠しているツールは Empress ODBC ローカルアクセスドライバを使用することは出来ます。

### 2.17.2 ローカルアクセスドライバーのマルチ接続

バージョン V8.62 では、ODBC および JDBC ローカルアクセスドライバーの両方が複数の接続をサポートします。 前のバージョンは、1つだけの接続を扱うことができました。

### 2.17.3 Empress ODBC データソース名のセットアップの改善

新しい Empress ODBC データソース名セットアップ画面で入力されたパラメーターに対して、接続テストすることが可能です。 このように、実行する前に、ユーザは接続問題を見つけることができます。

### 2.17.4 データソースの ODBC ドライバーに標準（デフォールト）ラベルを提供する

前の Empress ODBC ドライバーバージョンアップグレードするときに、データソースを新しいドライバーで作り直さなければなりません。 Empress V8.62で、ODBC ドライバーに標準(デフォルト)ラベルを供給します。アップグレードするときに、変更しなくでも済みます。

Empress ODBC ドライバーの新しいラベル名は:

       Empress ODBC ローカルアクセスインターフェース [デフォルト]
       Empress ODBC インターフェース[デフォルト]

### 2.17.5 マイクロソフト .NET テクノロジーのサポート

Empress V8.62 ODBC ドライバーは複数のマイクロソフト .NET テクノロジーをサポートします。 Empress V8.62 ODBC ドライバは OLEDB.NET プロバイダあるいは ODBC.NET プロバイダによって Empress データベースに アクセスするために、.NET環境の中で使用することができます。
ODBC.NET はマイクロソフト.NETフレームワークへのアドインコンポーネントです。

## 2.18 スクロールすることができるカーソル

Empress バージョン 8.62 では、Dynamic SQL インターフェースで新しいスクロールすることができるカーソルを導入します。 DECLARE CURSOR (SENSITIVE、INSENSITIVE、ASENSITIVE および SCROLL オプション) と FETCH(FIRST、LAST、ABSOLUTE、RELATIVE オプション) コマンドのシンタックスが拡張されます。

Empress V8.62 ODBC インターフェースでは同じの機能も提供しています。