17 プラガブル・データベースのサポート

マルチテナント・アーキテクチャにより、Oracle Databaseにスキーマ、スキーマ・オブジェクト、および非スキーマ・オブジェクトのポータブル・コレクションを含めることができ、これらはOracleクライアントに個別のデータベースとして表示されます。

マルチテナント・コンテナ・データベース(CDB)は、1つ以上のユーザー作成のプラガブル・データベース(PDB)を含むOracle Databaseです。

OCIクライアントは、関連するPDBにプラガブル・データベースが適切に設定されているサービスを使用してそのPDBに接続できます。

通常、OCIコールはプラガブル・データベースか通常のデータベースのいずれかに接続されているかに関係なく同様に動作します。CDBについて特別な考慮が必要なOCIコールおよび機能を次の各項で説明します。

関連項目:

PDBおよび様々なPDBに接続するサービスの構成の詳細は、Oracle Database管理者ガイドを参照してください。

17.1 マルチテナント・コンテナ・データベース(CDB)が含まれるOCI APIコールの一般的な拡張機能

これらの拡張機能は、Oracle Database 12cリリース2 (12.2)以上で削除された制限の結果です。

次の拡張機能は、Oracle Database 12cリリース2 (12.2)以上で削除された制限の結果です。

  • クライアント結果キャッシュは、プラガブル・データベースへの接続とともに動作します。

17.2 ALTER SESSION SET CONTAINERのOCI拡張機能

ALTER SESSION SET CONTAINER文の使用に関する一部のOCI制限は削除されました。

これらの操作を実行するには、クライアントがOracle Databaseリリース12cリリース2 (12.2)である必要があります。次の操作のいずれかが試行されると、古いバージョンのクライアントではエラーが戻されます。

  • ALTER SESSION SET CONTAINER文では、OCIのTIMESTAMP WITH TIMEZONEまたはTIMESTAMP WITH LOCAL TIMEZONEデータ型を使用するアプリケーションがサポートされます。異なるデータベース・タイムゾーン設定または異なるデータベース・タイムゾーン・ファイル・バージョン設定を持つプラガブル・データベース間でアプリケーションの切替えが発生しても、これらの型のセマンティクスは維持されます。

  • ALTER SESSION SET CONTAINER文では、文字セットが異なる2つのプラガブル・データベース間でOCI接続を切り替えるこのコマンドの使用がサポートされます。

17.3 マルチテナント・コンテナ・データベース(CDB)が含まれるOCI APIコールの一般的な制限

一般的な制限について説明します。

  • CDB$ROOT以外のコンテナに接続されている場合、OCI_PRELIM_AUTHモードでログインしようとすると、ORA-24542エラーが発生します。

  • CDB$ROOT以外のコンテナに接続されている場合、OCIDBStartup()を発行しようとすると、ORA-24543エラーが発生します。

  • CDB$ROOT以外のコンテナに接続されている場合、OCIDBShutdown() を発行しようとすると、ORA-24543エラーが発生します。CDB$ROOTに接続されている場合にOCIDBShutdown()を発行すると、インスタンス全体が停止します。

  • OCI連続問合せ通知(CQN)は、CDBではサポートされていません。

  • リリース12.1 (またはそれ以上)より古いクライアント・ライブラリにリンクされている、およびプラガブル・データベースに接続されているOCIアプリケーションでは、通常(共通以外)のユーザーとして接続した場合、高速アプリケーション通知(FAN)高可用性(HA)機能は利用できません。回避策として、そのようなアプリケーションは共通ユーザーとして接続します。この制限は、リリース12.1以上のOCIクライアントには存在しません。

17.4 ALTER SESSION SET CONTAINERが含まれるOCIコールの制限

特定の制限について説明します。

