設定スクリプトを実行する前に、次の要件を確認してください。
設定スクリプトを実行するデータベースユーザは、同期中に Mobile Link システムテーブルを更新するユーザと同じである必要があります。このユーザを使用して Mobile Link サーバを起動したり、Mobile Link アプリケーションを設定したりします。 必要な権限を参照してください。
Mobile Link サーバを統合データベースに接続するために使用される RDBMS ユーザは、Mobile Link システムテーブル、プロシージャなどを修飾子なしで使用できる必要があります (SELECT * from ml_user など)。
また、RDBMS ユーザの場合は、GV$TRANSACTION、GV$SESSION、GV$LOCK、DBA_OBJECTS での SELECT 権限、および DBMS_UTILITY での EXECUTE 権限も必要です。同義語である GV$TRANSACTION、GV$SESSION、GV$LOCK には直接パーミッションを付与することができません。そのため、同義語の派生元である GV_$TRANSACTION、GV_$SESSION、および GV_$LOCK の動的パフォーマンスビューに対してパーミッションを付与する必要があります。このアクセス権を付与するには、SYS として接続する必要があります。このアクセス権を付与する Oracle の構文は次のとおりです。
grant select on SYS.GV_$TRANSACTION to user-name; |
grant select on SYS.GV_$SESSION to user-name; |
grant select on SYS.GV_$LOCK to user-name; |
grant execute on SYS.DBMS_UTILITY to user-name; |
Oracle を Mobile Link 統合データベースとして動作するよう設定するには、設定プロシージャを実行して、Mobile Link 同期に必要な Mobile Link システムテーブル、ストアドプロシージャ、トリガ、ビューを追加する必要があります。次のような方法で実行できます。
%SQLANY16%\MobiLink\setup にある syncora.sql 設定スクリプトを実行します。
Sybase Central で Mobile Link のシステム設定を確認し、更新します。Mobile Link システム設定を参照してください。
Oracle 統合データベースには、ODBC DSN を設定する必要があります。次の項を参照してください。
Oracle Real Application Clusters 内での Mobile Link の同期とタイムスタンプベースのダウンロード Mobile Link サーバが次の最終ダウンロードタイムスタンプをフェッチする時刻と、ダウンロードされるローをフェッチする時刻との差を超える差異が、Oracle クラスタノードの各クロック間に存在する場合、Oracle RAC で実行されている統合データベースのローが欠落する場合があります。この問題は、ノードのクロックが同期される RAC システムではあまり起こりませんが、ノードのクロック間の差異が大きければ大きいほど、発生する可能性も大きくなります。対処方法としては、modify_next_last_download_timestamp または modify_last_download_timestamp スクリプトのいずれかを作成し、ノードのクロック間の最大差をなくします。
Oracle では、少なくともバージョン 10i 以降では、クラスタ内のすべてのクロックの同期に Network Time Protocol (NTP) を使用することをすすめています。NTP は、UNIX と Linux では通常デフォルトで実行されます。クラスタのノードが NTP を使用するよう正しく構成されている場合、(NTP サーバとどれくらい近いかにより) それらのクロック間の時刻差は 200 マイクロ秒から 10 ミリ秒の範囲となります。Windows Server 2003 以降、Windows Time サービスには、デフォルトで実行される NTP バージョン 3 プロトコルが実装されています。また、バージョン 11gR2 以降の Oracle Clusterware には、クロックの同期をモニタする Oracle クラスタ時刻同期化サービス (CTSS) が含まれています。これでは、NTP または Windows Time サービスのいずれも実行されていない場合、クロックの同期がアクティブに維持されます。ただし、CTSS と Windows Time サービスは NTP と比較すると正確性に劣ります。
next_last_download_timestamp をフェッチする時刻と、ダウンロードするローをフェッチする時刻との差が Oracle RAC のノードのクロックで最大 1 秒ある場合、ローの欠落を防ぐために、Mobile Link サーバでは、次の条件が該当する場合、統合データベースからフェッチした next_last_download_timestamp から 1 秒を減算します。
Mobile Link サーバが使用する Oracle アカウントに、SYS.DBMS_UTILITY の実行権限があります
統合データベースとは Oracle RAC システムです
Mobile Link バージョン 12.0.0 以降で、generate_next_last_download_timestamp スクリプトがありません
Oracle RAC ノードのクロック間に大きな時間差がある場合、ノードのクロック間の最大時間差をなくす generate_next_last_download_timestamp、modify_next_last_download_timestamp または modify_last_download_timestamp スクリプトを定義してこの問題を回避できます。
データ型マッピング カラムのデータ型は、統合データベースとリモートデータベース間で完全に一致する必要があります。詳細については、Oracle データのマッピングを参照してください。
XMLTYPE データ型 SQL Anywhere または Ultra Light で Oracle XMLTYPE データ型を使用する場合は、特に注意が必要です。 詳細については、Oracle の XMLTYPE データ型を参照してください。
CHAR カラム Oracle では、CHAR データ型は固定長で、文字列の長さに合わせてブランクが埋め込まれています。Mobile Link リモートデータベース (SQL Anywhere または Ultra Light) では、CHAR は VARCHAR と同じです。固定幅に合わせて値にブランクが埋め込まれることはありません。統合データベースで CHAR の代わりに VARCHAR を使用することを強くおすすめします。CHAR を使用する必要がある場合は、mlsrv16 -b コマンドラインオプションを使用すると、同期中に文字列から後続ブランクを削除できます。このオプションは、重複を検出するときに使用する文字列の比較にとって重要です。
-b mlsrv16 オプションを参照してください。
タイムスタンプ Mobile Link サーバは、gv$transaction を使用して、リモートデータベースが次の同期に使用するタイムスタンプを生成するため、Mobile Link サーバのログイン ID には gv_$transaction で SELECT 権限が必要です。Oracle では、gv$transaction に直接アクセス権を付与できません。そのため、その基底にある gv_$transaction ビューに対して SELECT 権限を付与する必要があります。 権限を参照してください。
ストアドプロシージャ ストアドプロシージャを使用して結果セットを返す場合、または VARRAY パラメータを受け入れる場合は、SQL Anywhere 16 - Oracle ODBC ドライバの [プロシージャから結果が返される、または VARRAY パラメータを使用する] オプションを選択してください。また、Sybase Central では、リモートデータベースの集中管理に使用するために、プロシージャが結果を返すことが必要となるため、集中管理を使用する場合には、このオプションを選択する必要があります。
SQL Anywhere 16 - Oracle ODBC ドライバを参照してください。
セッション全体の変数 セッション全体の情報を保持するには、Oracle パッケージ内の変数を使用します。Oracle パッケージでは、変数の作成、修正、破棄が可能です。これらの変数は Oracle パッケージが現在のパッケージであるかぎり有効です。
オートインクリメントメソッド プライマリキーの一意性を維持するには、Oracle シーケンスを使用して、SQL Anywhere オートインクリメントフィールドのキーのリストに似た、キーのリストを生成します。CustDB サンプルデータベースの Samples\MobiLink\CustDB\custora.sql に、サンプルコーディングが用意されています。ただし、オートインクリメントとは異なり、シーケンスを明示的に参照する必要があります。SQL Anywhere オートインクリメントは、INSERT 文でカラムが参照されていない場合は、自動的にカラム値を挿入します。
Oracle では空の文字列をサポートしていない Oracle では、空の文字列は NULL として処理されます。SQL Anywhere と Ultra Light では、空の文字列は NULL とは異なる意味を持ちます。したがって、Oracle 統合データベースがある場合には、クライアントデータベースで空の文字列を使用しないようにしてください。
Oracle XMLTYPE データ型は、SQL Anywhere の XML データ型または Ultra Light の LONG VARCHAR または VARCHAR(n) データ型にマッピングすることができます。Oracle データベースサーバではデータを XMLTYPE カラムに格納する前にデータの検証が行われますが、SQL Anywhere と Ultra Light ではそれが行われないので、アップロードする XML ドキュメントに有効な XML が含まれていることを確認する必要があります。
サイズが 32 KB 以下の小さな XML ドキュメントの場合は、Oracle PL/SQL 文を使用して Oracle データベースへのアップロードまたはこのデータベースからのダウンロードが可能です。XML ドキュメントのサイズが 32 KB を超える場合は、upload_insert スクリプトと upload_update スクリプトを使用してグローバルテンポラリテーブルにアップロード XML ドキュメントをアップロードすることが必要になる場合があります。end_upload_rows スクリプトまたは end_upload スクリプトを使用すれば、アップロードデータを変換して実際の同期テーブルに格納することができます。
次の例は、Oracle 統合データベースと SQL Anywhere リモートデータベースとの間で XMLTYPE オブジェクトをそれぞれアップロードおよびダウンロードするアップロードスクリプトとダウンロードスクリプトのサンプルを示します。これらの例では、アップロードテーブルは Oracle 統合データベースで次のように定義されます。
create table test (pk int not null primary key, c1 XMLTYPE) |
SQL Anywhere リモートデータベースでは、アップロードテーブルが次のように定義されます。
create table test (pk int not null primary key, c1 XML) |
すべての XML ドキュメントのサイズが 32KB 以下である場合は、アップロードスクリプトとダウンロードスクリプトを次のように作成できます。 upload_insert
declare v_pk integer; v_c1 clob; x_c1 xmltype; begin v_pk := {ml r.pk}; v_c1 := {ml r.c1}; x_c1 := XMLTYPE.createXML( v_c1 ); insert into test values( v_pk, x_c1 ); end; |
download_cursor
select pk, XMLSERIALIZE( content c1 ) from test |
この upload_insert スクリプトは、XML データのサイズが 32 KB 以下である場合に適切に機能します。しかし、XML データのサイズが 32 KB を超えると、Oracle サーバでエラーが発生する場合があります。
サイズが 32 KB を超える XML ドキュメントが存在する場合は、アップロード XML データをグローバルテンポラリテーブルにアップロードする必要があります。 XML ドキュメントは、upload_insert スクリプトによって Oracle 統合データベース内のグローバルテンポラリテーブルにアップロードされます。グローバルテンポラリテーブルは、次のように定義されます。
create global temporary table tmp_test (pk int, c1 CLOB) |
upload_insert スクリプトは、次のように作成します。
insert into tmp_test values( {ml r.pk}, {ml r.c1} ) |
テンポラリテーブル内の c1 カラムは、CLOB データ型を持つ必要があります。
end_upload_rows スクリプトは、XML ドキュメントをグローバルテンポラリテーブルから取得し、それを XML ドキュメントに変換し、XML データをテストテーブルに保存します。次に示すのは、end_upload_rows スクリプトです。
insert into test (pk, c1) (select pk, XMLTYPE.createXML(c1) from tmp_test |
Mobile Link 独立性レベル を参照してください。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |