Skip to Content
Author's profile photo Sawa Ito

SAP SQL Anywhere におけるデータベースオプションの機構 (過去のブログより)

このページは、以下の英語ページの抄訳です。最新の情報については、英語ページを参照してください。

この記事でふれている「データベースオプション」とはデータベースの動作をさまざまな面から制御するオプションパラメータを意味し、別途ライセンスが必要な有償オプション機能やデータベースサーバ起動時に指定するオプションのことではないことにご注意下さい。

この記事のオリジナルは、Glenn Paulleyが sybase.com に 2009 年 9月に掲載したものです。その中で、Glenn は ユーザー独自のカスタムデータベースオプションの作成・設定方法や、データベースオプション変更の監視や回避機能など、SQL Anywhere におけるデータベースオプションの使用について解説しています。

 

SQL Anywhere では、アプリケーションはサーバーや、データベース、接続レベルのデータベースオプションによって、サーバーのオペレーションおよび/またはアプリケーションの目に見えるセマンティクスに影響を与える様々な動作をコントロールすることが可能です。
SQL Anywhere に実装されている「データベースオプション」は、ISO 標準SQL のものではありません。しかしながら、「グローバル変数」サポートのコンセプトについては、標準SQL のプロセスで議論がなされています。
SQL Anywhere のデータベースオプションでは、値を更新して取得する別のメカニズムと伴わせて「グローバル変数」を実装します。

SQL Anywhere のサーバーデータベースオプションは、システムカタログ内に永続的に格納され、SYSOPTION ビューを使用して見ることが可能です。

/wp-content/uploads/2014/06/sysoption_443153.png

サーバー定義のデータベースオプションは、バイナリ設定(ON vs. OFF)のものもあれば、integer や、特定の character string 設定、自由形式の string で入力されるものもあります。
データベースオプションの「魔法」(特徴)は、それぞれのシステムデータベースオプションが、多くの場合ユーザーまたは特定の接続によって永遠にあるいは一時的にオーバーライドされてしまう PUBLIC 設定というデフォルト値をもつことです。
上の画面では、それぞれのデータベースオプションとその設定が特定のユーザーに属することに注意してください。
DEMO データベースでは、user_id “2” は、ユーザー PUBLIC です。
他のユーザーの特定のデータベースオプション設定も、関連する user_ids とともにカタログに保存されます。
これらの設定は、そのユーザーの PUBLIC 設定を「オーバーライド」します。
あるユーザーの設定が存在しない場合には、 PUBLIC 設定がデフォルトとして使用されます。

例えば、デフォルトでは、BLOCKING データベースオプションの PUBLIC 設定は ON です。つまり、行ロックで競合する場合、SQL リクエストはブロックされ、待たされることになります。
SQL 文をブロックするよりも、エラーとして失敗させたい場合には、BLOCKING データベースオプションを OFF に設定します。
データベースオプション設定の変更は、SET OPTION 文を通して以下のように行うことができます。

SET OPTION BLOCKING = 'OFF';

これによりこのユーザーの BLOCKING データベースオプション設定を変更し、データベースカタログに対してこの修正が行われます。
SQL Anywhere のヘルプマニュアルで説明されているように、いくつかのデータベースオプションはタイミングに依存します。

データベースオプションにより、データベースオプション設定への変更は異なるタイミングで行われます。
recovery_time のようなグローバルデータベースオプションの変更は、データベース起動の次のタイミングで行われます。
通常、現在の接続に影響を与えるデータベースオプションは、即時に実行されます。
例えば、データベースオプション設定をトランザクションの途中で変更することができます。
例外は、カーソルがオープンの時にデータベースオプションを変更すると、信頼できない結果になることです。
例えば、date_format の変更は、カーソルがオープンな場合、次の行のフォーマットを変更しない可能性があります。
カーソルを操作する方法によっては、ユーザーに対してその方法が機能する以前にいくつかの行を処理するかもしれません。

BLOCKING のような接続データベースオプションの変更は、通常その userid で接続する新しい接続に影響があります。
その変更を開始した接続にも影響があります。
しかし、他の既存の接続には影響しません。一時的にデータベースオプションを現在の接続にのみ設定することもできます。
この設定はメモリーに保持され、永続的にデータベースカタログに保持されません。
一時的にデータベースオプションを変更するには、TEMPORARY キーワードを使用して行います。

SET TEMPORARY OPTION BLOCKING = 'OFF';

この一時的な設定は、永続的にはなっていないため、他の方法でその値を取得する必要があります。DBISQL では、SET DBISQL コマンドを使用して、この接続に対する全サーバー定義のデータベースオプションの現在の値(一時的あるいは永続的)を表示することができます。
下の画面では、 BLOCKING データベースオプションの値が、OFF に設定されていることに注意してください。

/wp-content/uploads/2014/06/isql_set_command_443154.png

DBISQL を使用していない場合は、これらの値はシステムプロシージャー sa_conn_properties() を使用して現在のオプション値を取得することができます。
これは、全てのサーバー定義の接続データベースオプションのデータベースオプション設定を返し、さらに診断目的に使用できる様々な接続に関連する設定値を返します。

/wp-content/uploads/2014/06/sa_conn_properties_443155.png

