20.7.3 DBMS_CLOUDを使用するためのユーザーおよびロールの設定の確認

ユーザーおよびロールが正しく設定されている場合は、資格証明を作成しオブジェクト・ストア内のデータにアクセスできます。

パブリックでないオブジェクト・ストア内のデータにアクセスするには、該当するリージョン内のオブジェクト・ストレージ・バケットに対する適切な権限がある、テナンシ内のOCIユーザーで認証する必要があります。テナンシ内のユーザー用にOCI API署名キーまたは認証トークンのどちらかを作成する必要があります。Oracle Cloud Infrastructure (OCI)オブジェクト・ストアへのアクセスの詳細は、次を参照してください:

https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/managingcredentials.htm

例20-6 資格証明オブジェクトの作成とオブジェクト・ストアへのアクセス

認可トークン(auth)を作成してあると仮定すると、認可のためにデータベース・スキーマ内に資格証明オブジェクトを作成する必要があります。次に例を示します:

BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'your credential name',
        username => 'OCI within your tenancy',
        password => 'auth token generated for OCI user');
END;
/

資格証明オブジェクトを作成した後は、テナンシ内のそのOCIユーザーに権限がある、テナンシ内のオブジェクト・ストア・バケットにアクセスできるようになります。これらの資格証明名、リージョン、オブジェクト・ストレージのネームスペース、およびバケット名を、ご自分のテナンシ用の正しい値に置き換えます:

select * from dbms_cloud.list_objects('CredentialName','https://objectstorage.region.oraclecloud.com/n/ObjectStorageNameSpace/b/BucketName/o/');

例20-7 ユーザーの構成と権限の確認(ウォレットのアクセス可能性、ウォレットを使用する権限、データベース全体のウォレット設定)

構成したユーザーまたはロールでDBMS_CLOUDに関する問題が発生した場合は、その構成したユーザーまたはロールに関するDBMS_CLOUD設定に使用したのと同一のこのサンプル・コードを使用することで、DBMS_CLOUDなしで、ご使用の環境の構成が正しいことをテストできます。

SCOTTというユーザーを設定したと仮定して、次のコマンドをSQLスクリプトにラップし、それを、構成したプラガブル・データベースでSYSとして実行します。このスクリプト例を使用するための次の要件に注意してください:

  • ご使用の環境用の変数を適切に設定してください。それらを正しく設定していないと、ユーザーまたはロールを正しく設定したかどうかに関係なく、このサンプル・プロシージャは機能しません。
  • このサンプル・コードを使用するには、ユーザーまたはロールにさらに権限が必要になります。具体的には、UTL_HTTPに対する名前EXECUTEが必要です。ユーザーまたはロールにこの権限がない場合は、このコードを正常に実行するためにそれを一時的に付与する必要があります。ロールを介してACLを付与してある場合は、この例が機能するように、それらの権限をユーザーSCOTTに明示的に付与する必要があります
-- user to troubleshoot
define clouduser=SCOTT
 
-- CUSTOMER SPECIFIC SETUP, NEEDS TO BE PROVIDED BY THE CUSTOMER
-- - SSL Wallet directory and password
define sslwalletdir=<Set SSL Wallet Directory>
define sslwalletpwd=<Set SSL Wallet password>
 
-- In environments w/ a proxy, you need to set the proxy in the verification code
-- define proxy_uri=<your proxy URI address>
 
-- create and run this procedure as owner of the ACLs, which is the future owner
-- of DBMS_CLOUD
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2)
AS
    request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
    req UTL_HTTP.REQ;
    resp UTL_HTTP.RESP;
    data VARCHAR2(32767) default null;
    err_num NUMBER default 0;
    err_msg VARCHAR2(4000) default null;
 
BEGIN
 
-- Create a request context with its wallet and cookie table
request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(wallet_path => 'file:&sslwalletdir',wallet_password => '&sslwalletpwd');
 
-- Make a HTTP request using the private wallet and cookie
-- table in the request context
 
-- uncomment if proxy is required
--    UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
  
req := UTL_HTTP.BEGIN_REQUEST(url => url,request_context => request_context);
resp := UTL_HTTP.GET_RESPONSE(req);
 
DBMS_OUTPUT.PUT_LINE('valid response');
 
EXCEPTION
WHEN OTHERS THEN
    err_num := SQLCODE;
    err_msg := SUBSTR(SQLERRM, 1, 3800);
    DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' ||err_num||' - '||err_msg);
 
    UTL_HTTP.END_RESPONSE(resp);
    data := UTL_HTTP.GET_DETAILED_SQLERRM ;
    IF data IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' ||data);
    END IF;
END;
/
 
set serveroutput on
BEGIN
    &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
END;
/
 
set serveroutput off
drop procedure &clouduser..GET_PAGE;

構成にエラーがあればそれを修正します。ユーザーまたはロールを正しく構成してある場合、このプロシージャは正常に実行されます。