3 GeoRasterのデータベース作成および管理

この章では、重要なGeoRasterデータベースの作成および管理操作を実行する方法について説明します。GeoRasterデータベースを構築して管理するための通常のワークフローは、説明されているほとんどまたはすべてのステップで構成されます。

機能を使用するすべてのスキーマに対してGeoRasterを有効にし、GeoRasterオブジェクトを作成し、データをロードしてGeoRasterオブジェクトを検証した後は、アプリケーションの要件に応じて、残りの操作を任意の順序で実行できます。特定の操作をスキップすることもできます。

SQLを使用して実行できる操作と、PL/SQLブロックを使用して実行する必要がある操作があります。GeoRasterオブジェクトのメタデータやセル・データを挿入、更新、形式変更、圧縮、解凍または削除した後は、変更をコミットする前にGeoRasterオブジェクトを更新する必要があります(「コミット前のGeoRasterオブジェクトの更新」を参照)。これらの操作の例については、「GeoRasterのPL/SQLおよびJavaデモ・ファイル」のデモ・ファイルおよび「SDO_GEORパッケージのリファレンス」に示す例を参照してください。

「GeoRasterのデータ問合せおよび操作」の操作も参照してください。

このマニュアルの他の章では、高度なトピックについて説明し(「ラスター代数および分析」および「イメージ処理および仮想モザイク」)、GeoRaster PL/SQLパッケージに関する詳細なリファレンス情報を提供しています(「SDO_GEORパッケージのリファレンス」「SDO_GEOR_ADMINパッケージのリファレンス」「SDO_GEOR_AGGRパッケージのリファレンス」「SDO_GEOR_RAパッケージのリファレンス」および「SDO_GEOR_UTLパッケージのリファレンス」)。

3.1 スキーマ・レベルでのGeoRasterの有効化

GeoRaster機能は、GeoRaster機能を使用するデータベース・スキーマごとに有効にする必要があります。

Oracle Spatial and Graphの最初のインストール後、デフォルトではGeoRaster機能が無効になっています。GeoRasterは、(データベース全体ではなく)スキーマのスコープ内でのみ有効にでき、GeoRaster機能を使用するスキーマごとに有効にする必要があります。

GeoRasterを有効にするには、GeoRasterを有効にするスキーマごとに次のステップを実行します。

  1. このスキーマのユーザーにCREATE TRIGGER権限があることを確認します(GeoRasterの適切な動作に必要)。ユーザーにCREATE TRIGGER権限がない場合(または権限の有無がわからない場合)は、DBA権限があるユーザーとして接続して次のコードを実行します。
    GRANT CREATE TRIGGER TO scott;
  2. スキーマのユーザーとしてデータベースに接続します。たとえば:
    CONNECT scott/<password-for-scott>
  3. 次の文を入力します。
    EXECUTE SDO_GEOR_ADMIN.enableGeoRaster;
  4. 次の文がTRUEを返すことをチェックして、GeoRasterが有効になっていることを確認します。
    SELECT SDO_GEOR_ADMIN.isGeoRasterEnabled FROM DUAL;

データベース・スキーマごとに、SDO_GEOR_ADMIN.enableGeoRasterをコールする必要があるのは1回のみです。いずれの場合も、GeoRaster機能が有効かどうかを確認するために、ユーザーはSDO_GEOR_ADMIN.isGeoRasterEnabledファンクションをコールできます。SDO_GEOS_ADMIN.disableGeoRasterプロシージャを使用して、データベース・スキーマのGeoRaster機能を無効にできます。

GeoRaster表が作成されてデータが移入されると、データベースのアップグレード後に、その表のスキーマに対してGeoRasterが自動的に有効になります。スキーマに対してGeoRasterを再度有効にする必要はありません。(CREATE TRIGGER権限がユーザーに付与されていることを確認します。)

3.2 GeoRasterユーザーのためのデータ・ファイルおよび一時表領域の追加

GeoRasterデータベースは、一般的に非常に大きくなります。記憶域およびパフォーマンス上の理由のため、データベース・スキーマでは、GeoRasterデータ記憶域のために1つ以上のユーザー表領域を使用する必要があります(GeoRasterデータを格納するためのシステム表領域の使用を回避します)。また、データ・ファイルを表領域に適切に追加する必要があります。Oracle Automatic Storage Management(Oracle ASM)または大きいファイルの表領域が使用されていない場合、表領域ごとに多数のデータ・ファイルを作成し、可能な場合は異なるディスクにデータ・ファイルを分散する必要があります。また、データファイルを作成するか、既存のデータファイルを変更して、データベースでより多くの領域が必要になった場合に自動的にサイズが増えるようにする必要があります。

GeoRaster表は、多数の(潜在的にほとんど無制限の)GeoRasterオブジェクトを保持できます。ラスターのサイズによっては、ラスター・データ表(RDT)を使用して限られた数のGeoRasterオブジェクトのラスター・ブロックを保持する必要があります。GeoRaster表とは対照的に、パーティション化を適用しないかぎりRDTは大きくなりすぎません。また、RDTを異なる表領域に作成できるため、ラスター・ブロックが異なるディスクに分散されます。(「GeoRaster表およびラスター・データ表の作成」を参照)。

GeoRasterデータベースは、操作によっては一時表領域を使用します。GeoRaster操作(特に大規模なモザイク処理操作)に圧縮が含まれる場合、圧縮済または未圧縮の中間データを格納するために一時領域が必要です。GeoRasterユーザーが一時表領域を持たない場合、データベース・システムの一時表領域が使用されます。これは、効率的ではなく、モザイク処理などの操作速度が低下する可能性があります。そのため、常にGeoRasterユーザーに一時表領域を作成する必要があります。たとえば:

CONNECT system/<password>; 
CREATE TEMPORARY TABLESPACE geor_temp TEMPFILE 'geor_temp_1.f' SIZE 1G AUTOEXTEND ON; 
ALTER USER <georaster_user> TEMPORARY TABLESPACE geor_temp;

通常、必要とされる一時領域の容量は限定されます。ただし、大規模なモザイク処理で、結果が圧縮される場合、必要とされる一時領域は、結果の未圧縮のイメージ・サイズと等しくなります。したがって、GeoRasterユーザー用の一時表領域を作成するときにAUTOEXTEND ONを指定します。

3.3 GeoRaster表およびラスター・データ表の作成

GeoRasterオブジェクトで操作を行う前に、GeoRaster表および(作成していない場合は)1つ以上のラスター・データ表を作成する必要があります。

3.3.1 GeoRaster表の作成

GeoRaster表は、SDO_GEORASTER型の1つ以上の列を含む任意の表です。この列は、別のユーザー定義のオブジェクト型の属性列とすることも可能です。例3-1では、CITY_IMAGESというGeoRaster表を作成します。この表には、GeoRasterオブジェクトを格納するためのIMAGEという列が含まれています。

例3-1 City ImagesのGeoRaster表の作成

CREATE TABLE city_images (image_id NUMBER PRIMARY KEY, image_description VARCHAR2(50), image SDO_GEORASTER);

GeoRaster表の詳細は、「GeoRasterの物理記憶域」を参照してください。

3.3.2 ラスター・データ表の作成

GeoRaster表を作成したら、GeoRaster表のオブジェクトとともに使用する1つ以上のラスター・データ表(RDT)を作成する必要があります。RDTは、オブジェクト表として、またはリレーショナル表として作成できます。RDTを作成する場合、LOB記憶域形式のSecureFiles LOB (SecureFiles)を使用する必要があります。SecureFilesを使用すると、従来のLOB記憶域パラダイムのBasicFiles LOB (BasicFiles)を使用する場合と比較して、GeoRaster操作のパフォーマンスが大幅に向上します。

ノート:

RDTの名前は、「ラスター・データ表」での説明のとおり、データベース内で一意である必要があります。

例3-2では、SecureFilesを使用してRDTを作成します。RDTを使用して、CITY_IMAGES表または他のGeoRaster表に含まれる1つ以上のGeoRasterオブジェクトのすべてのラスター・ブロックを格納します。(GeoRasterオブジェクトを作成するまで、GeoRasterオブジェクトとRDTの関連は確立されません(「新しいGeoRasterオブジェクトの作成」を参照))。

例3-2 SecureFilesを使用したラスター・データ表の作成

CREATE TABLE city_images_rdt OF SDO_RASTER
  (PRIMARY KEY (rasterID, pyramidLevel, bandBlockNumber,
    rowBlockNumber, columnBlockNumber))
  TABLESPACE im_tbs_2
  LOB(rasterBlock) STORE AS SECUREFILE
    (CACHE);

例3-3 SecureFilesを使用したラスター・データ表(リレーショナル)の作成

例3-3では、同様にSecureFilesを使用して、例3-2と同じ名前のRDTを作成しますが、オブジェクト表ではなくリレーショナル表としてそれを作成します。

CREATE TABLE city_images_rdt
  (rasterID NUMBER,
  pyramidLevel NUMBER,
  bandBlockNumber NUMBER,
  rowBlockNumber NUMBER,
  columnBlockNumber NUMBER,
  blockMBR SDO_GEOMETRY,
  rasterBlock BLOB,
  CONSTRAINT pkey PRIMARY KEY (rasterId, pyramidLevel, bandBlockNumber,
    rowBlockNumber, columnBlockNumber))
  LOB (rasterblock) STORE AS SECUREFILE(cache);

RDTのCREATE TABLE文には、次の句を含める必要があります(前述の例に含まれています)。

  (PRIMARY KEY (rasterID, pyramidLevel, bandBlockNumber,
    rowBlockNumber, columnBlockNumber))

このPRIMARY KEY句によって、ラスター・データ表にBツリー索引を作成します(この索引は、最適な問合せパフォーマンスのために必須です)。

BasicFilesを使用する場合、より大きいCHUNKサイズ(16または32KB)を指定して、LOB記憶域のパフォーマンスを向上できます。SecureFilesでは、CHUNKサイズ・パラメータを指定する必要はありませんが、別のいくつかの記憶域パラメータを考慮する必要があります。SecureFiles LOBを使用するラスター・データ表は、自動セグメント領域管理オプション付きの表領域に作成する必要があります。Oracle SecureFilesの使用方法とBasicFiles LOBのパフォーマンス上の考慮事項の詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

LOB記憶域の指定を含む、表の作成のリファレンス情報については、『Oracle Database SQL言語リファレンス』のCREATE TABLE文に関する項を参照してください。

RDTを作成する場合のキーワードおよびオプションの詳細は、「ラスター・データ表」を参照してください。

3.3.3 GeoRaster DMLトリガーの作成

GeoRasterの内部表とデータ構造の一貫性および整合性を確保するために、GeoRasterでは、ユーザーがGeoRaster表(1つ以上のGeoRaster列を含む表)を作成すると、GeoRaster列ごとに一意のDMLトリガーが自動的に作成されます。これは、通常はGeoRaster DMLトリガーを手動で作成する必要はないということです。

ただし、例外が1つあります。ALTER TABLE文を使用して1つ以上のGeoRaster列を追加する場合は、SDO_GEOR_UTL.createDMLTriggerプロシージャをコールして、追加した各GeoRaster列にDMLトリガーを作成する必要があります。たとえば、新しい列added_geor_colを表my_geor_tabに追加した場合、次のコマンドを実行する必要があります。
EXECUTE SDO_GEOR_UTL.createDMLTrigger('MY_GEOR_TAB', 'ADDED_GEOR_COL');

また、データベース・アップグレードやデータ移行などの一部の使用例では、SDO_GEOR_UTL.recreateDMLTriggersプロシージャをコールしてすべてのGeoRaster列にDMLトリガーを再作成できます。

トリガーが起動されるのは、GeoRasterオブジェクトに影響を及ぼすデータ操作言語(DML)の各操作(行の挿入、GeoRasterオブジェクトの更新、および行の削除)の実行後です。

トリガーが起動されると、次のアクションが自動的に実行されます。

  • 挿入操作を実行すると、トリガーによって、GeoRaster表の名前、GeoRaster列の名前、ラスター・データ表の名前およびrasterID値を含む行がUSER_SDO_GEOR_SYSDATAビューに挿入されます(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」を参照)。同一のエントリがすでに存在する場合、例外が発生します。

  • 更新操作を実行すると、新しいGeoRasterオブジェクトがNULLまたは空である場合、トリガーによって、古いGeoRasterオブジェクトが削除されます。古いGeoRasterオブジェクトのUSER_SDO_GEOR_SYSDATAビューにエントリが存在しない場合(古いGeoRasterオブジェクトがNULLの場合)、トリガーによって、新しいGeoRasterオブジェクトのビューに行が挿入されます。古いGeoRasterオブジェクトのUSER_SDO_GEOR_SYSDATAビューにエントリが存在する場合、トリガーによって、新しいGeoRasterオブジェクトを反映するように情報が更新されます。

  • 削除操作を実行すると、トリガーによって、GeoRasterオブジェクトのラスター・データ・ブロックがラスター・データ表から削除され、そのGeoRasterオブジェクトの行がUSER_SDO_GEOR_SYSDATAビューから削除されます。

3.4 新しいGeoRasterオブジェクトの作成

GeoRaster表にGeoRasterイメージを格納する前に、GeoRasterオブジェクトを作成し、作業の開始前にそのオブジェクトをGeoRaster表に挿入する必要があります。新しいGeoRasterオブジェクトを作成するには、次の方法があります。

  • SDO_GEOR.initファンクションを使用して、空のGeoRasterオブジェクトを初期化します。

  • SDO_GEOR.createBlankファンクションを使用して、空白のGeoRasterオブジェクトを作成します。

オブジェクトが適切に作成されていない場合(オブジェクトがアトミックなNULLの場合)、いずれのGeoRaster操作も実行できません。SDO_GEOR.initおよびSDO_GEOR.createBlankファンクションは、ラスター・データ表の名前およびラスターID値が指定されていない場合に、それらの値でGeoRasterオブジェクトを初期化します。GeoRaster DMLトリガーは、ラスター・データ表の名前とラスターID値の組合せが現行ユーザーに対して一意であることを保証します。

(SDO_GEOR.importFromSDO_GEOR.subsetSDO_GEOR.copyなどの別のGeoRasterプロシージャの結果として)新しいGeoRasterオブジェクトにラスター・セル・データが含まれ、この新しいGeoRasterオブジェクトに対するラスター・データ表が存在しない場合は、まずラスター・データ表を作成する必要があります。ラスター・データ表を作成する方法とその例については、「ラスター・データ表の作成」を参照してください。

GeoRasterのデータについて考えられる問題(その一部は「データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス」項で説明しています)を防止するには、初期化済のGeoRasterオブジェクトがGeoRasterのシステム・ビューに登録されている必要がありますが、これはGeoRasterオブジェクトをGeoRasterの表に挿入したときに自動的に行われます。これは、そのGeoRasterオブジェクトに対して他のなんらかの操作を行う前に実行する必要があります。ソースまたはターゲットのGeoRasterオブジェクトが登録されていない場合、ラスター・データ表を操作する必要のあるGeoRaster操作を実行すると、例外が発生します。

3.5 ラスター・データのロード

イメージまたはラスター・データをロードおよびエクスポートする場合、サード・パーティのETLツールを検討できます(「GeoRasterツール: ローダー、ビューア、エクスポータ」の「ノート」を参照)。たとえば、gdal_translateコマンドラインおよびOracle Spatial and Graph GeoRasterドライバを通じてGeoRasterを完全にサポートする他のGDALユーティリティを使用できます。

また、GeoRasterの機能を使用してラスター・データをロードできます。GeoRasterを使用する場合、次のオプションがあります。

イメージおよびラスター・ファイルをロードおよびエクスポートするには、GDALGDALベースのETLおよびSDO_GEOR_GDAL.translateを使用することをお薦めします。最後のオプション(JAIベースのツール)では、次のことを実行できます。

  • ラスター・データを圧縮し、データをJPEG圧縮またはDEFLATE圧縮されたGeoRasterオブジェクトに保存します。

  • ESRIワールド・ファイルまたはDigital Globe RPCテキスト・ファイル(.rpb)を既存のGeoRasterオブジェクトにロードし、リロードせずにラスター・データを地理参照します。ワールド・ファイルでSRIDを指定し、データの空間エクステントを生成することもできます。

  • ラスター・データの有無にかかわらず、地理参照とともにGeoTIFF形式のファイルをロードします。GeoTIFFイメージの地理参照情報をロードおよびエクスポートするには、GeoTIFFライブラリが必要です。手順については、「GeoRasterオブジェクトの地理参照」を参照してください。

GeoRasterオブジェクトにラスター・データをロードしたら、SDO_GEOR.validateGeoRasterファンクションをコールしてそのオブジェクトが有効であることを確認する必要があります(「GeoRasterオブジェクトの検証」を参照)。

ESRIワールド・ファイルまたは.rpbファイルには座標系の情報が含まれていないため、ロード操作用に座標参照システムのSRID値を指定することができます。ただし、SRIDを指定しない場合は、ローダーによりGeoRasterオブジェクトのモデルSRIDが0(ゼロ)に設定されます。これは、GeoRasterオブジェクトが無効であり、そのため、SDO_GEOR.setModelSRIDプロシージャを使用してこのオブジェクトに有効なモデル空間を指定する必要があることを意味します。モデル空間の座標系が不明である場合は、SRIDの値を999999に指定できます。これは、座標参照システムが不明であることを意味します。(具体的には、SRID 999999はunknown CRSという座標参照システムに関連付けられます。)モデル空間の実際の座標参照システムがわかった後で、それに応じてSRID値を設定できます。

unknown CRS (SRID 999999)の座標参照システムの詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。

3.5.1 ブロック化および最適な埋込みを使用したロード

JPEGまたはJPEG2000イメージをロードし、変更せずに格納しないかぎり、イメージまたはラスター・ファイルをGeoRasterオブジェクトにロードする場合、ファイル形式によってブロック化方法は大きく異なる可能性があるため、常にデータの適切なブロック化を考慮して適用してください。一般的に、ブロック化サイズは512x512以上である必要があります。ブロック化サイズに絶対的なルールはありませんが、ラスターが大きくなるほど、使用する可能性のあるブロック化サイズも大きくなります。通常のラスターの場合、512x512から2048x2048が適切です。非常に小さいイメージ(1024x1024x3未満)の場合、通常はブロック化なしが適切な選択です。小さすぎたり(64x64、128x128など)、大きすぎるブロック化サイズや、1ブロック当たりのピクセル数が0.5 (2分の1)、1、8行などの極端なブロック化サイズは避けてください。通常、ブロックの矩形は、正方形または正方形に近い形にする必要があります。異なるアプリケーションごとに、効率的な記憶域と最適なパフォーマンスのバランスを取るようにブロック化を調整できます。

また、ロード中に常に最適な埋込みを適用する必要があります。つまり、blocking=OPTIMALPADDINGを指定します(blocksizeを指定する以外)。GeoRasterでは、ブロックの右側の列および下側の行に埋込みを適用して、他のブロックと同じサイズになるようにします。特定のラスターのブロック・サイズが最適でない場合、デフォルトの埋込み結果により、一部の記憶域を消費する可能性があります。blocking=OPTIMALPADDINGを指定する場合、すべてのGeoRasterプロシージャおよびETLツールでは、GeoRasterオブジェクト記憶域の埋込み量を削減するよう最適化するために、GeoRaster次元サイズ配列を自動的に調整します。調整は、常にユーザー指定の値を基準に行われます。SDO_GEOR_UTL.calcOptimizedBlockSizeプロシージャの使用上のノートで表のblockingキーワードの説明を参照してください。

GDALコマンドラインを使用する場合の最適な埋込みの適用方法は、次の例を参照してください。

gdal_translate -of georaster /images/image_1.tif \
      georaster:georaster/georaster@my_db, image_table, raster \
      -co "insert=(id,label,raster) values (1, 'image_1', sdo_geor.init('rdt_table', 1)" \
      -co blockxsize= 512 \
      -co blockysize=512 \
      -co blockbsize=3 \
      -co blocking=optimalpadding \
      -co interleave=BIP

3.5.2 解凍しないJPEGおよびJPEG 2000イメージのロード

GeoRasterでは、GeoRasterブロックがJPEGファイルとして格納されるJPEG圧縮をサポートします。また、GeoRasterでは、GeoRasterで単一のブロックをJPEG 2000ファイルとして格納するJPEG 2000圧縮もサポートします。解凍および再圧縮しないでJPEGまたはJPEG 2000イメージをロードおよびエクスポートしてパフォーマンスを大幅に向上できる特殊な場合があります。

JPEGにおいて、イメージ・ファイルがJPEGファイルの場合、JAIベースのGeoRasterローダーを使用して解凍および再圧縮せずに直接イメージをロードできます。GeoRasterオブジェクトの圧縮タイプはJPEG-Fとして指定され、GeoRasterオブジェクトの記憶域にブロック化は指定されません(つまり、GeoRasterオブジェクトには1つのブロックのみ含まれます)。

JPEG 2000において、イメージ・ファイルがJPEG2000ファイルの場合および使用中のパラメータがJPEG 2000ファイルの内部構造の変更を要求しない場合、GDALまたはGDALベースのGeoRaster ETLツールを使用して解凍および再圧縮せずに直接イメージをロードできます。たとえば、次のスクリプトは、解凍せずにJPEG 2000ファイルを直接ロードします。

gdal_translate -of georaster /images/image_3.jp2 \
      georaster:georaster/georaster@my_db,image_table,raster \
      -co "insert=(id,label,raster) values (3, 'image_3', sdo_geor.init('rdt_table', 3)" \
      -co compress=jp2-f

ただし、使用中のパラメータのいずれかがJPEG 2000データの内部構造の変更を要求する場合、直接ロードできません。次の例では解凍および再圧縮を要求するため、ロード時間が大幅に増加します。

gdal_translate -of georaster /images/image_4.jp2 \
      georaster:georaster/georaster@my_db,image_table,raster \
      -co "insert=(id,label,raster) values (4, 'image_4', sdo_geor.init('rdt_table', 4)" \
      -co compress=jp2-f \
      -co blockxsize=1024 \
      -co blockysize=1024 \
      -srcwin 100 200 1000 1000 \
      -outsize 50% 50%

3.5.3 ロード前のソース・ラスターの再フォーマット

GeoRasterのJAIベースのローダーでは、BSQインターリーブ形式のソース・ラスター・ファイルがサポートされないため、ファイルが大きすぎるとメモリー不足のエラーが発生する可能性があります。また、その他の制限も適用される場合があります。このような問題を回避するには、ソース・ファイルが適切にロードされるようにソース・ファイルを再フォーマットおよび再ブロック化します。ただし、次の方法を検討する前に、通常このような問題および要件を持たないGDALベースのETLローダーを使用することを常にお薦めします。

たとえば、この操作を行う方法の1つに、GDALの使用があります(GDALは、http://www.gdal.orgから入手できるオープン・ソースのラスター変換ライブラリであり、JAI (Java Advanced Imaging)で処理するためにイメージ・ファイルやラスター・ファイルを再フォーマットまたは再ブロック化できます)。GDALは、GeoRasterをネイティブにサポートし、GeoRasterオブジェクトを直接インポートおよびエクスポートでき、また、GeoRasterオブジェクトを処理できます(詳細は、http://www.oracle.com/technetwork/database/enterprise-edition/getting-started-with-gdal-133874.pdfを参照してください)。また、GDALを使用してTFWファイルを生成することもできます。たとえば、GDALコマンドラインまたは(一括変換の場合は)シェルを使用して、それぞれ単一行で次の2つのようなコマンドを実行します。

gdal_translate -of GTiff -co "TFW=YES" -co "INTERLEAVE=PIXEL" -co "TILED=YES" D:\my_image.tif D:\my_new_image.tif
 
gdal_translate -of GTiff -co "TILED=YES" -co "TFW=YES" D:\my_image.ecw D:\my_new_image.tif

前述の例で、最初のコマンドはTFWファイルを生成し、インターリーブを(JAIでサポートされる)BIPに変更して、イメージを256x256に再ブロック化します。2つ目のコマンドは、ECWをTIFFに変換し、TFWを生成してイメージを再ブロック化します。

その後、GeoRasterローダー・ツール(「GeoRasterツール: ローダー、ビューア、エクスポータ」を参照)を使用して再ブロック化を指定し、イメージを適切にロードして、後でデータベースから効率的に取得できるようにします。次に、単一コマンドの例を示します。

java -Xmx1024m oracle.spatial.georaster.tools.GeoRasterLoader mymachine db11 6521 georaster georaster thin 32 T globe image "blocking=true, blocksize=(512,512,3)" "D:my_image.tif,2,RDT_15, D:\my_image.tfw,82213"

SDO_GEOR.importFromをコールして非常に大きいイメージをロードしようとしたときにメモリー不足のエラーが発生した場合は、異なるブロック化サイズ・パラメータでイメージをロードするか、ロード前にGDALを使用してイメージをより小さい内部矩形サイズに再ブロック化してください。極端に大きいイメージの場合、GDALを使用して、そのイメージをより小さいサイズ(JAIで処理できるサイズ)の複数のイメージ・ファイルにタイル処理することや、GDALを使用してそのイメージを直接ロードおよびエクスポートすることも可能です。

3.6 GeoRasterオブジェクトの検証

GeoRasterオブジェクトを使用する前、またはGeoRasterオブジェクトのラスター・データおよびメタデータを手動で編集した後、そのオブジェクトが有効であることを確認する必要があります。GeoRasterオブジェクトの検証では、GeoRasterオブジェクトの登録の確認、メタデータとラスター・セル・データの確認、およびメタデータとデータに一貫性があるかどうかの確認が行われます。たとえば、検証では、ラスター型、ディメンション情報およびセル・ブロックの実際のサイズが確認され、その他の確認が行われます。

GeoRasterローダー・ツール(「GeoRasterツール: ローダー、ビューア、エクスポータ」を参照)を使用した場合、GeoRasterオブジェクトはロード操作時に検証されています。

GeoRasterは、次の検証サブプログラムを提供します。

  • SDO_GEOR.validateGeoRaster: セル・データおよびメタデータを含む、GeoRasterオブジェクトを検証します。オブジェクトが有効な場合はTRUEを戻します。有効でない場合は、GeoRasterオブジェクトが無効である理由を示すOracleエラー・コード、FALSE(不明な理由によって検証が失敗した場合)、またはNULL(GeoRasterオブジェクトがNULLの場合)のいずれかを戻します。GeoRasterオブジェクトの作成後は、常にこのファンクションを使用する必要があります。

  • SDO_GEOR.schemaValidate: GeoRasterのXMLスキーマに対してメタデータを検証します。SDO_GEOR.validateGeoRasterファンクションによってエラー・コード13454が戻された場合、このファンクションを使用してエラーの場所を特定できます。SDO_GEOR.schemaValidateおよびSDO_GEOR.validateGeoRasterファンクションは、空間エクステント・ジオメトリを検証しません。

  • SDO_GEOR.validateBlockMBR: ラスター・データ表に格納された各ラスター・ブロックに関連するblockMBRジオメトリを検証します。無効なblockMBRジオメトリが存在する場合は、SDO_GEOR.generateBlockMBRプロシージャをコールしてそれらを再生成します。

3.7 GeoRasterオブジェクトの地理参照

地理参照(「地理参照」を参照)によって、GeoRasterデータのセル座標と実際の地上座標(またはいくつかのローカル座標)が関連付けられます。GeoRasterオブジェクトを地理参照する必要がある場合、次の方法を使用できます。

  • 元のイメージがすでに地理参照されており、その地理参照情報がESRIワールド・ファイルまたはRPC係数を含む.rpbファイルに格納されている場合は、SDO_GEOR.importFromプロシージャを使用して、ファイルまたはCLOBオブジェクトから、(FILEまたはBLOB形式の)イメージ・データ自体とともに、ESRIワールド・ファイルまたは.rpbファイルをロードできます。GeoRasterのクライアント側ローダー・ツール(「GeoRasterツール: ローダー、ビューア、エクスポータ」を参照)を使用して、イメージ・ファイル自体とともに、ESRIワールド・ファイルまたは.rpbファイルをファイルからロードすることもできます。

    ESRIワールド・ファイルまたは.rpbファイルではモデル座標系が指定されないため、Oracle SRIDを使用して地理参照されるGeoRasterオブジェクトのモデル空間を、次のいずれかの方法で設定できます。ワールド・ファイルとともにSDO_GEOR.importFromプロシージャまたはGeoRasterのクライアント側ローダー(「GeoRasterツール: ローダー、ビューア、エクスポータ」を参照)に対してSRIDをパラメータとして指定するか、またはワールド・ファイルのロード後に、SDO_GEOR.setModelSRIDプロシージャをコールします。SDO_GEOR.setModelSRIDプロシージャをコールして、地理参照されるGeoRasterオブジェクトのモデル空間を変更することもできます。

  • 元のイメージが地理参照されたGeoTIFFイメージの場合、GeoRasterクライアント側のローダー・ツール(GeoRasterツール: ビューア、ローダー、エクスポータを参照)を使用して、raster=falsegeotiff=trueとともに指定し、GeoTIFFイメージからラスター・イメージ・データのない地理参照情報のみを既存のGeoRasterオブジェクトにロードできます。GeoTIFFの構成値が、Oracle Spatial and Graphによって認識されるSRIDと一致しない場合、srid記憶域パラメータ付きでバックアップSRIDを指定できます。

  • SDO_GEOR.setSRSプロシージャを使用して、GeoRaster SRSメタデータに直接アクセスすることで地理参照情報を追加、変更および削除できます。たとえば、SDO_GEOR_SRSオブジェクトを作成し、係数および関連する地理参照情報を割り当てた後、SDO_GEOR.setSRSプロシージャをコールして、任意のGeoRasterオブジェクトの空間リファレンス情報を追加または更新できます。SDO_GEOR.setSRSプロシージャを使用して、サポートされるすべての関数フィッティング地理参照モデルに対応する空間参照情報を設定できます。既存のDLTモデルや既存のRPCモデルからSRS情報を設定する方法の例は、SDO_GEOR.setSRSプロシージャのリファレンスの項を参照してください。

    1つのGeoRasterオブジェクトが別のGeoRasterオブジェクトと同じSRS情報を持つことがわかっている場合、SDO_GEOR.getSRSファンクションをコールしてこのGeoRasterオブジェクトからSDO_GEOR_SRSオブジェクトを取得し、次にSDO_GEOR.setSRSプロシージャをコールして最初のGeoRasterオブジェクトを地理参照できます。

  • アフィン変換を使用してGeoRasterオブジェクトを地理参照できる場合、SDO_GEOR.georeferenceプロシージャをコールしてGeoRasterオブジェクトを直接地理参照できます。SDO_GEOR.georeferenceのリファレンス情報に記載されているとおり、このプロシージャでは、係数ABCDEFおよびその他の情報を使用し、それらを係数abcdefに変換してGeoRasterオブジェクトの空間参照情報に格納します。元のラスター・データが幾何補正されており、基点(左上角)のモデル座標が(x0, y0)で、空間解像度値(スケール)がsである場合、A = s、B = 0、C = x0、D = 0、E = -s、F = y0となります。

  • 地上基準点(GCP)を保持しているか、独自にGCPを収集する場合、SDO_GEOR.georeferenceファンクションをコールしてGeoRasterオブジェクトを地理参照できます。詳細は、「高度な地理参照」を参照してください。

地理参照されるGeoRasterオブジェクトのSRS情報に基づいたGeoRasterの座標情報の変換では、特定のセル(ラスター)座標に関連付けられたモデル(地上)座標を検索します。または、その反対に特定のモデル(地上)座標に関連付けられたセル(ラスター)座標を検索します。つまり、次の操作を実行できます。

  • 任意のセル座標に対して、SDO_GEOR.getModelCoordinateファンクションを使用して、関連付けられたモデル空間座標を検索できます。たとえば、イメージ上の点を指定して、その点に関連付けられた緯度と経度を検索できます。

  • モデル空間座標に対して、SDO_GEOR.getCellCoordinateファンクションを使用して、関連付けられたセル座標を検索できます。たとえば、緯度と経度の座標を指定して、これらの座標に関連付けられたイメージ上のセルを検索できます。

3.8 空間エクステントの生成と設定

GeoRasterオブジェクトが作成される際、その空間エクステント(spatialExtentに示すspatialExtent属性)は、モデル空間の座標系の中では囲まれたジオメトリである必要はありません。空間エクステント(フットプリント)・ジオメトリは、最初はNULLであるか、またはセル空間の座標系や他の座標系を表すことがあります。空間エクステントを生成および設定する機能は、世界的な規模の範囲や広い地域の範囲の大容量のGeoRasterデータベースを作成する場合に便利です。この場合、空間エクステントは世界的な規模の1つの測地座標系の中にあり、GeoRasterオブジェクト(イメージ、DEMなど)は異なる投影座標系の中にあります。このような場合には、空間エクステント上に空間(Rツリー)索引を作成できますが、すべての空間エクステント・ジオメトリは同じSRID値を持つ必要があります。

表内の各GeoRasterオブジェクトの空間エクステント・ジオメトリがモデル空間の座標系(または使用する他の座標系)に対して正しくなるようにするには、空間エクステントを設定する必要があります。また、空間エクステント・ジオメトリで空間索引を使用する(「GeoRasterオブジェクトの索引付け」を参照)には、索引付けされたすべてのジオメトリが同じ座標系に基づいている(つまり同じSRID値を持つ)必要があります。

空間エクステントは、次のいずれかの方法で設定できます。SDO_GEOR.importFromプロシージャまたはGeoRasterクライアント側のローダー(「GeoRasterツール: ローダー、ビューア、エクスポータ」を参照)に対してspatialExtent=TRUEを記憶域パラメータとして指定するか、SQL UPDATE文を使用するか、またはGDALを使用したロード中に空間エクステントを設定します。SDO_GEOR.importFromプロシージャまたはローダーを使用する場合、SRIDはNULLまたは0(ゼロ)にはできません。また、GeoRasterの空間エクステントにRツリー索引が存在する場合は、空間エクステントのSRIDは既存の空間索引のSRIDと一致する必要があります。それ以外の場合は、空間エクステントはNULLに設定されます。

さらに、空間エクステント・ジオメトリがない場合は、SDO_GEOR.generateSpatialExtentファンクションを使用して作成し、そのジオメトリを使用してGeoRasterオブジェクトを更新できます。次の例では、(「GeoRaster表の作成」例3-1で作成した)CITY_IMAGES表のGeoRasterオブジェクトの空間エクステント・ジオメトリを更新し、そのオブジェクトの空間エクステント(モデル座標系を反映しているもの)を生成します。

UPDATE city_images c
  SET c.image.spatialExtent = sdo_geor.generateSpatialExtent(image)
    WHERE c.image_id = 100;
COMMIT;

次の例では、CITY_IMAGES表のすべてのGeoRasterオブジェクトの空間エクステント・ジオメトリを更新し、そのオブジェクトの空間エクステント(モデル座標系を反映しているもの)を生成します。

UPDATE city_images c
  SET c.image.spatialExtent = sdo_geor.generateSpatialExtent(image)
    WHERE c.image.spatialExtent is null;
COMMIT;

GeoRasterオブジェクトの空間エクステント・ジオメトリがわかっている場合、または空間エクステント・ジオメトリをモデル空間以外の座標系に基づくようにする場合は、SDO_GEOMETRYオブジェクトを作成するか、または表から選択します。その後、次の例に示すように、GeoRasterオブジェクトを更新して、その空間エクステント属性が対象のジオメトリに設定されるようにします。

DECLARE
 geom sdo_geometry;
BEGIN
-- Set geom to an SDO_GEOMETRY object that covers the spatial extent
-- of the desired GeoRaster object. If necessary, perform coordinate
-- system transformation before setting geom.
-- geom := sdo_geometry(...);
  UPDATE city_images c
    SET c.image.spatialExtent = geom WHERE c.image_id = 100;
  COMMIT;
END;

3.8.1 GeoRaster表に空間索引が含まれる場合の特別な考慮事項

GeoRaster空間エクステントに空間Rツリー索引を作成する場合(「GeoRasterオブジェクトの索引付け」を参照)、すべての空間エクステント・ジオメトリは同じSRID値を持つ必要があります。ただし、GeoRasterオブジェクトは異なるモデルSRIDを持つ場合があり、ほとんどのGeoRaster操作では、1つ以上のソースGeoRasterオブジェクトのモデルSRIDに基づいて、出力GeoRasterオブジェクトに空間エクステントが自動的に生成されます。これは、空間エクステントを持つ結果のGeoRasterオブジェクトがGeoRaster表に更新される場合、その表ではspatialExtent属性に基づいて作成された空間索引がすでに存在し、異なるSRIDが使用されている可能性があるため、問題となることがあります。

このような場合には、挿入または更新操作を行う前に、空間索引と同じSRIDに空間エクステントを変換する必要があります。次の例では、モザイク処理を実行しますが、結果のGeoRasterオブジェクトの空間エクステントをSRID 4326に変換してから、そのオブジェクトでGeoRaster表を更新しています。

DECLARE
  gr sdo_georaster;
BEGIN
  SELECT georaster INTO gr FROM mosaic_test WHERE georid=1 FOR UPDATE;
  sdo_geor.mosaic('mosaic_data', 'georaster', gr, 'blocking=OPTIMALPADDING,
blocksize=(512,512)');
  -- Transform the spatial extent geometry, if ncessary.
  -- In this example example, the modelSRID of the mosaic is 27302,
  -- but the SRID of the spatial index on mosaic_test is 4326.
  gr.spatialExtent := sdo_cs.transform(gr.spatialExtent, 4326);
  UPDATE mosaic_test SET georaster=gr WHERE georid=1;
END;
/

空間Rツリー索引が存在する場合、挿入または更新操作の後にコミット操作を行うと、挿入または更新されたGeoRasterオブジェクトに空間エクステント・ジオメトリが含まれている場合には、その索引は更新されます。これにより、各操作(特にイメージのバッチ・ロードなどのバッチ・ジョブ)の後にコミットを実行すると、一部の操作の処理速度が低下する可能性があります。通常、索引更新のパフォーマンスとGeoRaster操作とのバランスを取り、操作の後に一括してコミットする方がより効率的です。

たとえば、イメージ・データ・ロード(SDO_GEOR.importFromプロシージャおよびGeoRasterローダー)の後に内部コミット操作が続くため、spatialExtent=TRUEを指定して空間エクステントを生成している間にロードすることは効率的ではありません。かわりに、spatialExtent=FALSEを指定してから後でspatialExtent属性を更新した方が、ロード処理の速度を向上させることができます。

3.9 GeoRasterオブジェクトの索引付け

GeoRasterデータは、様々な方法で索引付けできます。GeoRasterオブジェクトに作成できる最も重要な索引は、GeoRasterオブジェクトの空間エクステント(フットプリント)・ジオメトリ(spatialExtent Attributeに示すspatialExtent属性)に対する空間索引(Rツリー)です。大規模な地理空間イメージおよびラスター・データベースの場合、GeoRaster列に対して常に空間索引を作成する必要があります。次に、GeoRaster列に対して空間索引を作成する場合の基本ステップを示します。(この例では、GeoRaster表の名前がCITY_IMAGESで、そのGeoRaster列の名前がIMAGEであると仮定します。)

  1. GeoRaster表の名前(この例ではCITY_IMAGES)とGeoRaster列の名前の空間エクステント(IMAGE.SPATIALEXTENT)を使用して、USER_SDO_GEOM_METADATAビューに行を挿入します。適切なSRID値(この例では3371)が登録されることを確認してください。
    INSERT INTO user_sdo_geom_metadata
        (TABLE_NAME,
         COLUMN_NAME,
         DIMINFO,
         SRID)
    VALUES (
         'city_images',
         'image.spatialextent',
         SDO_DIM_ARRAY(
            SDO_DIM_ELEMENT('X', -1000000000, 1000000000, 0.005),
            SDO_DIM_ELEMENT('Y', -1000000000, 1000000000, 0.005)),
         3371
    );
    
  2. 次の例のようにGeoRaster列に空間索引を作成します(次の例では、すべてのパラメータにデフォルト値を使用して、イメージの空間エクステントに対してCITY_IMAGES_IDXという空間索引を作成します)。
    CREATE INDEX city_images_idx 
          ON city_images (image.spatialextent)
          INDEXTYPE IS MDSYS.SPATIAL_INDEX;
    

    前述の文は、無効な空間エクステントが存在する場合や、前述のステップで登録したSRID値にGeoRaster表のSRID値が一致しない場合、失敗する可能性があります。文が失敗した場合、すべてのGeoRasterオブジェクトに有効なspatialExtentジオメトリ属性が存在し、すべてのspatialExtentジオメトリに同じSRIDが含まれることを確認してください。(spatialExtent値にはNULLを使用できます。)次に、空間索引を再作成します。

GeoRaster表にすでに空間索引が含まれる場合の特別な考慮事項については、「GeoRaster表に空間索引が含まれる場合の特別な考慮事項」も参照してください。空間索引の作成および拡張機能の詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。

次のような他の索引を作成することもできます。

  • Oracle XMLTypeまたはOracle Textドキュメントの索引付け機能を使用した、メタデータ・オブジェクトに対するファンクション索引

  • 雲、河川、湖、海、植物など、GeoRaster表の他のユーザー定義列に対する標準の索引

各ラスター・データ表のrasterIdpyramidLevelbandBlockNumberrowBlockNumberおよびcolumnBlockNumber列に対して単一のBツリー索引も作成する必要があります。これは、例3-2および例3-3に示すように、PRIMARY KEY (rasterID, pyramidLevel, bandBlockNumber,rowBlockNumber, columnBlockNumber)を使用して実行する必要があります。

3.10 GeoRasterオブジェクトの表示

GeoRasterデータを表示するには、次の方法があります。

  • SDO_GEOR.exportToプロシージャをコールしてGeoRasterオブジェクトをイメージ・ファイルにエクスポートした後、イメージ・ツールまたはWebブラウザを使用してイメージを表示します。

  • スタンドアロンのGeoRasterビューア・ツール(「GeoRasterツール: ローダー、ビューア、エクスポータ」に示すツールの1つ)を使用します。

  • Oracle Fusion Middleware MapViewerまたはそれに関連付けられたMap Builderユーティリティを使用します。

GeoRasterのビューア・ツールでは、データベース・スキーマ(ユーザー)のGeoRasterオブジェクトの選択、GeoRasterオブジェクトの全体またはサブセットの問合せと表示、ズームイン、ズームアウト、スクロール、および他の基本操作を実行できます。マウス・ポインタの位置の点について、ピラミッド・レベル、セル座標およびモデル座標(オブジェクトが地理参照されている場合)が表示されます。個々のセル値を表示して、RGBフルカラー表示のために、マルチバンド・イメージまたはハイパースペクトル・イメージの複数のレイヤーを選択できます。表示の最前面にブロック境界を重ねて表示できます。ビューアでは、データおよびユーザーの要件に応じて、イントラネットまたはインターネット上でラスター・データをグレースケール、疑似カラーおよび24ビット・トゥルーカラーで表示できます。一部の基本的なGeoRasterメタデータも表示されます。

GeoRasterビューア・ツールでは、GeoRaster表またはビューのいずれか1つまたはリストとして定義された仮想モザイクを表示できます。

GeoRasterのビューア・ツールには、GeoRasterオブジェクトの表示機能を強化するためのイメージ処理演算子のセットが含まれます。これらの演算子は、特にGeoRasterオブジェクトのセル深度が8を超える場合や、浮動小数点数である場合に役立ちます。また、このツールでは、GeoRasterオブジェクトにビットマップ・マスクがある場合に、そのビットマップ・マスクを表示および適用できます。

GeoRasterのビューア・ツールには、GeoRasterローダーおよびエクスポータ・ツールをコールするためのメニュー・コマンドも含まれています。これにより、1つのツールを、すべてのGeoRasterツールの機能へのインタフェースとして使用できます。

視覚化アプリケーションでは、GeoRasterオブジェクトのデフォルトのRGBAおよびデフォルトのピラミッド・レベルの指定を利用できます。SDO_GEOR.setDefaultColorLayerまたはSDO_GEOR.setDefaultRedSDO_GEOR.setDefaultGreenSDO_GEOR.setDefaultBlueおよびSDO_GEOR.setDefaultAlphaをコールすることで、デフォルトの赤、緑、青およびアルファ・チャネルとしてマルチバンド・イメージの異なるバンドを設定できます。大きなイメージの場合、SDO_GEOR.setDefaultPyramidLevelをコールして、アプリケーションの初期表示用のイメージに最適な解像度(ピラミッド)レベルを設定できます。たとえば、イメージ全体の完全な概要を取得するには、デフォルトのピラミッド・レベルとして最高のピラミッド・レベルを設定するのが最適です。

3.11 GeoRasterオブジェクトのエクスポート

イメージまたはラスター・データをロードおよびエクスポートする場合、サード・パーティのETLツールを常に検討してください(「GeoRasterツール: ローダー、ビューア、エクスポータ」の「ノート」を参照)。

GeoRasterの機能を使用してGeoRasterオブジェクトをイメージ・ファイルにエクスポートする場合、次の方法があります。

3.12 Workspace ManagerおよびLabel SecurityでのGeoRasterの使用

Oracle Workspace Managerでは、GeoRasterオブジェクトのラスター・ブロックのためのバージョニング機能が提供されます。Oracle Label Securityでは、ラスター・ブロックの行レベルの拡張セキュリティを使用するGeoRasterオブジェクトがサポートされます。

GeoRasterをOracle Workspace ManagerまたはOracle Label Securityと組み合せて使用するには、GeoRasterオブジェクトのリレーショナル表としてラスター・データ表(RDT)を作成する必要があります(例3-3を参照)。ベース・リレーショナルRDTでSDO_RASTER型のオブジェクト・ビューを定義する必要はありません。

3.12.1 Workspace ManagerでのGeoRasterの使用

Workspace Managerでは、異なる作業領域にラスター・データの異なるバージョンを保存して変更を加えることで、ラスター・データに対する変更を容易に管理できます。Workspace ManagerでGeoRasterを使用するには、ラスター記憶域用のリレーショナル・ラスター・データ表を使用し、それらのリレーショナル・ラスター・データ表をバージョン対応にする必要があります。たとえば (一般的な形式):

EXECUTE DBMS_WM.EnableVersioning (<rdt_relational_table>, 'VIEW_WO_OVERWRITE');

ノート:

バージョン対応にできるのは、ラスター・データ表のみです。GeoRasterオブジェクトが格納されているGeoRaster表は、バージョン対応にしないでください。また、作業領域での作業中にGeoRaster表を変更する必要のある操作は実行しないでください。

リレーショナルRDTをバージョン対応にした後に、DBMS_WMパッケージのサブプログラムを使用してラスター・データの変更を管理できます。ラスター・ブロックを直接変更する必要がある場合は、次の例に示すとおり、操作の前にDBMS_WM.copyForUpdateプロシージャをコールします。

declare
  geor sdo_georaster;
  cond varchar2(1000);
  lb   blob;
  r1   raw(1024);
  amt  number;
begin
  r1 := utl_raw.copies(utl_raw.cast_to_raw('0'),1024);
 
  select georaster into geor from georaster_table where georid=1;
  cond := 'rasterId=' || geor.rasterId || ' AND pyramidLevel=0 AND ' ||
          ' bandBlockNumber=0 AND rowBlockNumber=0 AND columnBlockNumber=0';
  dbms_wm.copyForUpdate(geor.rasterDataTable, cond);
  sdo_geor.getRasterBlockLocator(geor, 0, 0, 0, 0, lb, null, 'TRUE');
  amt := 1024;
  dbms_lob.write(lb, amt, 1, r1);
end;
/

ただし、GeoRasterサブプログラムを使用してラスター・データを変更する場合は、事前にDBMS_WM.copyForUpdateプロシージャをコールする必要はありません

Workspace Managerの詳細は、『Oracle Database Workspace Manager開発者ガイド』を参照してください。

3.12.2 Label SecurityでのGeoRasterの使用

Oracle Label Securityでは、ユーザーのセキュリティ・クリアランスのレベルに基づいて、機密データに対する行レベルのアクセス制御を実現できます。Label SecurityでGeoRasterを使用するには、次の基本ステップを実行します。

  1. GeoRaster表および1つ以上のリレーショナルRDTを作成します。
  2. Oracle Label Securityポリシーを作成してラベル・コンポーネントを定義します。
  3. GeoRaster表と1つ以上のリレーショナルRDTに対してラベル付けファンクションを作成します。

    GeoRaster表の行のラベルは、アプリケーションの要求に従って生成される必要があります。GeoRasterオブジェクトを格納する行と、関連するRDTのGeoRasterオブジェクトのラスター行には、両方とも同じラベルを使用してください。異なるラベルを使用すると、GeoRasterオブジェクトが無効になるか、一貫性のないステータスになる可能性があります。

    次の例では、リレーショナルRDTに対してラベル付けファンクションを作成します。

    CREATE OR REPLACE FUNCTION gen_rdt_label(rdt_name varchar2, rid number)
      RETURN LBACSYS.LBAC_LABEL
    AS
      tabname varchar2(80);
      schema  varchar2(32);
      grcol   varchar2(1024);
      colname varchar2(30);
      label   NUMBER;
    BEGIN
      EXECUTE IMMEDIATE
       'SELECT v.owner, v.table_name, v.column_name grcol, p.column_name ' ||
       '  FROM all_sdo_geor_sysdata v, all_sa_policies p, all_sa_table_policies t '
       || ' WHERE v.rdt_table_name=:1 AND v.raster_id=:2 AND ' ||
       ' v.owner=t.schema_name AND v.table_name=t.table_name AND ' ||
       ' p.policy_name=t.policy_name ' 
       INTO schema, tabname, grcol, colname
       USING upper(rdt_name), rid;
      EXECUTE IMMEDIATE
        'SELECT t.' || colname  ||
         ' FROM ' || schema || '.' || tabname || ' t ' ||
         ' WHERE t.' || grcol || '.rasterdatatable=:1 AND ' ||
         '       t.' || grcol || '.rasterid=:2' 
        INTO label
        USING upper(rdt_name), rid;
      RETURN LBACSYS.LBAC_LABEL.NEW_LBAC_LABEL(label);
    END;
    /
    
  4. Label SecurityポリシーをGeoRaster表とそれに関連する1つ以上のRDTに適用します。

    次の一般的な形式の例では、前述のステップにおけるラベル付けファンクションの例を使用して、Label Securityポリシーを1つのRDTに適用します。

    BEGIN
      SA_POLICY_ADMIN.REMOVE_TABLE_POLICY(<policy_name>,<schema_name>,<rdt_relational_table>);
      SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
        POLICY_NAME => <policy_name>,
        SCHEMA_NAME => <schema_name>,
        TABLE_NAME  => <rdt_relational_table>,
        TABLE_OPTIONS => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL',
        LABEL_FUNCTION => '<schema_name>.gen_rdt_label(<rdt_relational_table>,:new.rasterid)',
        PREDICATE => NULL);
    END;
    /
    
  5. ユーザーを作成して認可を行い、Label Securityに関連する他の管理タスクを完了します。

ポリシーを表に適用する前または後に、GeoRasterデータをロードできます。

ALL_SDO_GEOR_SYSDATAビュー(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」を参照)には、現行ユーザーがアクセス可能なすべてのGeoRasterオブジェクトに関するシステム・データが含まれます。この場合のアクセス可能性は、任意アクセス制御(DAC)のコンテキストで定義されたユーザーの権限によって決定されます。

GeoRaster表の行のラベルが更新されたら、各ラベルが同期するように、RDTの関連するデータ・ラベルも更新される必要があります。

Label Securityの詳細は、『Oracle Label Security管理者ガイド』を参照してください。

3.13 GeoRasterオブジェクトによる表領域の効率的な使用のメンテナンス

操作を削除またはロールバックしても、ラスター・データ表に割り当てられた未使用の領域は、基礎となる表領域に自動的に戻されません。これにより、表領域領域が無駄になる可能性があります。通常、GeoRasterデータベースは大きいため、特にディスク領域が制限されている場合、表領域の使用を効率的に維持することをお薦めします。自動セグメント領域管理の表領域でBasicFiles LOBを使用してラスター・データ表を作成した場合、ラスター・データ表を変更することでrasterBlock LOBセグメントまたはラスター・データ表を明示的に縮小できるため、例3-4および例3-5に示すように、表セグメントを圧縮して未使用のLOBセグメントを表領域に解放できます。

例3-4 BasicFile rasterBlock LOBセグメントの縮小

ALTER TABLE city_images_rdt MODIFY LOB (rasterBlock) (SHRINK SPACE);

例3-5 ラスター・データ表の縮小

ALTER TABLE city_images_rdt ENABLE ROW MOVEMENT;
ALTER TABLE city_images_rdt SHRINK SPACE CASCADE;

作成および使用する一時GeoRasterオブジェクトがある場合は、これらのGeoRasterオブジェクトを保持するために、一時GeoRaster表およびRDT表の作成を常に検討することをお薦めします。不要になったら、一時GeoRaster表およびRDT表を削除してディスク領域を解放できます。

3.14 データベースのGeoRaster表およびオブジェクトの確認

データベース管理目的のため、データベース全体または特定のスキーマのGeoRaster表およびオブジェクトを確認する必要がある場合があります。GeoRasterデータベースの作成後、既存のGeoRaster表、RDT表およびGeoRasterオブジェクトを確認およびリストするための次のオプションがあります。

  • 次のサブプログラムは、データベース接続に関連付けられた権限に応じて、現行のスキーマまたはデータベース内の既存のGeoRasterオブジェクトおよび関連オブジェクトの状態をチェックします。

    SDO_GEOR_ADMIN.listGeoRasterObjectsは、現行のスキーマに定義されているすべてのGeoRasterオブジェクトをリストします。DBAロールを持つユーザーとしてこのファンクションをコールすると、データベースに定義されているすべてのGeoRasterオブジェクトがリストされます。

    SDO_GEOR_ADMIN.listGeoRasterColumnsは、現行のスキーマに定義されているすべてのGeoRaster列をリストします。DBAロールを持つユーザーとしてこのファンクションをコールすると、データベースに定義されているすべてのGeoRaster列がリストされます。

    SDO_GEOR_ADMIN.listGeoRasterTablesは、現行のスキーマに定義されているすべてのGeoRaster表をリストします。DBAロールを持つユーザーとしてこのファンクションをコールすると、データベースに定義されているすべてのGeoRaster表がリストされます。

    SDO_GEOR_ADMIN.listRDTは、現行のスキーマに定義されているすべてのラスター・データ表(RDT)をリストします。DBAロールを持つユーザーとしてこのファンクションをコールすると、データベースに定義されているすべてのラスター・データ表(RDT)がリストされます。

    SDO_GEOR_ADMIN.listRegisteredRDTは、現行のスキーマに定義されているすべての登録済ラスター・データ表(RDT)をリストします。DBAロールを持つユーザーとしてこのファンクションをコールすると、データベースに定義されているすべての登録済RDTがリストされます。SYSDATA表内の1つ以上のエントリから参照されていれば、RDTは登録済です。

    SDO_GEOR_ADMIN.listUnregisteredRDTは、現行のスキーマに定義されているすべての未登録のラスター・データ表(RDT)をリストします。DBAロールを持つユーザーとしてこのファンクションをコールすると、データベースに定義されているすべての未登録のRDTがリストされます。SYSDATA表内のエントリから参照されていない場合、RDTは未登録です。

  • GeoRaster sysdataビューに対して直接SQL問合せを実行し、異なるスキーマに格納されているGeoRaster表およびオブジェクトを確認またはリストします。この方法はサブプログラムのコールよりも柔軟性があります。また、SDO_GEOR_ADMINパッケージで定義されているファンクションによって戻すことができない問合せ結果を有効化します。次に、問合せの例をいくつか示します。

    スキーマHERMANおよびMYTESTで定義されている現行のスキーマでアクセス可能なすべてのGeoRasterオブジェクトをリストします。

    SELECT owner,TABLE_NAME,COLUMN_NAME,RDT_TABLE_NAME,RASTER_ID from all_sdo_geor_sysdata where owner='HERMAN' or owner='MYTEST';

    現行のスキーマでアクセス可能なGeoRasterオブジェクトの合計数をカウントします。

    SELECT count(*) from all_sdo_geor_sysdata;

    現行のスキーマのGeoRaster表GTF_TABLEに格納されているGeoRasterオブジェクトの合計数をカウントします。

    SELECT count(*) from user_sdo_geor_sysdata where TABLE_NAME='GTF_TABLE';

    現行のスキーマのRDT表RDT_1に格納されているすべてのGeoRasterオブジェクトをリストします。

    SELECT TABLE_NAME,COLUMN_NAME,RDT_TABLE_NAME,RASTER_ID from user_sdo_geor_sysdata where RDT_TABLE_NAME='RDT_1';

    ラスター・データを格納しているか、現行のスキーマのRDT表RDT_1を参照しているすべてのGeoRaster表を確認します。

    SELECT distinct TABLE_NAME from user_sdo_geor_sysdata where RDT_TABLE_NAME='RDT_1';

    現行のスキーマのGeoRaster表GTF_TABLEで使用されるすべてのRDT表をリストします。

    SELECT distinct RDT_TABLE_NAME from user_sdo_geor_sysdata where TABLE_NAME='GTF_TABLE';

3.15 データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス

GeoRasterには、無効なGeoRasterオブジェクトおよびシステム・データの作成を防止する内部データベース・メカニズムがありますが、特に以前のリリースからのアップグレード後や、GeoRasterシステム・データに対する操作で複数のユーザー・エラーが発生した後には、データベース内にそのような無効なGeoRasterオブジェクトやシステム・データが発生することがあります。無効なオブジェクトおよびシステム・データの例は、次のとおりです。

  • GeoRasterシステム・データ・ビューのエントリ(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」xxx_SDO_GEOR_SYSDATAを参照)が、存在しないGeoRaster表または列を示します。

  • 2つ以上のGeoRasterオブジェクトに、RDT名とラスターID値の同じ組合せが含まれています。

  • 一部のGeoRasterオブジェクト、表、列またはRDTが登録されていません。

  • RDT名が一意ではありません。

  • GeoRasterオブジェクトが空または空白ではないが、関連するRDTが存在しません。

データベースのアップグレード後、次を実行する必要があります。

  • SDO_GEOR_ADMIN.isGeoRasterEnabled関数をコールして、GeoRasterが現在のスキーマに対して有効になっていることを確認します。

  • SDO_GEOR_ADMIN.isUpgradeNeeded関数をコールして、現在のバージョンで無効なGeoRasterオブジェクトおよび無効なシステム・データを確認します。

  • なんらかのエラーや無効なデータが検出された場合は、SDO_GEOR_ADMIN.upgradeGeoRasterファンクションをコールして問題を自動的に修正します。

  • DBAロールを持つユーザーとして接続すると、SDO_GEOR_ADMIN.upgradeGeoRasterファンクションはデータベース内のすべてのGeoRasterオブジェクトをアップグレードします。それ以外の場合は、現行ユーザーのスキーマのGeoRasterオブジェクトのみをアップグレードします。(詳細は、SDO_GEOR_ADMIN.upgradeGeoRasterに関するリファレンスおよび使用情報を参照してください。)

発生する可能性のあるユーザー・エラーに対する定期的なメンテナンスでは、無効なGeoRasterオブジェクトおよびシステム・データ・エントリを検出して修正するために次のファンクションおよびプロシージャが役立ちます。

詳細は、「SDO_GEOR_ADMINパッケージのリファレンス」のこれらのプロシージャおよびファンクションのリファレンスおよび使用情報を参照してください。

3.16 データベース間でのGeoRasterデータの転送

GeoRasterデータは、同じデータベース内のスキーマ間、またはデータベース間で転送できます。GeoRasterデータを転送する方法はいくつかあります。

  • GDALまたはGeoRaster ETLツールを使用して、同じデータベース内のスキーマ間、またはデータベース間でGeoRasterデータを転送します。この方法では、ソースGeoRaster表からGeoTIFFなどの交換ファイル形式にラスターをエクスポートし、その後、ターゲット・スキーマまたはデータベースにそれらをインポートします。
  • SDO_GEOR.copyまたはSDO_GEOR.changeFormatCopyプロシージャを使用して、同じデータベース内のスキーマ間でGeoRasterデータを転送します。アクセス権が付与されている場合、GeoRasterオブジェクトはスキーマ間で直接コピーされます。
  • データ・ポンプ・エクスポート・ユーティリティおよびインポート・ユーティリティを使用して、同じデータベース内のスキーマ間、またはデータベース間でGeoRasterデータを転送します。詳細は、データ・ポンプ・ユーティリティを使用したGeoRasterデータの転送を参照してください。
  • トランスポータブル表領域を使用して、データベース間でGeoRasterデータを転送します。詳細は、トランスポータブル表領域を使用したGeoRasterデータの転送を参照してください。
  • Oracleデータベース・リンクを使用して、データベース間でGeoRasterデータを転送します。詳細は、GeoRasterデータでのデータベース・リンクの使用を参照してください。

GeoRasterデータベースでは、各ラスター・データ表(RDT)の名前は一意である必要があり、GeoRasterオブジェクトの(rasterDataTable, rasterID)のペアはデータベース内で一意である必要があります(「ラスター・データ表」を参照)。そのため、データ・ポンプ、トランスポータブル表領域またはデータベース・リンクの方法を使用してデータベース間でGeoRasterデータを転送する場合、ターゲット・データベース内のrasterDataTable名またはrasterIDの競合が発生する可能性があります。RDT名を変更して一意にすると属性のペア(rasterDataTable, rasterID)が自動的に一意になるため、これらの各データ転送方法に関する以降のサブセクション内の例で示すように、RDTの名前を変更することで競合を必ず解決することをお薦めします。また、同じ名前のGeoRaster表がターゲット・データベースにすでに存在する場合は、ターゲット・データベース内の転送されたGeoRasterオブジェクトを既存のGeoRaster表に追加するのではなく、それらのオブジェクト用に新しいGeoRaster表を作成することをお薦めします。

3.16.1 データ・ポンプ・ユーティリティを使用したGeoRasterデータの転送

データ・ポンプ・ユーティリティを使用すると、同じデータベース内のスキーマ間、またはデータベース間でGeoRasterデータを転送できます。次に、データベース間でGeoRasterデータを転送する手順を示します。ただし、それらはスキーマ間のGeoRasterデータ転送にも適用できます。データ・ポンプ・エクスポート・ユーティリティとインポート・ユーティリティ、および従来のエクスポート・ユーティリティとインポート・ユーティリティの詳細は、『Oracle Databaseユーティリティ』を参照してください。

データ・ポンプを使用してGeoRasterデータをエクスポートする方法は、他のタイプのデータをエクスポートする場合と同様ですが、GeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)および内部DDLトリガー(名前がSDO_GEOR_ADDL_TRIGGERおよびSDO_GEOR_BDDL_TRIGGER)は除外します。たとえば:

expdp herman DIRECTORY=dump_dir DUMPFILE=data.dmp 
TABLES=herman.georaster_table,herman.rdt_1,herman.rdt_2 
PARFILE=exclude.par
Enter password: password

前述のコードでは、exclude.parファイルの内容は次のとおりです。

exclude=trigger:"like 'GRDMLTR_%'"
exclude=trigger:"= 'SDO_GEOR_ADDL_TRIGGER'"
exclude=trigger:"= 'SDO_GEOR_BDDL_TRIGGER'"

次に、データ・ポンプを使用してGeoRasterデータ(つまり、GeoRaster表および関連するラスター・データ表(RDT))をターゲット・データベースにインポートするための一般的な手順を示します。

  1. ターゲット・データベース・スキーマがGeoRasterに対応していることを確認します。スキーマ・レベルでのGeoRasterの有効化で説明されているステップに従います。
  2. データ・ポンプ・ダンプ・ファイル内のGeoRasterオブジェクトとターゲット・データベース内のGeoRasterオブジェクトとの間に競合があるかどうかを確認します。
    1. ターゲット・データベースにGeoRasterオブジェクトがない場合は、競合はありません。
    2. ダンプ・ファイル内のGeoRaster表名およびRDT名がわかっている場合は、ターゲット・データベースでSDO_GEOR_ADMIN.isRDTNameUniqueファンクションを使用してRDT名の競合があるかどうかを確認します。たとえば:
      SELECT SDO_GEOR_ADMIN.isRDTNameUnique(<rdt_name>) FROM DUAL;

      前述のコードでは、<rdt_name>はダンプ・ファイル内のRDTの名前です。問合せでFALSEが返された場合、<rdt_name>にRDT名の競合があります。

    3. ダンプ・ファイル内のGeoRaster表名およびRDT名が不明な場合は、SQLFILEオプションを指定してimpdpを使用し、すべてのインポートDDL文をファイルに取得します。GeoRaster表名およびRDT名を、そのファイル内のDDL文から取得します。たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp SQLFILE=dpump_dir:ddl.sql REMAP_SCHEMA=herman:scott

      前述のコードでは、ddl.sqlに、impdpによって実行されるDDL文が含まれています。次に、ddl.sql内の各RDT名について、ターゲット・データベースでSDO_GEOR_ADMIN.isRDTNameUniqueファンクションを使用してRDT名の競合があるかどうかを確認します。

  3. ステップ2でRDT名の競合が検出された場合、またはインポートしたRDT表の名前を変更する場合は、このステップをスキップしてステップ4に進みます。それ以外の場合は、次の説明に従ってGeoRaster表およびRDT表をインポートし、インポートしたデータを検証します。この後は、ステップ4をスキップしてもかまいません。これは、このステップの最後に必要なGeoRasterデータがすでにインポートされているためです。

    他のタイプのデータをインポートする場合と同じようにGeoRasterデータをインポートしますが、エクスポート操作でGeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)およびDDLトリガー(SDO_GEOR_ADDL_TRIGGERおよびSDO_GEOR_BDDL_TRIGGER)を除外しなかった場合は、除外します。たとえば:

    impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp PARFILE=exclude.par
     REMAP_SCHEMA=herman:scott TABLES=herman.georaster_table,herman.rdt_1,herman.rdt_2

    前述のコードでは、exclude.parファイルの内容は次のとおりです。

    exclude=trigger:"like 'GRDMLTR_%'"
    exclude=trigger:"= 'SDO_GEOR_ADDL_TRIGGER'"
    exclude=trigger:"= 'SDO_GEOR_BDDL_TRIGGER'"

    GeoRasterの内部DMLトリガーおよびDDLトリガーを除外しないと、次のようなimpdpエラーが発生します。ただし、それらのエラーは無視しても問題ありません。

    ORA-39083: Object type TRIGGER failed to create with error:
    ORA-13391:  GeoRaster reserved names cannot be used to create regular triggers
  4. 競合を解決し、GeoRasterデータをインポートします。
    1. インポート中にRDT名を新しいRDT名に変更するには、REMAP_TABLEオプションを指定してimpdpを使用することでRDTをインポートします(RDT名がターゲット・データベース全体で一意であることを確認してください)。データ転送を容易にするために、また推奨事項として、新しいRDT名は、古いRDT名すべての末尾に文字列と数字を付加することで作成します。
      たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp
      TABLES=herman.rdt_1,herman.rdt_2 REMAP_SCHEMA=herman:scott 
      REMAP_TABLE=herman.rdt_1:rdt_1_imp_1, herman.rdt_2:rdt_2_imp_1

      前述のコードでは、rdt_1rdt_1_imp_1に再マップされ、rdt_2rdt_2_imp_1に再マップされます。

    2. CONTENT=METADATA_ONLYオプションを指定してimpdpを使用することでGeoRaster表のメタデータをインポートし、ステップ3の説明に従ってGeoRasterのDMLトリガーおよびDDLトリガーを除外します。
      たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp TABLES=herman.georaster_table 
      REMAP_SCHEMA=herman:scott CONTENT=metadata_only PARFILE=exclude.par

      ターゲット・スキーマにそのGeoRaster表がすでに存在する場合は、前述のコードでREMAP_TABLEオプションを使用して、インポートしたGeoRaster表名を新しい名前に再マップすることをお薦めします。

    3. GeoRaster表のメタデータをインポートするターゲット・データベースにログインし、インポートしたGeoRaster表ごとに一時DMLトリガーを作成します。これにより、ステップdのデータ・インポート中に、インポートしたGeoRasterオブジェクトのrasterDataTable属性が新しいRDT名に自動的に置換されます。新しいRDT名は、ステップaの新しいRDT名と同じである必要があります。
      DMLトリガー定義の例を次に示します。
      DEFINE tname=georaster_table  -- the georaster table name
      DEFINE cname=grobj            -- the georaster column name
      DEFINE rdt_suffix=’IMP’       -- the string to append  to the RDT names 
      DEFINE seq_num=1              -- the number to append  to the RDT names
      
      CREATE OR REPLACE TRIGGER tmp_dml_trigger 
        BEFORE INSERT ON &tname 
        FOR EACH ROW 
        BEGIN
        -- the new RDT table name is constructed as the old RDT table name appended with
        -- the string defined in rdt_suffix and the sequence number defined in seq_num. 
        :new.&cname.rasterDataTable := :new.&cname.rasterDataTable||’_&rdt_suffix’||’_’||’&seq_num’;
        END;
      /
      
    4. CONTENT=DATA_ONLYオプションを指定してimpdpを使用することで、GeoRaster表データをインポートします。たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp  
      TABLES=herman.georaster_table REMAP_SCHEMA=herman:scott CONTENT=data_only

      ステップbでREMAP_TABLEオプションを使用した場合は、前述のコードにもそのオプションを含めます。

    5. ステップcで作成した一時DMLトリガーを削除します。インポートしたデータを検証して確認します。
    前述の例では、ソース・データベース内のスキーマHERMANからターゲット・データベース内のスキーマSCOTTに、GeoRaster表georaster_tableおよび2つのRDT (rdt_1およびrdt_2)を転送しています。georaster_table内のすべてのGeoRasterオブジェクトはそれらのラスター・セル・データをrdt_1またはrdt_2に格納し、これら2つのRDTは他のGeoRaster表で使用されないものとします。

3.16.2 トランスポータブル表領域を使用したGeoRasterデータの転送

Oracle Databaseトランスポータブル表領域機能を使用して、データベース間でGeoRasterデータを転送できます。空間データでの表領域転送機能の使用の詳細は、Oracle Database管理者ガイドデータベース間での表領域の転送を参照してください。

トランスポートする表領域に、GeoRaster表またはラスター・データ表(RDT)に対する空間索引が含まれる場合、状況によってはいくつかの準備ステップを実行する必要があります。空間データでのトランスポータブル表領域機能の使用の詳細は、Oracle Spatial and Graph開発者ガイドSDO_UTIL.INITIALIZE_INDEXES_FOR_TTSプロシージャの使用上のノートを参照してください。

次の項で説明する手順で、トランスポータブル表領域を使用してデータベース間でGeoRasterデータを転送できます。

3.16.2.1 ソース・データベースからの表領域のエクスポート

GeoRasterデータの移行のためにソース・データベースから表領域をエクスポートするには、次の手順を実行します。

  1. 転送する表領域が自己完結型であることを確認します。たとえば、SQL*PlusでDBAとして次を実行します。
    EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK(‘tbs_1, tbs_2’, TRUE);
    SELECT * FROM TRANSPORT_SET_VIOLATIONS;

    前述のコードでは、tbs_1およびtbs_2は、転送する表領域の名前です。

  2. 転送する表領域をREAD ONLYにします。たとえば、SQL*PlusでDBAとして次を実行します。
    ALTER TABLESPACE tbs_1 READ ONLY;
    ALTER TABLESPACE tbs_2 READ ONLY;
  3. DATAPUMP_EXP_FULL_DATABASEロールを持つユーザーとしてデータ・ポンプ・エクスポート・ユーティリティを実行します。たとえば:
    $ expdp <user_name> DUMPFILE=tbs_meta.dmp DIRECTORY=data_pump_dir TRANSPORT_TABLESPACES=tbs_1,tbs_2 LOGFILE=tts_exp.log
  4. ステップ3でエクスポートしたダンプ・ファイル、および表領域データファイルを、ターゲット・データベースからアクセスできるディレクトリに転送します。
  5. 表領域をREAD WRITEモードに戻します。
    ALTER TABLESPACE tbs_1 READ WRITE;
    ALTER TABLESPACE tbs_2 READ WRITE;
3.16.2.2 ターゲット・データベースへの表領域のインポート

GeoRasterデータの移行のためにターゲット・データベースに表領域をインポートするには、次の手順を実行します。

  1. ターゲット・データベース・スキーマがGeoRasterに対応していることを確認します。スキーマ・レベルでのGeoRasterの有効化で説明されているステップに従います。
  2. データ・ポンプ・インポート・ユーティリティを実行します。たとえば:
    $ impdp <user_name> DIRECTORY=data_pump_dir DUMPFILE=tbs_meta.dmp 
    LOGFILE=tts_imp.log TRANSPORT_DATAFILES='/app/oracle/oradata/tbs_1.dbf', ’/app/oracle/oradata/tbs_2.dbf’ 
    REMAP_SCHEMA=src_gruser1:target_gruser1 REMAP_SCHEMA=src_gruser2:target_gruser2 PARFILE=exclude.par

    前述のコードでは、<user_name>DATAPUMP_EXP_FULL_DATABASEロールを持つユーザーです。

    exclude.parファイルの内容は次のとおりです。

    exclude=trigger:"like 'GRDMLTR_%'"
    exclude=trigger:"= 'SDO_GEOR_ADDL_TRIGGER'"
    exclude=trigger:"= 'SDO_GEOR_BDDL_TRIGGER'"

    そのGeoRaster表名がターゲット・データベース・スキーマにすでに存在する場合は、impdpコマンドのREMAP_TABLEオプションを使用してGeoRaster表名を新しい名前に再マップします。

  3. 転送された表領域をREAD WRITEモードに設定します。
    ALTER TABLESPACE tbs_1 READ WRITE;
    ALTER TABLESPACE tbs_2 READ WRITE;
  4. ターゲット・データベース内にRDT名の競合があるかどうかを確認します。
    1. DBAとして次の問合せを実行することで、転送された表領域内のGeoRaster表および列を確認します。
      SELECT t.owner, t.table_name, c.column_name 
      FROM dba_all_tables t, dba_tab_columns c 
      WHERE t.tablespace_name IN ('TBS_1', ‘TBS_2’) 
           AND t.owner = c.owner 
           AND t.table_name = c.table_name 
           AND c.data_type = 'SDO_GEORASTER' 
           AND c.data_type_owner IN ('MDSYS', 'PUBLIC');

      前述のコードでは、TBS_1およびTBS_2は、転送された表領域の名前です。この問合せでは、転送された表領域内のGeoRaster表および列の名前のリストが返されます。

    2. RDT名の競合があるかどうかを確認します。
      SELECT a.rdt_name 
          	    FROM ( SELECT UNIQUE t.<column_name>.rasterdatatable rdt_name 
                  		FROM <owner>.<table_name> t) a
                      WHERE SDO_GEOR_ADMIN.isRDTNameUnique(a.rdt_name)=’FALSE’;
      
      

      前述のコードでは、<owner><table_name>および<column_name>は、ステップaで返された名前です。

      この問合せでは、名前を変更する必要がある、転送された表領域内の競合しているRDT名が返されます。
  5. ステップ4でRDT名の競合がない場合は、このステップをスキップしてステップ6に進みます。それ以外の場合は、転送されたRDTの名前を変更することで、ターゲット・データベース内の競合を解決します。
    1. DBA_TRIGGERSビューを問い合せることで、転送されたGeoRaster表のDMLトリガー名(GRDMLTR_で始まるもの)を確認します。
      SELECT owner, trigger_name FROM dba_triggers WHERE table_owner = ‘<owner>’
      AND table_name = ‘<table_name>’ AND trigger_name LIKE 'GRDMLTR_%';

      前述のコードでは、<table_name>および<owner>は、ステップ4で検出された競合しているRDT名があるGeoRaster表の名前と所有者です。

    2. DBAとして接続し、ステップaで返されたDMLトリガーを無効にします。
      ALTER TRIGGER <owner>.<TRIGGER_NAME> DISABLE;
    3. 競合しているRDTを新しい名前に変更し、GeoRaster表内のGeoRasterオブジェクトのrasterDataTable属性を更新します。SQL*Plusで所有者としてRDTに接続します。
      RENAME <old_rdt> to <new_rdt>;
      UPDATE <table_name> t  SET t.<column_name>.rasterDataTable = ‘<new_rdt>’ 
      WHERE t.<column_name>.rasterDataTable=’<old_rdt>’;

      前述のコードで:

      • <old_rdt>: 競合している古いRDT名
      • <new_rdt>: ターゲット・データベース内で一意の新しいRDT名
      • <table_name>: GeoRaster表名
      • <column_name>: ステップ4で返された競合するRDT名に関連付けられているGeoRaster列名

      競合するRDTすべてについてこのステップを繰り返します。

    4. DBAとして接続し、ステップbで無効にしたDMLトリガーを有効にします。
      ALTER TRIGGER <owner>.<TRIGGER_NAME> ENABLE;
  6. 競合がないか、ステップ5で競合を解決した場合は、SDO_GEOR_ADMIN.registerGeoRasterObjectsをコールして、転送されたGeoRasterオブジェクトを登録します。たとえば、SQL*PlusでDBAとして次を実行します。
    EXECUTE SDO_GEOR_ADMIN.registerGeoRasterObjects;