接続プロパティーは、データベースオプションを含め、CONNECTION_PROPERTY()関数を使用して個別に取得することができます。
SQL Anywhere は、サーバー定義のデータベースオプションを接続、データベース、サーバーの 3 つのカテゴリにクラス分けします。
これらのプロパティーは、CONNECTION_PROPERTY()、DB_PROPERTY()、PROPERTY() 関数を使用して、それぞれにクエリを実行することが可能です。
データベースオプションに関しては、これらのプロパティー関数は、一時的に設定される場合でも現在の値を返します。
一時的に PUBLIC データベースオプションを設定します。つまり、

SET TEMPORARY OPTION PUBLIC.BLOCKING = 'OFF'

を設定することで、データベースがシャットダウンするまでその値を変更します。
そして、(そのユーザーに対してオーバーライドされなければ)新しい接続がこの設定を受け継ぎます 。
データベースが再起動した際には、SYSOPTION ビューからのパーシスタントな値が、もう一度デフォルトとして使用されます。

 

 

ユーザー定義のデータベースオプション

SQL Anywhere のデータベースオプションは、あらかじめ組み込まれた機能です。その他に SQL Anywhere ではアプリケーションから「グローバル変数」のように値を格納できるユーザー定義のデータベースオプションを設定することができます。ユーザー定義のデータベースオプションを設定するには、DBA 権限が必要です。権限を持つユーザーは、 SET OPTION 文を発行して、PUBLIC ユーザーのためのデータベースオプションの値を設定することができます。

例えば、以下の文で、「foo」というユーザー定義データベースオプションを作成します。値として’ON’ を設定します。

SET OPTION PUBLIC.FOO = 'ON';

そして、「foo」データベースオプションはカタログに永続的に格納されます。
データベースオプションにPUBLIC 設定があれば、パグリックに参照することができます。
user DBA として、「foo」に独自の値を設定することに決めた場合、PUBLICに設定された値を以下でオーバーライドすることができます。以下は値として’OFF’を設定しています。

SET OPTION FOO = 'OFF';

そして、両方の値を SYSOPTION ビュー (userid “1” が DBA)で見ることが可能です。

/wp-content/uploads/2014/06/querying_sysoption_443159.png

(userid”1″ が DBA を意味しています)

ユーザー定義のデータベースオプション値は、VARCHAR 型です。
ユーザー定義のデータベースオプションの最大長は、データベースのページサイズに依存します。
4K ページ (デフォルト)では、最大長は、3468 byte です。
残念ながら、ユーザー定義のデータベースオプションは sa_conn_properties() で返される値や、connection_property() 関数経由で取得できるものでもありません。
ほとんどのインターフェースでは、これらの値を取得する唯一の方法は、SYSOPTION カタログビューに対して SQL クエリを実行することです。
例外的に、アプリケーションが embedded SQL を使用している場合には、embedded SQL の GET OPTION 文を利用して、ユーザー定義のデータベースオプションを含めあらゆるデータベースオプションのオプション値を取得することができます。

 

 

データベースオプション設定の制限(またはレポーティング)

 

最後に、SQL Anywhere のあるバージョンから他のバージョンへのマイグレーションを支援するために SQL Anywhere バージョン 10.0.1 で最初に追加された機能について述べたいと思います。
この機能は、データベースオプション設定に対して、変更を検出し否定(または報告)するための「watches」の機能を追加するものです。
sa_server_option() システムプロシージャーに対して2つのパラメーター、OptionWatchList と OptionWatchAction、を設定することで使用することができます。
OptionWatchList を設定することで、どのデータベースオプション (サーバー定義またはユーザー定義)を監視するべきかを設定することができます。
OptionWatchAction は、どのアクションを実行するべきか指示します。サーバーのコンソールウィンドウに現れるメッセージを起こす MESSAGE または、データベースオプション値を修正せずエラーを返すようにする ERROR です。

1つの例として、ユーザー定義データベースオプション“foo”を作成した後には、その値への変更を禁止したいとします。まず watch を以下のように設定します。

CALL sa_server_option( 'OptionWatchList', 'foo' );

次に、好ましいアクションを設定します。今回の場合はエラーを返すようにします。

CALL sa_server_option( 'OptionWatchAction', 'ERROR' );

この watch によって、データベースオプション結果を修正しようとするあらゆる試みがエラーになります。

/wp-content/uploads/2014/06/optionwatchaction_443161.png

 

 

===

 

SAP SQL Anywhere に関する詳細情報は、SAP SQL Anywhere Communityページ<英語> を参照してください。

 

上記のコミュニティーに掲載されている技術情報は、順次SQL Anywhere 日本語コミュニティ

に掲載しています。

 

SQL Anywhere に関してはまずはこちらをご参照ください。無期限でご利用いただける無償の Developers Edition もこちらからダウンロードが可能です。

 

SQL Anywhere に関して技術的な質問のある方はコミュニティに登録し、
「Ask a Question」機能をご利用ください。

Language には「Japanese」、
Primary Tag には「SAP SQL Anywhere」を選択
User Tagに「sql anywhere」「sql anywhere Japanese question」

を入力してください。

不具合につきましては、サポート契約者様専用の問い合わせ方法にてお問い合わせください。

 

======================
ご購入に関するお問い合わせ

こちらよりお問い合わせください。

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.