機械翻訳について

クラウド・オブジェクト・ストアに格納されたメッセージで永続メッセージを使用

DBMS_PIPEパッケージには、メッセージがクラウド・オブジェクト・ストアに格納される永続メッセージをサポートするために、Autonomous Databaseに拡張機能が用意されています。

DBMS_PIPEを使用した永続メッセージングについて

DBMS_PIPEを使用した永続メッセージにより、1つ以上のデータベース・セッションが同じリージョンまたはリージョン間で、クラウド・オブジェクト・ストアに格納されているメッセージと通信できます。

DBMS_PIPEの永続メッセージ:

  • 非常に大きなメッセージを送信および取得できます。

  • 多数のパイプ・メッセージの送信をサポートします。

  • 単一データベース内、複数のデータベース間、および異なるリージョン内のデータベース間でのメッセージの送受信をサポートします。

  • 同じクラウド・オブジェクト・ストアのロケーションURIを使用して、複数のパイプをサポートします。

永続メッセージ・パイプは、サポートされている任意のDBMS_PIPEタイプで作成できます:

  • 暗黙的なパイプ: DBMS_PIPE.SEND_MESSAGE関数を使用して不明なパイプ名でメッセージを送信すると、自動的に作成されます。
  • 明示的なパイプ: ユーザーが指定したパイプ名でDBMS_PIPE.CREATE_PIPE関数を使用して作成されます。
  • パブリック・パイプ: DBMS_PIPEパッケージに対するEXECUTE権限を持つすべてのユーザーがアクセスできます。
  • プライベート・パイプ: パイプ作成者と同じユーザーを持つセッションからアクセスできます。

ノート:

Oracleでは、永続メッセージングでメッセージを送信または受信する前に、明示的なパイプを作成することをお薦めします。 DBMS_PIPE.CREATE_PIPEを使用して明示的なパイプを作成すると、(privateパラメータを設定して)パブリックまたはプライベートのいずれかのアクセス権限でパイプが作成されるようになります。

次に、永続メッセージングを使用したDBMS_PIPEの一般的なワークフローを示します:

database-pipe-persistent-messaging.epsの説明は以下のとおりです
図database-pipe-persistent-messaging.epsの説明

DBMS_PIPEを使用する既存のアプリケーションは、最小限の変更で引き続き動作できます。 ログオン・トリガーを使用するか、他の初期化ルーチンを使用して、資格証明オブジェクトおよびロケーションURIでDBMS_PIPEを使用する既存のアプリケーションを構成できます。 DBMS_PIPE資格証明およびロケーションURIを設定した後、永続メッセージを使用するために他の変更は必要ありません。 その後のパイプの使用はすべて、データベース・メモリーではなくクラウド・オブジェクト・ストアにメッセージを格納します。 これにより、最小限の変更で、インメモリーから永続的なクラウド・オブジェクト・ストレージにメッセージのストレージ・メソッドを変更できます。

永続メッセージングの概要および機能

永続メッセージを使用するDBMS_PIPEの機能:

  • メッセージは、同じリージョン内の複数のAutonomous Databaseインスタンス、またはリージョン間で送信および取得できます。

  • 永続メッセージは、1つのプロセスによる書込みまたは読取りが保証されます。 これにより、同時書込みおよび同時読取りによるメッセージ・コンテンツの矛盾が回避されます。 永続メッセージ・パイプを使用すると、DBMS_PIPEは1つの操作のみを許可し、メッセージまたは受信メッセージを一度にアクティブにすることができます。 ただし、進行中の操作のために操作が不可能な場合、プロセスはtimeout値に達するまで定期的に再試行します。

  • DBMS_PIPEは、DBMS_CLOUDを使用してクラウド・オブジェクト・ストアにアクセスします。 メッセージは、サポートされている任意のクラウド・オブジェクト・ストアに格納できます。 詳細については、「DBMS_CLOUD URIの書式」を参照してください。

  • DBMS_PIPEDBMS_CLOUDを使用してクラウド・オブジェクト・ストアにアクセスし、サポートされているすべての資格証明タイプを使用できます:

DBMS_PIPE権限の認可およびセキュリティ

DBMS_PIPEプロシージャは、実行者権限で実行されます。 プライベート・パイプは現在のユーザーが所有し、ユーザーが作成したプライベート・パイプは同じユーザーのみが使用できます。 これは、メッセージがクラウド・オブジェクト・ストアに格納されるインメモリー・パイプと永続メッセージ・パイプの両方に適用されます。 メッセージの送信および受信は、実行者のスキーマで実行されます。