3.16.3 GeoRasterデータでのデータベース・リンクの使用

Oracle Databaseリリース12.2以降、データベース・リンクを使用して、あるデータベースから別のデータベースにGeoRasterデータを転送できます。

データベース・リンクを介してSQL問合せを実行し、ラスター・データ表(RDT)内のリモートGeoRasterオブジェクトの属性およびバイナリ・データにアクセスできます。GeoRaster PL/SQLパッケージで提供されるGeoRasterデータ操作は、データベース・リンクを介してリモートGeoRasterオブジェクトで使用することはできません。

ノート:

異なるリリースのデータベース間の相互運用性サポートは、Oracle相互運用性サポートで確認できます。

データベース・リンクを介してGeoRasterデータを転送するには:

  1. ターゲット・データベース・スキーマがGeoRasterに対応していることを確認します。スキーマ・レベルでのGeoRasterの有効化で説明されているステップに従います。
  2. 次のSQL文を実行して、ターゲット・データベースにデータベース・リンクを作成します。
    CREATE PUBLIC DATABASE LINK <dblink name> 
          CONNECT TO <username> IDENTIFIED BY <password>
          USING '<tnsname>';

    前述のコードで:

    • <dblink name>: データベース・リンクの名前
    • <username>: GeoRaster表が存在するソース・データベース・スキーマに接続するためのユーザー名
    • <password>: ソース・データベース・ユーザーのパスワード
    • <tnsname>: ターゲット・データベースのtnsname.oraに定義されているソース・データベース接続名
  3. ソース・データベースから転送するGeoRaster表およびRDTを特定します。ターゲット・データベースから次の問合せを実行して、GeoRaster表内のGeoRasterオブジェクトに関連付けられているRDTを取得します。
    SELECT UNIQUE t.<column_name>.rasterDataTable FROM <source_georaster_table>@<dblink_name> t;

    前述のコードでは、<column_name>は、ソース・データベース内の <source_georaster_table>のGeoRaster列名です。

  4. ソース・データベースからターゲット・データベースにRDTデータを転送します。
    CREATE TABLE <target_rdt_table> AS (SELECT * FROM <source_rdt_table>@<dblink_name>);
    前述のコードの<source_rdt_table>は、ステップ3で特定したRDTです(この例では、<source_rdt_table>には転送するラスター・データのみが含まれていると想定しています)。<source_rdt_table>がターゲット・データベース内で一意である場合(SDO_GEOR_ADMIN.isRDTNameUnique(<source_rdt_table>)trueを返す)、<target_rdt_table><source_rdt_table>と同じである必要があります。それ以外の場合は、<target_rdt_table>の一意の名前を選択します。
  5. ソース・データベースからターゲット・データベースにGeoRaster表内のGeoRasterオブジェクトを転送します。次のように、新しいGeoRaster表をターゲット・データベース内に作成できます。
    CREATE TABLE <target_georaster_table> AS (SELECT * FROM <source_georaster_table>@<dblink_name>);
    ステップ4でターゲット・データベース内で作成した新しいRDTの名前<target_rdt_table>がソース・データベース内のRDT名<source_rdt_table>と異なる場合は、<target_georaster_table>内のGeoRasterオブジェクトのrasterDataTable属性を次のように更新する必要があります。
    1. スキーマ・ユーザーとして接続し、GeoRaster表のGeoRaster DMLトリガー名を確認します。
      SELECT trigger_name FROM user_triggers WHERE table_name = ‘<target_georaster_table>’ AND trigger_name LIKE 'GRDMLTR_%';

      前述のコードでは、<target_georaster_table>はターゲット・データベース内のGeoRaster表名です

    2. DBAとして接続し、GeoRaster DMLトリガーを無効にします。
      ALTER TRIGGER <owner>.<trigger_name> DISABLE;
    3. スキーマ・ユーザーとして接続し、GeoRasterオブジェクトのrasterDataTable属性を更新します。
      UPDATE <target_georaster_table> t  SET t.<column_name>.rasterDataTable = ‘<target_rdt_table>’ 
      WHERE t.<column_name>.rasterDataTable=’<source_rdt_table>’;

      前述のコードでは、<source_rdt_table>および<target_rdt_table>は、ステップ4で使用した表名です。<column_name>は、<target_georaster_table>内のGeoRaster列名です。

    4. DBAとして接続し、GeoRaster DMLトリガーを有効にします。
      ALTER TRIGGER <owner>.<trigger_name> ENABLE;
  6. スキーマ・ユーザーとして接続し、ターゲット・データベース内の転送されたGeoRasterオブジェクトを登録します。
    EXECUTE SDO_GEOR_ADMIN.registerGeorasterObjects;

    データ・ポンプ・インポート・ユーティリティでデータベース・リンクを使用して、ソース・データベースからターゲット・データベースにGeoRasterデータを直接転送することもできます。データ・ポンプ・インポート・ユーティリティを使用してGeoRasterデータを転送する方法の詳細は、データ・ポンプ・ユーティリティを使用したGeoRasterデータの転送を参照してください。