SQL Anywhere では、6 つの外部ランタイム環境をサポートしています。これには、C/C++ で記述された Embedded SQL と ODBC アプリケーション、Java、Perl、PHP、または Microsoft .NET Framework Common Language Runtime (CLR) に基づく C# や Visual Basic などの言語で記述されたアプリケーションが含まれます。
これまで SQL Anywhere では、C または C++ で記述されたコンパイル済みネイティブ関数を呼び出すことができました。ただし、これらのプロシージャがデータベース・サーバで実行されるとき、ダイナミック・リンク・ライブラリまたは共有オブジェクトが常にデータベース・サーバによってロードされ、ネイティブ関数への呼び出しがデータベース・サーバによって行われていました。この方法には、ネイティブ関数が原因で障害が発生した場合、データベース・サーバがクラッシュするというリスクがあります。データベース・サーバの外部環境でコンパイル済みネイティブ関数を実行できると、サーバへのこれらのリスクをなくすことができます。
次に示すのは、SQL Anywhere での外部環境サポートの概要です。
システム・カタログ・テーブルには、各外部環境を識別して起動するために必要な情報が格納されています。このテーブルの定義は、次のとおりです。
SYS.SYSEXTERNENV ( object_id unsigned bigint not null, name varchar(128) not null, scope char(1) not null, supports_result_sets char(1) not null, location long varchar not null, options long varchar not null, user_id unsigned int ) |
object_id データベース・サーバによって生成されるユニークな識別子です。
name name カラムは、外部環境または言語の名前を識別します。これは、java、perl、php、clr、c_esql32、c_esql64、c_odbc32、c_odbc64 のいずれか 1 つです。
scope scope カラムは、CONNECTION の場合は C、DATABASE の場合は D のどちらかです。scope カラムは、外部環境が接続ごとに 1 つ起動されるのか、データベースごとに 1 つ起動されるのかを識別します。
接続ごとに 1 つ起動される外部環境 (PERL、PHP、C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 など) では、外部環境を使用する接続ごとに外部環境のインスタンスが 1 つあります。接続ごとの場合、外部環境は接続が切断されると終了します。
データベースごとに 1 つ起動される外部環境 (JAVA や CLR など) では、外部環境を使用するデータベースごとに外部環境のインスタンスが 1 つあります。データベースごとの場合、外部環境はデータベースが停止されると終了します。
supports_result_sets supports_result_sets カラムは、結果セットを返すことのできる外部環境を識別します。PERL と PHP 以外のすべての外部環境が結果セットを返すことができます。
location location カラムは、外部環境の実行ファイル/バイナリ・ファイルが置かれているデータベース・サーバ・コンピュータのロケーションを識別します。これには、実行ファイル/バイナリ・ファイル名が含まれています。このパスは、完全に修飾されたパスまたは相対パスのどちらでもかまいません。相対パスの場合、実行ファイル/バイナリ・ファイルはデータベース・サーバによって検索できるロケーションに置く必要があります。
options options カラムは、外部環境に関連付けられている実行ファイルを起動するために、コマンド・ラインで指定する必要があるオプションを識別します。このカラムは変更しないでください。
user_id user_id カラムは、データベース内で DBA 権限を持つユーザ ID を識別します。外部環境は初めて起動されたとき、外部環境の使用に関する設定を行うためにデータベースに戻る接続を作成する必要があります。デフォルトでは、この接続は DBA ユーザ ID を使用して作成されます。しかし、DBA 権限を持つ別のユーザ ID を外部環境で使用することをデータベース管理者が望む場合は、SYS.SYSEXTERNENV テーブルの user_id カラムに別のユーザ ID を指定します。ただし、ほとんどの場合において SYS.SYSEXTERNENV のこのカラムは NULL であるため、データベース・サーバはデフォルトで DBA ユーザ ID を使用します。
別のシステム・カタログ・テーブルには、非 Java の外部オブジェクトが格納されます。このテーブルのテーブル定義は、次のとおりです。
SYS.SYSEXTERNENVOBJECT ( object_id unsigned bigint not null, extenv_id unsigned bigint not null, owner unsigned int not null, name long varchar not null, contents long binary not null, update_time timestamp not null ) |
object_id データベース・サーバによって生成されるユニークな識別子です。
extenv_id extenv_id は、SYS.SYSEXTERNENV に格納されている外部環境の種類を識別します。
owner owner カラムは、外部オブジェクトの作成者/所有者を識別します。
name name カラムは、INSTALL EXTERNAL OBJECT 文で指定されている外部オブジェクトの名前です。
contents contents カラムには、外部オブジェクトのコンテンツが含まれています。
update_time update_time カラムは、オブジェクトが最後に変更 (またはインストール) された時間を表します。
SYS.SYSEXTERNENV テーブルの導入に伴い、Java に固有の一部のオプションが使用されなくなりました。廃止予定のオプションは、次のとおりです。
java_location java_main_userid |
今までこれらのオプションを使用して、特定の Java VM や、クラスまたはその他の Java 関連の管理タスクのインストールに使用するユーザ ID を識別していたアプリケーションは、代わりに ALTER EXTERNAL ENVIRONMENT 文を使用して、Java の SYS.SYSEXTERNENV テーブルにロケーションおよび user_id を設定する必要があります。
次の SQL 構文を使用して、SYS.SYSEXTERNENV テーブルの値を設定または変更できます。
ALTER EXTERNAL ENVIRONMENT environment-name [ USER user-name ] [ LOCATION location-string ] |
environment-name 環境名は、SYS.SYSEXTERNENV 内の環境名を表す識別子で、PERL、PHP、JAVA、CLR、C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 のいずれか 1 つです。
user-name ユーザ名文字列は、データベース内で DBA 権限を持つユーザを識別します。外部環境は初めて起動されたとき、外部環境の使用に関する設定を行うためにデータベースに戻る接続を作成する必要があります。デフォルトでは、この接続は DBA ユーザ ID を使用して作成されます。しかし、DBA 権限を持つ別のユーザ ID を外部環境で使用することをデータベース管理者が望む場合は、使用される別のユーザ ID を user-name に指定します。ほとんどの場合、このオプションの指定は不要です。
location-string ロケーション文字列は、外部環境の実行ファイル/バイナリ・ファイルが置かれているデータベース・サーバ・コンピュータのロケーションを識別します。これには、実行ファイル/バイナリ・ファイル名が含まれています。このパスは、完全に修飾されたパスまたは相対パスのどちらでもかまいません。相対パスの場合、実行ファイル/バイナリ・ファイルはデータベース・サーバによって検索できるロケーションに置く必要があります。
データベース・サーバで使用するように外部環境が設定されたら、オブジェクトをデータベースにインストールし、それらのオブジェクトを外部環境内で使用するストアド・プロシージャおよび関数を作成することができます。オブジェクトのインストール、ストアド・プロシージャおよびストアド関数の作成、使用法は、Java クラスのインストール、Java ストアド・プロシージャおよび関数の作成、使用法によく似ています。
外部環境のコメントを追加するには、次のような文を実行します。
COMMENT ON EXTERNAL ENVIRONMENT environment-name IS comment-string |
Perl スクリプトなどの外部オブジェクトをファイルまたは式からデータベースにインストールするには、次のような INSTALL EXTERNAL OBJECT 文を実行する必要があります。
INSTALL EXTERNAL OBJECT object-name-string [ update-mode ] FROM { FILE file-path | VALUE expression } ENVIRONMENT environment-name |
object-name-string オブジェクト名文字列は、インストールされるオブジェクトをデータベース内で識別する名前です。
update-mode 更新モードは、NEW または UPDATE のどちらかです。更新モードを省略した場合は、NEW であると見なされます。
file-path ファイル・パスはデータベース・サーバ・コンピュータ上のロケーションを示し、オブジェクトはここからインストールされます。
environment-name 環境名は、JAVA、PERL、PHP、CLR、C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 のいずれか 1 つです。
インストールされている外部オブジェクトのコメントを追加するには、次のような文を実行します。
COMMENT ON EXTERNAL ENVIRONMENT OBJECT object-name-string IS comment-string |
インストールされている外部オブジェクトをデータベースから削除するには、次に示す REMOVE EXTERNAL OBJECT 文を使用する必要があります。
REMOVE EXTERNAL OBJECT object-name-string |
object-name-string オブジェクト名文字列は、対応する INSTALL EXTERNAL OBJECT 文で指定された文字列と同じです。
データベースにインストールされた外部オブジェクトは、外部ストアド・プロシージャおよび関数の定義で使用できます (Java ストアド・プロシージャおよび関数を作成する現在のメカニズムに似ています)。
CREATE PROCEDURE procedure-name(...) EXTERNAL NAME '...' LANGUAGE environment-name |
CREATE FUNCTION function-name(...) RETURNS ... EXTERNAL NAME '...' LANGUAGE environment-name |
environment-name 環境名は、JAVA、PERL、PHP、CLR、C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 のいずれか 1 つです。
作成されたストアド・プロシージャおよび関数は、データベース内の他のストアド・プロシージャや関数と同じように使用できます。外部環境のストアド・プロシージャまたは関数が呼び出されるると、データベース・サーバは外部環境がまだ起動されていない場合は、これを自動的に起動し、外部環境がデータベースから外部オブジェクトをフェッチして実行するために必要なあらゆる情報を送信します。実行結果の結果セットや戻り値は、必要に応じて返されます。
外部環境を要求に応じて起動または停止したい場合は、(現在の START JAVA 文と STOP JAVA 文に似た) START EXTERNAL ENVIRONMENT 文と STOP EXTERNAL ENVIRONMENT 文を使用します。
START EXTERNAL ENVIRONMENT environment-name STOP EXTERNAL ENVIRONMENT environment-name |
environment-name 環境名は、JAVA、PERL、PHP、CLR、C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 のいずれか 1 つです。
詳細については、次の項を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |