クラウド・オブジェクト・ストアに格納されたメッセージでの永続メッセージングの使用
このコンテンツを正しく表示するには、JavaScriptを有効にする必要があります
クラウド・オブジェクト・ストアに格納されたメッセージでの永続メッセージングの使用
DBMS_PIPEパッケージには、メッセージがクラウド・オブジェクト・ストアに格納される永続メッセージをサポートするために、Autonomous AI Database の拡張機能があります。
DBMS_PIPEを使用した永続メッセージングについて
DBMS_PIPEを使用した永続メッセージングでは、1つ以上のデータベース・セッションが同じリージョン内またはリージョン間で、クラウド・オブジェクト・ストアに格納されているメッセージと通信できます。
DBMS_PIPEの永続メッセージ:
永続メッセージング・パイプは、サポートされている任意の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.svgの説明 DBMS_PIPEを使用する既存のアプリケーションは、最小限の変更で操作を続行できます。DBMS_PIPEを使用する既存のアプリケーションは、ログオン・トリガーを使用するか、他の初期化ルーチンを使用して、資格証明オブジェクトおよび場所URIで構成できます。DBMS_PIPE資格証明および場所URIを設定した後、永続メッセージングを使用するために他の変更は必要ありません。パイプの後続のすべての使用は、データベース・メモリーではなくクラウド・オブジェクト・ストアにメッセージを格納します。これにより、最小限の変更で、インメモリーから永続クラウド・オブジェクト・ストレージにメッセージのストレージ方法を変更できます。
永続メッセージの概要と機能
永続メッセージングを使用するDBMS_PIPEの機能:
メッセージは、同じリージョンまたはリージョンの複数のAutonomous AI Database インスタンス間で送受信できます。
永続メッセージは、1つのプロセスによる書込みまたは読取りが保証されます。これにより、同時読取りおよび同時書込みによるメッセージ・コンテンツの不整合が回避されます。DBMS_PIPEは、1つの操作のみを許可し、メッセージまたは受信メッセージを一度にアクティブにし、これらの操作はロック・メカニズムによって保護されます。ただし、進行中の操作のために操作が不可能な場合、timeout値に達するまで、プロセスは定期的に再試行します。
DBMS_PIPEは、DBMS_CLOUDを使用してクラウド・オブジェクト・ストアにアクセスします。メッセージは、サポートされている任意のクラウド・オブジェクト・ストアに格納できます。詳細は、クラウド・オブジェクト・ストレージのURIフォーマット を参照してください。
DBMS_PIPEは、DBMS_CLOUDを使用してクラウド・オブジェクト・ストアにアクセスし、サポートされているすべての資格証明タイプを使用できます:
DBMS_PIPE権限の認可とセキュリティ
DBMS_PIPEプロシージャは、実行者権限で実行されます。プライベートパイプは現在のユーザーが所有し、ユーザーが作成したプライベートパイプは、同じユーザーのみが使用できます。これは、クラウド・オブジェクト・ストアにメッセージが格納されるインメモリー・パイプと永続メッセージング・パイプの両方に適用されます。メッセージの送信と受信は、実行者のスキーマで実行されます。
メッセージがクラウド・オブジェクト・ストアに格納されるプライベート・パイプを使用すると、location_uriパラメータで識別されるクラウド・オブジェクト・ストアでの認証に資格証明オブジェクトが必要です。起動するユーザーは、オブジェクト・ストアへのアクセスに使用されるcredential_nameパラメータで指定された資格証明オブジェクトに対するEXECUTE権限を持っている必要があります。
パブリック・パイプを使用するには、ユーザー、データベース・セッションにDBMS_PIPEに対する実行権限が必要です。永続メッセージを使用し、クラウド・オブジェクト・ストアにメッセージを格納するパブリック・パイプの場合、ユーザー、データベース・セッションには、DBMS_CLOUD に対する実行権限と資格証明オブジェクトに対する実行権限が必要です(または、メッセージを含む場所URIへのアクセスを許可される資格証明オブジェクトを作成できます)。
DBMS_PIPEの制限
DBMS_PIPEパッケージでは、異なる文字セットを使用するデータベース間でのメッセージの送信はサポートされていません。たとえば、AL32UTF8を使用する1つのAutonomous AI Database インスタンスと、WE8MSWIN1252を使用する別のインスタンスがある場合、これら2つのデータベース間でDBMS_PIPEを含むメッセージを送信することはできません。この場合、これらの2つのデータベース間でDBMS_PIPEを含むメッセージを送信しようとすると、エラーORA-12704が発生します。
詳細は、Autonomous AI Database の文字セットの選択 を参照してください。
明示的な永続パイプの作成およびメッセージの送信
指定されたパイプ名(明示パイプ)で永続的なパイプを作成する手順について説明します。
プロシージャ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 認証を使用する必要があります。
ノート:
SQL*PlusやSQL Developerなどの一部のツールは、特殊文字としてアンパサンド文字(
&)を使用します。パスワードにアンパサンド文字が含まれる場合、例に示すように、これらのツールで
SET DEFINE OFFコマンドを使用して特殊文字を無効にし、資格証明を適切に作成します。
メッセージを送受信する明示的なパイプを作成します。たとえば、ORDER_PIPEという名前のパイプを作成します。
DECLARE
r_status INTEGER;
BEGIN
r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
END;
/
パイプが作成されていることを確認します。
SELECT ownerid, name, type FROM v$db_pipes
WHERE name = 'ORDER_PIPE';
OWNERID NAME TYPE
------- ---------- -------
80 ORDER_PIPE PRIVATE
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プロシージャ およびGET_LOCATION_URIファンクション を参照してください。
パイプにメッセージを送ります。
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;
/
同じデータベースでの永続メッセージの取得
同じAutonomous AI Database インスタンス(メッセージが送信されたインスタンス)上の明示的なパイプから永続メッセージを取得するステップについて説明します。
Autonomous AI Database インスタンスでは、別のセッションからパイプに送信されたメッセージを受信できます。DBMS_PIPEプロシージャは、実行者権限プロシージャであり、現在の起動ユーザーとして実行されます。
プライベートパイプは、パイプを作成する現在のユーザーが所有します。プライベートパイプには、パイプを作成したユーザーと同じユーザーしかアクセスできません。これは、インメモリー・メッセージを使用するパイプ、およびクラウド・オブジェクト・ストアに格納されているメッセージを含む永続メッセージを使用するパイプに適用されます。
パブリック・パイプには、DBMS_PIPEに対する実行権限を持つデータベース・セッションからアクセスできます。これは、インメモリー・メッセージを使用するパイプ、およびクラウド・オブジェクト・ストアに格納されているメッセージを含む永続メッセージを使用するパイプに適用されます。
パイプが作成されていることを確認します。
SELECT ownerid, name, type FROM v$db_pipes
WHERE name = 'ORDER_PIPE';
OWNERID NAME TYPE
------- ---------- -------
80 ORDER_PIPE PRIVATE
パイプからメッセージを受信します。
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 AI Database インスタンス上の明示的なパイプを使用して、クラウド・オブジェクト・ストアに格納されている永続メッセージを取得するステップについて説明します。
Store your object store credentials using the procedure DBMS_CLOUD.CREATE_CREDENTIAL . For example:
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL (
credential_name => 'my_persistent_pipe_cred',
username => 'adb_user @example.com',
password => 'password '
);
END;
/
この操作によって、資格証明が暗号化された形式でデータベースに格納されます。資格証明には任意の名前を使用できます。オブジェクト・ストアの資格証明を変更しないかぎり、このステップが必要なのは1回のみです。資格証明を一度格納したら、同じ資格証明名を使用してクラウド・オブジェクト・ストアにアクセスし、DBMS_PIPEでメッセージを送受信できます。
パラメータの詳細は、CREATE_CREDENTIALプロシージャ を参照してください。
ノート:
SQL*PlusやSQL Developerなどの一部のツールは、特殊文字としてアンパサンド文字(
&)を使用します。パスワードにアンパサンド文字が含まれる場合、例に示すように、これらのツールで
SET DEFINE OFFコマンドを使用して特殊文字を無効にし、資格証明を適切に作成します。
メッセージを送信したパイプと同じ名前の明示的なパイプを作成します。たとえば、ORDER_PIPEという名前のパイプを作成します。
DECLARE
r_status INTEGER;
BEGIN
r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
END;
/
パイプが作成されていることを確認します。
SELECT ownerid, name, type FROM v$db_pipes
WHERE name = 'ORDER_PIPE';
OWNERID NAME TYPE
------- ---------- -------
80 ORDER_PIPE PRIVATE
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プロシージャ およびGET_LOCATION_URIファンクション を参照してください。
永続パイプからメッセージを受信します。
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;
/
永続的なパイプを削除する
永続的なパイプを取り外す手順について説明します。
永続パイプは、クラウド・オブジェクト・ストアにメッセージを格納して、メッセージの送受信を行います。DBMS_PIPE.REMOVE_PIPEを使用して、Autonomous AI Database インスタンスの永続パイプを削除します。
DBMS_PIPE.REMOVE_PIPE関数をコールしてパイプを削除します。
DECLARE
l_result INTEGER;
BEGIN
l_result := DBMS_PIPE.REMOVE_PIPE('ORDER_PIPE');
END;
/
REMOVE_PIPE関数は、パイプが実行されているAutonomous AI Database インスタンスからパイプを削除しますが、REMOVE_PIPEは、同じ場所URIを使用する同じ名前のパイプを持つ他のAutonomous AI Database インスタンスには影響しません。
Autonomous AI Database インスタンスで、DBMS_PIPE.REMOVE_PIPEを実行して、パイプが削除されたことを確認します。
SELECT ownerid, name, type FROM v$db_pipes
WHERE name = 'ORDER_PIPE';
No rows selected