メッセージがクラウド・オブジェクト・ストアに格納されるプライベート・パイプを使用して、location_uriパラメータで識別されるクラウド・オブジェクト・ストアでの認証に資格証明オブジェクトが必要です。 起動するユーザーには、オブジェクト・ストアへのアクセスに使用されるcredential_nameパラメータで指定された資格証明オブジェクトに対するEXECUTE権限が必要です。

パブリック・パイプを使用するには、ユーザー、データベース・セッションにDBMS_PIPEに対する実行権限が必要です。 永続メッセージを使用してメッセージをクラウド・オブジェクト・ストアに格納するパブリック・パイプの場合、ユーザー、データベース・セッションは、DBMS_CLOUDに対する実行権限と、資格証明オブジェクトに対する実行権限を持っている必要があります(または、メッセージを含むロケーションURIへのアクセスを許可されている資格証明オブジェクトを作成できます)。

DBMS_PIPEの制限

DBMS_PIPEパッケージは、異なる文字セットを使用するデータベース間でのメッセージの送信をサポートしていません。 たとえば、AL32UTF8を使用する1つのAutonomous Databaseインスタンスと、WE8MSWIN1252を使用する別のインスタンスがある場合、これら2つのデータベース間でDBMS_PIPEを含むメッセージを送信することはできません。 この場合、これらの2つのデータベース間でDBMS_PIPEのメッセージを送信しようとすると、エラーORA-12704が発生します。

詳細については、「Autonomous Databaseの文字セットの選択」を参照してください。

明示的な永続パイプの作成およびメッセージの送信

指定されたパイプ名(明示的パイプ)で永続的パイプを作成するステップについて説明します。

  1. プロシージャDBMS_CLOUD.CREATE_CREDENTIALを使用してオブジェクト・ストアの資格証明を保存します。 たとえば:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    この操作では、資格証明がデータベースに暗号化された形式で保存されます。 資格証明名には任意の名前を使用できます。 このステップは、オブジェクト・ストア資格証明が変更されないかぎり、1回のみ実行すれば済みます。 資格証明を格納した後、同じ資格証明名を使用してクラウド・オブジェクト・ストアにアクセスし、DBMS_PIPEでメッセージを送信および受信できます。

    パラメータの詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。 Oracle Cloud Infrastructure Object Storageの場合、資格証明でネイティブのOracle Cloud Infrastructure認証を使用する必要があります。

    リソース・プリンシパル資格証明を有効にした場合、Oracle Cloud Infrastructureオブジェクト・ストアにアクセスするための資格証明の作成は必要ありません。 詳細については、「リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセス」を参照してください。

    ノート:

    SQL*PlusやSQL Developerなどのツールの中には、アンパサンド文字(&)を特殊文字として使用するものがあります。 パスワードにアンパサンド文字がある場合は、例に示すように、これらのツールでSET DEFINE OFFコマンドを使用して特殊文字を無効にし、資格証明を正しく作成します。
  2. メッセージを送信および取得するための明示的なパイプを作成します。 たとえば、ORDER_PIPEという名前のパイプを作成します。
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /

    詳細については、「CREATE_PIPEファンクション」を参照してください。

  3. パイプが作成されたことを確認します。
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. DBMS_PIPEプロシージャを使用して、クラウド・オブジェクト・ストアに永続メッセージを格納するデフォルトのアクセス資格証明およびロケーションURIを設定します。
    BEGIN
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
    END;
    /

    これらのプロシージャは、DBMS_PIPEプロシージャで使用するデフォルトの資格証明名およびデフォルトのロケーションURIを設定します。

    Oracle Cloud Infrastructure Object Storageを使用してメッセージを格納する場合は、Oracle Cloud InfrastructureネイティブURIまたはSwift URIを使用できます。 ただし、ロケーションURIと資格証明は、次のように型で一致する必要があります:

    • ネイティブURI形式を使用してOracle Cloud Infrastructure Object Storageにアクセスする場合は、資格証明オブジェクトでネイティブOracle Cloud Infrastructure署名キー認証を使用する必要があります。

    • Swift URI形式を使用してOracle Cloud Infrastructure Object Storageにアクセスする場合は、資格証明オブジェクトで認証トークン認証を使用する必要があります。

    詳細については、「SET_CREDENTIAL_NAMEプロシージャ」「SET_LOCATION_URIプロシージャ」を参照してください。

  5. パイプにメッセージをパックして送信します。
    DECLARE
      l_result INTEGER;
      l_date   DATE;
    BEGIN
        l_date := sysdate;
        DBMS_PIPE.PACK_MESSAGE(l_date);         -- date of order
        DBMS_PIPE.PACK_MESSAGE('C123');         -- order number
        DBMS_PIPE.PACK_MESSAGE(5);              -- number of items in order
        DBMS_PIPE.PACK_MESSAGE('Printers');     -- type of item in order
    
     
        l_result := DBMS_PIPE.SEND_MESSAGE(
                        pipename => 'ORDER_PIPE',
                        credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                        location_uri => DBMS_PIPE.GET_LOCATION_URI);
         
        IF l_result = 0 THEN
            DBMS_OUTPUT.put_line('DBMS_PIPE sent order successfully');
        END IF;
     
    END;
    /

    詳細については、「PACK_MESSAGEプロシージャ」「SEND_MESSAGEファンクション」を参照してください。

