2021年2月6日土曜日

データベースに証明書の登録と削除を行うアプリを作る

 ブロックチェーン表を扱うアプリを作る際に、証明書の登録と削除が手間だったので、簡単に行うアプリを作ってみました。レポートとフォームを使っています。Oracle APEXのフォーム・リージョンで可能なことは、表の操作だけではない、という例にもなっています。

既存のアプリケーションにページを追加します。

アプリケーション・ビルダーよりページの作成を実行します。

コンポーネントフォームを選択します。


フォーム付きレポートを選択します。


レポート・タイプ対話モード・レポートフォーム・ページ・モードモーダル・ダイアログを選びます。その他の入力項目は任意です。以下ではレポート・ページ名証明書一覧フォーム・ページ名証明書と指定しています。また、ブレッドクラムBreadcrumbを選択することで、追加しています。ページ番号はレポートが4、フォームが5になっています。すでに4、5のページが存在する場合は異なるページ番号になります。その場合は、特にフォームについて、以降の作業のページ・アイテム名のP5_で始まる部分を置き換えるようにしてください。設定を行った後、に進みます。


ナビゲーションのプリファレンス新規ナビゲーション・メニュー・エントリの作成を選択します。に進みます。


データ・ソースローカル・データベースとし、ソース・タイプSQL問合せを選択します。SQL SELECT文を入力には、以下のSQLを設定します。に進みます。
select
    certificate_guid,
    user_name,
    distinguished_name,
    certificate
from user_certificates

主キー列としてCERTIFICATE_GUID (Varchar2)を選択します。作成をクリックします。


レポートとフォームのページが作成されます。作成された証明書一覧のレポート・ページを実行します。


USER_CERTIFICATESビューの内容が一覧されていることが確認できます。


作成をクリックし、フォームを開きます。USER_CERTIFICATESビューに対しては、どのような操作もできません。そのため、PL/SQLコードで作成や削除の処理を行うようにします。開発者ツール・バーより、ページの編集5をクリックし、ページ・デザイナを呼び出します。


ローカルにある証明書のファイルを指定するページ・アイテムP5_CERTIFICATEです。このページ・アイテムを選択し、タイプファイル参照...に設定します。また、ビューのBLOB列にファイルをアップロードすることはできません。記憶域タイプTable APEX_APPLIATION_TEMP_FILESに設定し、一時的なファイル・アップロードのためにOracle APEXが用意している表を利用します。

ページ・アイテムP5_USER_NAMEP5_DISTINGUISED_NAMEは画面入力の対象ではないので、両方を選択してタイプ表示のみに変更します。

続いてプロセス・ビューを開き、フォームに対応するプロセス(ここではプロセス・フォーム証明書)を選択します。設定ターゲット・タイプPL/SQL Codeに変更し、挿入/更新/削除するPL/SQLコードに以下を設定します。フォームのページ番号が5でない場合は、P5の部分を変更してください。

declare
    l_cert blob;
    l_cert_guid raw(16);
begin
    case :APEX$ROW_STATUS
    when 'C' then
        select blob_content into l_cert
        from apex_application_temp_files
        where name = :P5_CERTIFICATE;
        dbms_user_certs.add_certificate(l_cert, l_cert_guid);
        :P5_CERTIFICATE_GUID := l_cert_guid;
    when 'D' then
        dbms_user_certs.drop_certificate(:P5_CERTIFICATE_GUID);
    end case;
end;

APEX_APPLICATION_TEMP_FILESにアップロードされた証明書のデータ(列BLOB_CONTENT)を取り出し、DBMS_USER_CERTS.ADD_CERTIFICATEプロシージャに渡すことで、証明書をデータベースに登録しています。返却されるCERTIFICATE_GUIDの値は対応するページ・アイテムP5_CERTIFICATE_GUIDに設定します。削除要求はP5_CERTIFICATE_GUIDをDBMS_USER_CERTS.DROP_CERTIFICATEプロシージャに渡して実行しています。

トランザクションに関係なく行われる処理であるため、失われた更新の防止OFF行のロックNoに設定します。

以上で、基本的な動作については実装が完了しました。先頭のGIF動画のような操作ができるようになっています。

以上で証明書の登録と削除を行うアプリケーションの作り方の紹介は完了です。ブラウザにて署名を作る部分も含んだアプリケーションのエクスポートを以下に置きました。ブロックチェーン表を作成するDDLは含んでいません。

https://github.com/ujnak/apexapps/blob/master/exports/blockchainapp.sql

Oracle APEXのアプリケーション作成の一助になれば幸いです。