ALTER SESSION SET CONTAINER文を使用して、1つのプラガブル・データベースから別のプラガブル・データベースへのOCI接続を切り替えることができます。ただし、ALTER SESSION SET CONTAINER文を使用してプラガブル・データベース間の切替えを行うアプリケーションでは、次に示すように使用方法がOCI制限と一貫していることを確認する必要があります。

  • ALTER SESSION SET CONTAINER文は、OCI移行可能セッション(ログイン中にOCI_MIGRATEモードで作成されたセッションなど)には使用できず、この組合せではORA-65135エラーが発生します。

  • ALTER SESSION SET CONTAINER文はOCI接続プール(古いOCI接続プールAPI)にはサポートされておらず、この組合せではORA-65135エラーが発生します。

  • ALTER SESSION SET CONTAINER文は、OCIセッションの切替え(複数のOCIユーザー・ハンドルで同じOCIサーバー・ハンドルを共有)ではサポートされていません。

  • クライアントが最初にEXTENDED MAX_STRING_SIZE設定でコンテナに接続された後、同じセッション内で、STANDARD MAX_STRING_SIZE設定で別のコンテナに切り替えられた(ALTER SESSION SET CONTAINER文を使用して)場合、4000バイトを超えるバインド変数を使用しようとすると後続のOCIStmtExecute()コールでORA-14697エラーが発生します。

  • 実行されたものとは異なるコンテナのコンテキスト内で、OCIStmtFetch()またはOCIStmtFetch2()を使用して、OCI文ハンドルからのフェッチを試行すると、ORA-65108エラーが発生します。

  • ALTER SESSION SET CONTAINER文をOCIで実行する場合、OCIクライアント結果キャッシュは無効になります。

  • 高速アプリケーション通知(FAN)および実行時接続ロード・バランシング通知は、ALTER SESSION SET CONTAINER文を使用してプラガブル・データベース間の接続の切替えが行われるアプリケーションにはサポートされていません。

  • ALTER SESSION SET CONTAINER文は、現在のトランザクションが存在する場合は読取り専用に設定するため、OCIトランザクション・コール(OCITransStart()OCITransDetach()OCITransCommit()OCITransRollback()OCITransPrepare()OCITransMultiPrepare()およびOCITransForget())を実行しようとするといずれも新しいコンテナでエラーが発生します。これらのコールを発行するには、元のコンテナに切り替える必要があります。

  • OCISubscriptionUnRegister()コールが、誤ったコンテナ(対応するOCISubscriptionRegister()コールが実行されたものとは異なるコンテナ)のコンテキスト内で試行される場合、ORA-24950が戻されます。

  • OCI_PTYPE_DATABASEを含んだOCIDescribeAny()コールでは、接続先のデータベースが記述されます。ALTER SESSION SET CONTAINER文の実行後、アプリケーションで現在のデータベースの記述の確認が求められる場合は、OCIDescribeAny()コールを再発行する必要があります。

  • 異なるコンテナからのオブジェクトを操作するのに使用されるOCI任意データ、コレクションまたはオブジェクト関数へのコールはサポートされていません。

  • OCIObjectFlush()コールは、OCIObjectNew()コールを使用してオブジェクト・インスタンスが作成されたコンテナでのみサポートされます。

  • OCIObjectFlush()は、ALTER SESSION SET CONTAINER文を使用してコンテナを切り替える前に呼び出すことをお薦めします。OCIObjectFlush()コールは、いずれのトランザクションも開始されていない場合、トランザクションを開始することに注意してください。

  • コンテナの切替え後に実行されたOCIObjectFlush()は、トランザクションが同じセッションによって別のコンテナですでに開始されている場合(暗黙的なDMLの結果として、またはOCIObjectFlush()コールの結果として)、エラーを戻すことがあります。

  • OCIObjectFlush()コールは、OCIObjectFlush()コールが発行されたコンテナのコンテキスト内で使用済となったオブジェクトのみをフラッシュします。

  • バージョンのセッション属性は、ALTER SESSION SET CONTAINER文で変更することがあります。アプリケーションでこれらの属性がキャッシュされる場合、これらの設定はALTER SESSION SET CONTAINER文の後、同じでなくなる可能性があります。OCIAttrGet()コールで取得可能な属性、およびALTER SESSION SET CONTAINER文で変更する可能性がある属性の例を次に示します。

17.5 ALTER SESSION SWITCH CONTAINER SWITCH SERVICEが含まれるOCIコールの制限

ALTER SESSION SWITCH CONTAINER SWITCH SERVICE文によるOCIコールの制限について説明します。

Oracle Database 12cリリース2 (12.2)以上では、ALTER SESSION SWITCH CONTAINER SWITCH SERVICE文が追加されたため、元のサービスに接続する場合とは異なる方法で新しいサービスを構成すると、サービス属性が変更される可能性があります。ただし、OCIは、この文による新しい設定に基づいてその処理を変更することはなく、かわりに、元のサービスに接続する場合と同じように元の設定を使用し続けます。たとえば、FANのオン/オフ設定やTAFのオン/オフ設定などは、元のサービスに最初に接続した場合と同じままです。ALTER SESSION SWITCH CONTAINER SWITCH SERVICE文の通常の使用例は、切替え後に同じアプリケーションが使用されるマルチテナント環境内に存在するため、これは切替え後に適切な動作であると考えられます。