同じデータベースでの永続メッセージの取得

同じAutonomous Databaseインスタンス(メッセージが送信されたインスタンス)の明示的なパイプから永続メッセージを取得するステップについて説明します。

Autonomous Databaseインスタンスでは、別のセッションからパイプに送信されたメッセージを受信できます。 DBMS_PIPEプロシージャは、実行者権限プロシージャであり、現在の起動ユーザーとして実行されます。

プライベート・パイプは、パイプを作成する現在のユーザーが所有します。 プライベート・パイプには、パイプを作成したユーザーと同じユーザーのみがアクセスできます。 これは、インメモリー・メッセージを使用するパイプと、クラウド・オブジェクト・ストアに格納されているメッセージがある永続メッセージを使用するパイプに適用されます。

パブリック・パイプには、DBMS_PIPEに対する実行権限を持つ任意のデータベース・セッションからアクセスできます。 これは、インメモリー・メッセージを使用するパイプと、クラウド・オブジェクト・ストアに格納されているメッセージがある永続メッセージを使用するパイプに適用されます。

  1. パイプが作成されたことを確認します。
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 

    同じAutonomous Databaseインスタンスで、パイプが存在する場合、メッセージを受信する前にDBMS_PIPE.CREATE_PIPEを実行する必要はありません。 これは、「明示的な永続パイプの作成およびメッセージの送信」に示すように、同じインスタンスにパイプが作成された場合に適用されます。

  2. パイプからメッセージを受信します。
    DECLARE
        message1  DATE;
        message2  VARCHAR2(100);
        message3  INTEGER;
        message4  VARCHAR2(100);
        l_result  INTEGER;
    
    BEGIN
    
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
        l_result := DBMS_PIPE.RECEIVE_MESSAGE (
                      pipename => 'ORDER_PIPE',
                      timeout  => DBMS_PIPE.MAXWAIT,
                      credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                      location_uri => DBMS_PIPE.GET_LOCATION_URI);
     
        IF l_result = 0 THEN
            DBMS_PIPE.unpack_message(message1);
            DBMS_PIPE.unpack_message(message2);
            DBMS_PIPE.unpack_message(message3);
            DBMS_PIPE.unpack_message(message4);
     
            DBMS_OUTPUT.put_line('Order Received Successfully On: ' || TO_CHAR(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
            DBMS_OUTPUT.put_line('Date of Order: ' || message1);
            DBMS_OUTPUT.put_line('Order Number: ' || message2);
            DBMS_OUTPUT.put_line('Number of Items In Order: ' || message3);
            DBMS_OUTPUT.put_line('Item Type in Order: ' || message4);
        END IF;
     
    END;
    /

    同じAutonomous Databaseインスタンス上にいる場合、資格証明がすでに存在するため、メッセージを受信するためにDBMS_CLOUD.CREATE_CREDENTIALを実行する必要はありません。 これは、「明示的な永続パイプの作成およびメッセージの送信」に示すように、同じインスタンスにパイプが作成された場合に適用されます。

詳細については、「SET_CREDENTIAL_NAMEプロシージャ」「SET_LOCATION_URIプロシージャ」を参照してください。

詳細については、「RECEIVE_MESSAGEファンクション」を参照してください。

別のデータベースでのパイプの作成による永続メッセージの取得

メッセージを送信したインスタンスとは異なるAutonomous Databaseインスタンス上の明示的なパイプを使用して、クラウド・オブジェクト・ストアに格納されている永続メッセージを取得するステップについて説明します。

  1. プロシージャDBMS_CLOUD.CREATE_CREDENTIALを使用してオブジェクト・ストアの資格証明を保存します。 たとえば:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    この操作では、資格証明がデータベースに暗号化された形式で保存されます。 資格証明名には任意の名前を使用できます。 このステップは、オブジェクト・ストア資格証明が変更されないかぎり、1回のみ実行すれば済みます。 資格証明を格納すると、同じ資格証明名を使用してクラウド・オブジェクト・ストアにアクセスし、DBMS_PIPEでメッセージを送信および受信できます。

    パラメータの詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。

    リソース・プリンシパル資格証明を有効にした場合、Oracle Cloud Infrastructureオブジェクト・ストアにアクセスするための資格証明の作成は必要ありません。 詳細については、「リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセス」を参照してください。

    ノート:

    SQL*PlusやSQL Developerなどのツールの中には、アンパサンド文字(&)を特殊文字として使用するものがあります。 パスワードにアンパサンド文字がある場合は、例に示すように、これらのツールでSET DEFINE OFFコマンドを使用して特殊文字を無効にし、資格証明を正しく作成します。
  2. メッセージを送信したパイプと同じ名前の明示的なパイプを作成します。 たとえば、ORDER_PIPEという名前のパイプを作成します。
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /

    「CREATE_PIPEファンクション」を参照してください。

  3. パイプが作成されたことを確認します。
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. DBMS_PIPEプロシージャを使用して、DBMS_PIPEが永続メッセージにアクセスできるように、オブジェクト・ストアのデフォルトのアクセス資格証明およびロケーションURIを設定します。
    BEGIN
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
    END;
    /

    これらのプロシージャは、DBMS_PIPEプロシージャで使用するデフォルトの資格証明名およびデフォルトのロケーションURIを設定します。

    Oracle Cloud Infrastructure Object Storageを使用してメッセージを格納する場合は、Oracle Cloud InfrastructureネイティブURIまたはSwift URIを使用できます。 ただし、ロケーションURIと資格証明は、次のように型で一致する必要があります:

    • ネイティブURI形式を使用してOracle Cloud Infrastructure Object Storageにアクセスする場合は、資格証明オブジェクトでネイティブOracle Cloud Infrastructure署名キー認証を使用する必要があります。

    • Swift URI形式を使用してOracle Cloud Infrastructure Object Storageにアクセスする場合は、資格証明オブジェクトで認証トークン認証を使用する必要があります。

    詳細については、「SET_CREDENTIAL_NAMEプロシージャ」「SET_LOCATION_URIプロシージャ」を参照してください。

  5. 永続的なパイプからメッセージを受信します。
    DECLARE
        message1  DATE;
        message2  VARCHAR2(100);
        message3  INTEGER;
        message4  VARCHAR2(100);
        l_result  INTEGER;
    
    BEGIN
    
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
        l_result := DBMS_PIPE.RECEIVE_MESSAGE (
                      pipename => 'ORDER_PIPE',
                      timeout  => DBMS_PIPE.MAXWAIT,
                      credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                      location_uri => DBMS_PIPE.GET_LOCATION_URI);
     
        IF l_result = 0 THEN
            DBMS_PIPE.unpack_message(message1);
            DBMS_PIPE.unpack_message(message2);
            DBMS_PIPE.unpack_message(message3);
            DBMS_PIPE.unpack_message(message4);
     
            DBMS_OUTPUT.put_line('Order Received Successfully On: ' || TO_CHAR(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
            DBMS_OUTPUT.put_line('Date of Order: ' || message1);
            DBMS_OUTPUT.put_line('Order Number: ' || message2);
            DBMS_OUTPUT.put_line('Number of Items In Order: ' || message3);
            DBMS_OUTPUT.put_line('Item Type in Order: ' || message4);
        END IF;
     
    END;
    /

    詳細については、「RECEIVE_MESSAGEファンクション」を参照してください。

永続パイプの削除

永続パイプを削除するステップについて説明します。

永続パイプは、メッセージをCloud Object Storeに格納してメッセージの送受信を行います。 DBMS_PIPE.REMOVE_PIPEを使用して、Autonomous Databaseインスタンス上の永続パイプを削除します。

  1. DBMS_PIPE.REMOVE_PIPE関数をコールして、パイプを削除します。
    DECLARE
       l_result  INTEGER;
    BEGIN
         l_result := DBMS_PIPE.REMOVE_PIPE('ORDER_PIPE');
    END;
    /

    REMOVE_PIPE関数は、実行されているAutonomous Databaseインスタンスからパイプを削除しますが、REMOVE_PIPEは、同じロケーションURIを使用する同じ名前のパイプを持つ他のAutonomous Databaseインスタンスには影響しません。

  2. Autonomous DatabaseインスタンスでDBMS_PIPE.REMOVE_PIPEを実行し、パイプが削除されていることを確認します。
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    No rows selected