2026年7月27日月曜日

Oracle Backend for FirebaseのLiveLabsを実施する

先日の記事「Oracle APEXが構成済みのデータベースにOracle Backend for Firebaseを構成する」で作成した環境を使って、オラクル社が提供している以下のLiveLabsのコースで作成されるアプリケーションを実行してみます。
それぞれ、以下の言語別のSDKを使用してレシピの登録、編集と一覧表示ができるアプリケーションを作成します。
対応するLiveLabsのコースはありませんが、この他にFlutter SDKも提供されています。
Web、iOS、Andorodのアプリケーションを作成するLiveLabsのコースは、概ね同じ章立てになっています。Lab 3と4は順番が入れ替わっていることがありますが、セキュリティ・ルールはLab 7で設定するため、シード・データのロードと認証の設定は、どちらが先でも後でも実施できます。

Get Started - Oracle Backend for Firebaseの環境を準備します。先日の記事の作業に当たります。

Lab 1: プロジェクトを作成しセキュリティ・ルールを初期化します。先日の記事でプロジェクトの作成までは実施しています。Task 2にて、これからの作業の準備としてDatabaseとStorageに、すべての操作を許可するセキュリティ・ルールを設定します。

Lab 2: GitHubからアプリケーションを含むリポジトリをクローンします。対象のSDKのインストールとプロジェクトの構成を設定し、アプリケーションのビルドと実行ができることを確認します。

Lab 3(または4): シード・データであるレシピをコレクションにロードします。ロードしたレシピが一覧表示できることを確認します。

Lab 4(または3): アプリケーションに認証を実装します。新規ユーザーによるサインアップ(ユーザーの作成)と、そのユーザーによるサインインを確認します。

Lab 5: 新規のレシピを作成する機能を追加します。また、レシピを評価する機能も追加します。

Lab 6: レシピに画像を登録する機能を追加します。

Lab 7: DatabaseおよびStorageのセキュリティ・ルールを更新し、レシピの作成者だけがレシピを編集できるように制限します。

LiveLabsではLab 3からLab 7で、それぞれの機能を実現するコードの記述し、実装した機能のテストを行います。記述するコードについて、それぞれのLabで行ごとに説明されています。

本来は、興味のある言語のSDKのコースを選んで取り組むべきですが、XcodeやAndoroid Studioの扱いに慣れていないなど、コース通りに作業が進まないこともあり得ます。コードの記述はコピペでできますが、Typoなど、気付きにくいこともあります。

以下より、Web、iOS、Andoroidそれぞれで、まずは完成したアプリを動かす手順を紹介します。

記事「Oracle APEXが構成済みのデータベースにOracle Backend for Firebaseを構成する」の作業に続けて実施することを想定しています。


セキュリティ・ルールを設定する



Lab 1: Create Your First ProjectTask 2: Set starter security rulesにて、DatabaseおよびStorageへ制限なしでアクセスできるセキュリティ・ルールを設定しています。
match /{document=**} { allow read, write: if true;}
シード・データはこのセキュリティ・ルールでないとロードできません。そのため、Database、Storage双方とも、最初はこのセキュリティ・ルールを設定します。

Lab 7: Security Rulesで、このセキュリティ・ルールを更新します。

Task 4: Add database security rulesにて、Databaseのセキュリティ・ルールとして以下を設定します。
match /recipes/{recipeId} {
    allow read: if request.auth != null;
    allow create: if request.auth != null && request.resource.data.ownerId == request.auth.uid;
    allow update: if request.auth != null && request.auth.uid == resource.data.ownerId;
}
match /recipes/{recipeId}/ratings/{ratingId} {
    allow read: if request.auth != null;
    allow create: if request.auth != null;
}

Task 6: Add storage security rulesにて、Storageのセキュリティ・ルールとして以下を設定します。
match /recipes/{recipeId}/{fileName} {
    allow read: if true;
    allow create: if request.auth != null;
}

セキュリティ・ルールについては、LiveLabsの説明を参照してください。


Webアプリを実装する



作業ディレクトリとしてfusabase-livelabsを作成し、移動します。

mkdir fusabase-livelabs
cd fusabase-livelabs

% mkdir fusabase-livelabs

% cd fusabase-livelabs

fusabase-livelabs % 


JavaScript SDKを使用したWebアプリを含む、GitHubのリポジトリをクローンします。

git clone https://github.com/KillianLynch/fusabase-livelabs-web.git

fusabase-livelabs % git clone https://github.com/KillianLynch/fusabase-livelabs-web.git

Cloning into 'fusabase-livelabs-web'...

remote: Enumerating objects: 143, done.

remote: Counting objects: 100% (9/9), done.

remote: Compressing objects: 100% (9/9), done.

remote: Total 143 (delta 3), reused 1 (delta 0), pack-reused 134 (from 1)

Receiving objects: 100% (143/143), 377.72 MiB | 8.78 MiB/s, done.

Resolving deltas: 100% (12/12), done.

fusabase-livelabs % 


クローンされたリポジトリfusabase-livelabs-webに、starter、finished、checkpointsが含まれています。

fusabase-livelabs % ls fusabase-livelabs-web 

checkpoints finished package.json README.md starter

fusabase-livelabs % 


LiveLabsのコースを実施する場合は、starterから始めます。できればstarterから始めて、LiveLabsの手順にそって作業を進めることを推奨します。

本記事は完成したアプリを実行することを目的としているため、finishedを使用します。checkpointsには、Labごとの中間の作業結果が保持されています。

cd fusabase-livelabs-web

fusabase-livelabs % cd  fusabase-livelabs-web

fusabase-livelabs-web %  


Oracle Backend for Firebaseのコンソールより、Webアプリケーションを作成します。

Overviewを開き、Webをクリックします(またはProject settingsApplicationsタプを開き、Add applicationsからWebを選びます)。


App NicknameRecipeShareWebとします。LiveLabsではRecipeShareというApp Nicknameを割り当てていますが、iOSのアプリにRecipeShareを使うことにして、Webアプリの名前は競合しないように変更しています。

Register Appをクリックします。


SDK installationの手順が案内されます。

ディレクトリfusabase-livelabs-webより、npm install fusabaseを実行します。

npm install fusabase

package.jsonが更新され、dependenciesにfusabaseが追加されます。

fusabase-livelabs-web % npm install fusabase


added 2 packages, and audited 3 packages in 719ms


found 0 vulnerabilities

fusabase-livelabs-web % more package.json 

{

  "name": "fusabase-recipeshare-workshop",

  "version": "0.1.0",

  "private": true,

  "type": "module",

  "dependencies": {

    "fusabase": "^26.2.0"

  }

}

fusabase-livelabs-web % 


Oracle Backend for Firebaseのコンソールに戻り、Nextをクリックします。


SDK configurationが表示されます。

const fusabaseConfig = {..}の内容をコピーします。


finished/fusabase-config.jsの内容を、上でコピーしたfusabaseConfigの内容で置き換えます。idの値は異なりますが、以下のような内容になります。
// Paste only the key/value lines from the Fusabase console inside the object below.
// Do not copy `const fusabaseConfig =`, any SDK imports, or initialization boilerplate.
export const fusabaseConfig = {
  // Replace these placeholder values with the lines you copied from Fusabase.
  "schema": "testuser",
  "app_name": "RecipeShareWeb",
  "app_type": "WEB",
  "app_id": "57524622CB221AFEE063020012AC22B0",
  "objs_type": "dbfs",
  "project_id": "573E3A97FC7320ADE063020012AC296D",
  "storage_bucket": "dbfs_CXJHFAIIZAPLDEH",
  "auth_type": "base",
  "auth_id": "573E3A97FC7720ADE063020012AC296D",
  "ords_host": "http://localhost:8181/ords/testuser/"
};
ドロワーを下スクロールして、Doneをクリックします。


Live Serverを起動します。(Live ServerのインストールはLab 2, Task 2で紹介されています。)
live-server --port=8000 --host=localhost

fusabase-livelabs-web % live-server --port=8000 --host=localhost

Serving "/Users/__________/Documents/fusabase-livelabs/fusabase-livelabs-web" at http://localhost:8000 (http://::1:8000)

Ready for changes



ディレクトリFinishedに作成されたWebアプリに接続します。


完成したWebアプリケーションが開きます。


それぞれのLabに含まれている動作確認用のタスクを実施します。

Lab 6, Task 3で使用するパスタの画像はstarter/images以下だけにあります。finished/images以下にはありません。

セキュリティ・ルールの更新は、Lab 7の作業の前に実施します。
  • Lab 3: Build the Public Recipe Experience, Task 3: Seed demo data and verify
  • Lab 4: Authentication, Task 6: Verify authentication
  • Lab 5: Write Recipe Data, Task 3: Create a recipe and add a rating
  • Lab 6: Photo Upload, Task 3: Upload a photo and verify
  • Lab 7: Security Rules, Task 5: Verify security rules block unauthorized edits


Backendを初期化する



iOSまたはAndoroidの作業に移る前に、Oracle Backend for Firebaseに保存されたデータを初期化します。

Authenticationから作成されたユーザーを削除します。


Databaseのコレクションrecipesを削除します。


削除の確認を求められます。

Enter pathrecipesを入力し、Deleteをクリックします。


Storageのフォルダrecipesを削除します。


削除の確認を求められます。Deleteをクリックします。


DatabaseおよびStorageのセキュリティ・ルールを、すべてを許可するルールに戻します。
match /{document=**} { allow read, write: if true;}
以上の作業を実施し、次のアプリケーションの実装に移ります。


iOSアプリを実装する



作業ディレクトリfusabase-livelabsに移動します。

iOSアプリのGitHubリポジトリをクローンします。

git clone https://github.com/KillianLynch/fusabase-livelabs-ios.git

fusabase-livelabs % git clone https://github.com/KillianLynch/fusabase-livelabs-ios.git


Cloning into 'fusabase-livelabs-ios'...

remote: Enumerating objects: 160, done.

remote: Counting objects: 100% (12/12), done.

remote: Compressing objects: 100% (11/11), done.

remote: Total 160 (delta 5), reused 3 (delta 1), pack-reused 148 (from 1)

Receiving objects: 100% (160/160), 204.03 MiB | 6.85 MiB/s, done.

Resolving deltas: 100% (18/18), done.

fusabase-livelabs % 


クローンされたリポジトリfusabase-livelabs-iosに、starter、finished、checkpointsが含まれています。

 fusabase-livelabs % ls fusabase-livelabs-ios 

checkpoints finished README.md starter

fusabase-livelabs % 


LIveLabsのコースを実施する場合は、starterから始めます。できればstarterから始めて、LiveLabsの手順にそって作業を進めることを推奨します。

本記事は完成したアプリを実行することを目的としているため、finishedを使用します。

作業ディレクトリを移動し、Xcodeを起動します。

cd fusabase-livelabs-ios/finished
open RecipeShare.xcodeproj


fusabase-livelabs % cd fusabase-livelabs-ios/finished

finished % open RecipeShare.xcodeproj

finished % 


Oracle Backend for Firebaseのコンソールより、iOSアプリケーションを作成します。

Overviewを開き、iOSをクリックします(またはProject settingsApplicationsタプを開き、Add applicationsからiOSを選びます)。


App NicknameRecipeShareとします。

Register Appをクリックします。


SDK installationの手順が案内されます。

GitHubを選択して、手順を確認します。

LiveLabsで紹介されている手順とは少し異なるため、これからはLiveLabsの手順にそって作業を行います。


XcodeのFileメニューより、Add Package Dependencies...を実行します。


開いたパネルで、GitHubの以下のリポジトリを検索します。

https://github.com/oracle/fusabase-ios-sdk.git

見つかったリポジトリfusabase-ios-sdkをダブルクリックします。


開いたパネルChoose Package Products for fusabase-ios-sdk.gitにて、全てのPackage Product(FusabaseAuthFusabaseCoreFusabaseOracledbFusabaseStorage)のAdd to Targetに、RecipeShareを選択します。

Add Packageをクリックします。


Package Dependenciesが更新されます。


Oracle Backend for Firebaseのコンソールに戻り、SDK installationから次に進みます。

SDK configurationとして表示された内容をコピーします。


Xcodeに戻り、ResourcesのAssets以下にあるfusebase-configの内容を置き換えます。

"allow_self_signed_certificates": trueおよび"enable_logging": trueの設定はそのまま残します。"ords_host"の設定の末尾には必ず , (カンマ)を付けます


Oracle Backend for Firebaseのコンソールに戻り、Doneをクリックしてアプリケーションの登録を完了します。


コードを少し修正します。ServicesRecipeService.swiftを開きます。

ファンクションseedRecipesに含まれる、以下の行(103行目)を変更します。

        let seeds: [[String: Any]] = [


Anyの後ろに?を追加します。

        let seeds: [[String: Any?]] = [



同様に、ファンクションcreateRecipeに含まれる、以下の行(244行目)を変更します。

            var data: [String: Any] = [


Anyの後ろに?を追加します。

            var data: [String: Any?] = [



ファンクションaddRecipeRatingの288行目から303行目まで(do { ... } catchの中のコード)を以下のコードに置き換えます。starterから始めている場合は、もともとaddRecipeRatingは以下のコードになっているため変更は不要です。
            let author = authService.user?.email ?? "anonymous"
            
            // 1. Write the rating into the subcollection. 
            var ratingData: [String: Any?] = [
                "author": author,
                "rating": rating,
                "createdAt": Date().timeIntervalSince1970 * 1000.0
            ]
            if let comment, !comment.isEmpty {
                ratingData["comment"] = comment
            }
          
            let recipeRef = db.collection("recipes").document(recipeId)
            _ = try await recipeRef.collection("ratings").addDocument(data: ratingData)
             
            // 2. Read parent recipe to recompute aggregates.
            let snap = try await recipeRef.getDocument()
            let data = snap.data() ?? [:]
            let oldAvg = (data["averageRating"] as? Double) ?? 0
            let oldCount = (data["ratingCount"] as? Int) ?? 0
            
            let newCount = oldCount + 1
            let newAvg = (oldAvg * Double(oldCount) + Double(rating)) / Double(newCount)
            
            // 3. Write the new aggregates back to the parent.
            try await recipeRef.updateData([
                "averageRating": newAvg,
                "ratingCount": newCount
            ])
            
            // Refresh the published list so the updated rating summary appears.
            try await loadRecipes(category: nil)

以上でiOS版のアプリケーションは完成です。

ProductメニューからRunを実行します。


iPhoneシミュレータが起動します。


それぞれのLabに含まれている動作確認用のタスクを実施します。

Lab 6, Task 3で画像spagetti-carbonara.jpgをiPhoneシミュレータにコピーします。画像ファイルはstarter以下にのみ存在します。

セキュリティ・ルールの更新は、Lab 7の作業の前に実施します。
    • Lab 3: Authentication, Task 6: Create an app user
    • Lab 4: Read Recipe Data, Task 3: Seed demo data and verify
    • Lab 5: Write Recipe Data, Task 4: Create a recipe and add a rating
    • Lab 6: Photo Upload, Task 3: Make sure the Simulator has a photo to pick
    • Lab 6: Photo Upload, Task 4: Upload a photo and verify
    • Lab 7: Security Rules, Task 5: Verify security rules block unauthorized edits


    Androidアプリを実装する



    作業ディレクトリfusabase-livelabsに移動します。

    AndroidアプリのGitHubリポジトリをクローンします。

    git clone https://github.com/KillianLynch/fusabase-livelabs-android.git

    fusabase-livelabs % git clone https://github.com/KillianLynch/fusabase-livelabs-android.git

    Cloning into 'fusabase-livelabs-android'...

    remote: Enumerating objects: 205, done.

    remote: Counting objects: 100% (205/205), done.

    remote: Compressing objects: 100% (166/166), done.

    remote: Total 205 (delta 24), reused 197 (delta 22), pack-reused 0 (from 0)

    Receiving objects: 100% (205/205), 18.10 MiB | 6.26 MiB/s, done.

    Resolving deltas: 100% (24/24), done.

    fusabase-livelabs % 


    クローンされたリポジトリfusabase-livelabs-androidに、starter、fisnished、checkpointsが含まれています。

    fusabase-livelabs % ls fusabase-livelabs-android 

    checkpoints finished README.md starter

    fusabase-livelabs % 


    LiveLabsのコースを実施する場合は、starterから始めます。できればstarterから始めて、LiveLabsの手順にそって作業を進めることを推奨します。

    本記事は完成したアプリを実行することを目的としているため、finishedを使用します。

    Android Studioを起動し、finishedの下にあるRecipeShareを開きます。


    Oracle Backend for Firebaseのコンソールより、Androidアプリケーションを作成します。

    Overviewを開き、Androidをクリックします(またはProject settingsApplicationsタプを開き、Add applicationsからAndroidを選びます)。


    App Nicknamecom.oracle.fusabase.recipeshareとします。

    Register Appをクリックします。


    SDK installationの手順が案内されます。

    Package Managerを選択して、手順を確認します。

    これらの設定は、finishedでは実施済みです。Nextをクリックします。


    SDK configurationとして表示された内容を、fusabase-config.jsonとしてダウンロードします。

    ダウンロードされたファイルはRecipeShare/app以下に配置します。

    cp ~/Downloads/fusabase-config.json fusabase-livelabs-android/finished/RecipeShare/app


    下にスクロールしてDoneをクリックし、アプリケーションの登録を完了します。


    Android Studioより、RecipeShare/app以下に配置したfusabase-config.jsonを開きます。

    Androidのエミュレータはそれ自体が仮想ネットワークを持っています。Androidエミュレータからlocalhostへ接続するには、localhostの代わりに10.0.2.2を指定します。

    fusabase-config.jsonのプロパティords_hostのlocalhostの部分を10.0.2.2に置き換えます。

    変更したファイルを保存します。


    以上でAndroidのアプリケーションは完成です。

    Sync Project with Gradle Filesを実行します。


    Device Managerを開き、Androidエミュレーターを起動します。


    Androidエミュレーターが起動します。

    RecipeShareアプリケーションを実行します。


    AndroidエミュレーターでアプリケーションRecipeShareが実行されます。


    それぞれのLabに含まれている動作確認用のタスクを実施します。

    セキュリティ・ルールの更新は、Lab 7の作業の前に実施します。
      • Lab 3: Authentication, Task 6: Run and verify
      • Lab 4: Read Recipe Data, Task 6: Run and verify
      • Lab 5: Write Recipe Data, Task 3: Run and verify
      • Lab 6: Photo Upload, Task 3: Run and verify
      • Lab 7: Security Rules, Task 5: Verify security rules block unauthorized edits
      以上で、Oracle Backend for Firebase (Fusabase) を使った3種類のアプリケーションの動作が確認できました。

      2026年7月23日木曜日

      Oracle APEXが構成済みのデータベースにOracle Backend for Firebaseを構成する

      Oracle REST Data Servicesは、Oracle Databaseに保存されているデータを色々な方法で操作できるようにしています。その機能のひとつとして、Oracle Backend for Firebaseが追加されています。Oracle Backend for Firebase(以下、Fusabase)はORDS上で動作するBackend as a Service(BaaS)機能であり、FirebaseライクなSDKやAPIを提供することで、Firebaseに近い開発体験を実現します。

      Fusabaseを組み込んだアプリケーションの、バックエンドとなるデータベースはOracle Databaseです。そのため、同じデータベースに構成されていれば、APEXからも同じデータを操作できます。

      Fusabaseのプロダクト・マネージャーが、オラクルの公式ブログにてFusabaseについて紹介しています。公式ドキュメントへのリンクやLiveLabs(JavaScript/WebiOSAndroid)のリンクも紹介されています。Fusabaseを始めるための、良い紹介記事です。

      Introducing Oracle Backend with Firebase APIs: Build Mobile and Web Apps on Oracle AI Database

      本記事ではFusabaseを、United Codes社が提供しているuc-local-apex-devを使って作成したOracle Database FreeとORDS、APEXの環境に構築します。

      作業はMacBook ProのmacOSで実施します。コンテナ実行環境としてDocker + Colimaを使用します。

      以前にUC Local APEX Devを使ったAPEXの環境作成手順を紹介しています。


      手元のコンピューターにDockerまたはPodmanの実行環境が準備できていれば、GitHubのリポジトリをクローンして、そこでinstall.shを実行すると、英語のAPEXの環境ができあがります。

      install.shの実行後に、日本語リソースの導入とワークスペースの作成を追加で実施します。APEXのPatch Set Bundleが入手できる場合は、Patch Set Bundleも適用します。

      APEXのワークスペースとしてAPEXDEVが作成された状態から作業を始めます。データベースはコンテナlocal-26ai、ORDSはコンテナlocal-26ai-ordsとして実行されています。

      参照したドキュメントは以下です。

      Oracle Backend for Firebase, Release 26.1
      Developer's Guide

      また、LiveLabsで使用している、Fusabaseを構成したコンテナ環境に含まれる設定スクリプトも参照しました。GitHubのKillanLynch/fusabase-composeに含まれています。


      初期化パラメータcompatibleを23.9.0以上にする



      初期化パラメータcompatibleを23.9.0以上にします。そうでない場合、Fusabaseをインストールするコマンドであるords fusabase installを実行したときにエラーが発生します。23.9.0以上なので、Fusabaseを構成できるデータベースは26aiです。

      データベースを実行していえるコンテナに接続します。

      docker exec -it local-26ai bash

      % docker exec -it local-26ai bash

      bash-4.4$


      CDBに接続します。

      sqlplus / as sysdba

      bash-4.4$ sqlplus / as sysdba


      SQL*Plus: Release 23.26.2.0.0 - Production on Wed Jul 22 05:24:33 2026

      Version 23.26.2.0.0


      Copyright (c) 1982, 2026, Oracle.  All rights reserved.



      Connected to:

      Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

      Version 23.26.2.0.0


      SQL>


      初期化パラメータcompatibleを確認します。

      show parameter compatible

      SQL> show parameter compatible


      NAME     TYPE VALUE

      ------------------------------------ ----------- ------------------------------

      compatible     string 23.6.0

      noncdb_compatible     boolean FALSE

      SQL> 


      compatibleが23.9.0以前のバージョンであれば、23.9.0に変更します。

      ALTER SYSTEM SET COMPATIBLE='23.9.0' SCOPE=SPFILE;

      SQL> ALTER SYSTEM SET COMPATIBLE='23.9.0' SCOPE=SPFILE;


      System altered.


      SQL>


      SCOPEにSPFILEを指定しているため、変更が反映されるのはデータベースの再起動後です。ORDSからFusabaseをインストールする前に、データベースを再起動する必要があります。


      VARCHAR2の最大サイズを32Kに変更する



      初期化パラメータのmax_string_sizeをextendedに変更し、VARCHAR2の最大サイズを32767にします。作成済みのFREEPDB1が変更する対象です。
      alter session set container = freepdb1;
      alter pluggable database close immediate;
      alter pluggable database open upgrade;
      alter system set max_string_size = extended;
      @?/rdbms/admin/utl32k.sql
      alter pluggable database close;
      alter pluggable database open;

      SQL> alter session set container = freepdb1;


      Session altered.


      SQL> alter pluggable database close immediate;


      Pluggable database altered.


      SQL> alter pluggable database open upgrade;


      Pluggable database altered.


      SQL> alter system set max_string_size = extended;


      System altered.


      SQL> @?/rdbms/admin/utl32k.sql


      Session altered.



      Session altered.


      DOC>#######################################################################

      DOC>#######################################################################

      DOC>   The following statement will cause an "ORA-01722: invalid number"

      DOC>   error if the database has not been opened for UPGRADE.

      DOC>

      DOC>   Perform a "SHUTDOWN ABORT"  and

      DOC>   restart using UPGRADE.

      DOC>#######################################################################

      DOC>#######################################################################

      DOC>#


      no rows selected


      DOC>#######################################################################

      DOC>#######################################################################

      DOC>   The following statement will cause an "ORA-01722: invalid number"

      DOC>   error if the database does not have compatible >= 12.0.0

      DOC>

      DOC>   Set compatible >= 12.0.0 and retry.

      DOC>#######################################################################

      DOC>#######################################################################

      DOC>#


      PL/SQL procedure successfully completed.



      Session altered.



      502 rows updated.



      Commit complete.



      System altered.



      PL/SQL procedure successfully completed.



      Commit complete.



      System altered.



      Session altered.



      Session altered.



      Table created.



      Table created.



      Table created.



      Table truncated.



      0 rows created.



      PL/SQL procedure successfully completed.



      STARTTIME

      --------------------------------------------------------------------------------

      07/22/2026 05:33:22.503006000



      PL/SQL procedure successfully completed.


      No errors.


      PL/SQL procedure successfully completed.



      Session altered.



      Session altered.



      0 rows created.



      no rows selected



      no rows selected


      DOC>#######################################################################

      DOC>#######################################################################

      DOC>   The following statement will cause an "ORA-01722: invalid number"

      DOC>   error if we encountered an error while modifying a column to

      DOC>   account for data type length change as a result of enabling or

      DOC>   disabling 32k types.

      DOC>

      DOC>   Contact Oracle support for assistance.

      DOC>#######################################################################

      DOC>#######################################################################

      DOC>#


      PL/SQL procedure successfully completed.



      PL/SQL procedure successfully completed.



      Commit complete.



      Package altered.



      Session altered.


      SQL> alter pluggable database close;


      Pluggable database altered.


      SQL> alter pluggable database open;


      Pluggable database altered.


      SQL> 




      TDEウォレットとマスターキーを構成する



      TDEウォレットとマスタキーを構成します。Oracle Database Freeのコンテナ環境を前提として、ウォレットは/opt/oracle/database/FREE/tdeに構成します。

      sqlplusから実行するため、コマンドの最初に!を付けています。

      !mkdir -p /opt/oracle/oradata/FREE/tde
      !chown -R oracle:oinstall /opt/oracle/oradata/FREE
      !chmod 700 /opt/oracle/oradata/FREE/tde


      SQL> !mkdir -p /opt/oracle/oradata/FREE/tde


      SQL> !chown -R oracle:oinstall /opt/oracle/oradata/FREE


      SQL> !chmod 700 /opt/oracle/oradata/FREE/tde


      SQL> 


      ウォレット・ルートを設定します。

      ALTER SESSION SET CONTAINER=CDB$ROOT;
      ALTER SYSTEM SET wallet_root='/opt/oracle/oradata/FREE' SCOPE=SPFILE;


      SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;


      Session altered.


      SQL> ALTER SYSTEM SET wallet_root='/opt/oracle/oradata/FREE' SCOPE=SPFILE;


      System altered.


      SQL> 


      一旦、データベースを再起動しcompatibleとwallet_rootの設定をデータベースに反映します。

      shutdown immediate
      startup

      SQL> shutdown immediate

      Database closed.

      Database dismounted.

      ORACLE instance shut down.

      SQL> startup

      ORACLE instance started.


      Total System Global Area 1603386016 bytes

      Fixed Size     5020320 bytes

      Variable Size   536870912 bytes

      Database Buffers 1056964608 bytes

      Redo Buffers     4530176 bytes

      Database mounted.

      Database opened.

      SQL> 


      キーストアを構成し、マスターキーを作成します。
      ALTER SYSTEM SET tde_configuration='KEYSTORE_CONFIGURATION=FILE' SCOPE=BOTH;
      ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY "<strong_keystore_password>";
      ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "<strong_keystore_password>" CONTAINER=ALL;
      ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "<strong_keystore_password>" WITH BACKUP CONTAINER=ALL;
      col wrl_type format a10
      col wrl_parameter format a40
      col status format a8
      SELECT WRL_TYPE, WRL_PARAMETER, STATUS FROM V$ENCRYPTION_WALLET;

      SQL> ALTER SYSTEM SET tde_configuration='KEYSTORE_CONFIGURATION=FILE' SCOPE=BOTH;


      System altered.


      SQL> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY "**********";


      keystore altered.


      SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "**********" CONTAINER=ALL;


      keystore altered.


      SQL> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "**********" WITH BACKUP CONTAINER=ALL;


      keystore altered.


      SQL> col wrl_type format a10

      SQL> col wrl_parameter format a40

      SQL> col status format a8

      SQL> SELECT WRL_TYPE, WRL_PARAMETER, STATUS FROM V$ENCRYPTION_WALLET;


      WRL_TYPE   WRL_PARAMETER     STATUS

      ---------- ---------------------------------------- --------

      FILE   /opt/oracle/oradata/FREE/tde/     OPEN

      FILE     OPEN

      FILE     OPEN


      SQL> 


      ウォレットのステータスがOPENであれば、データベースの構成は完了です。

      sqlplusを終了し、コンテナlocal-26aiから抜けます。

      SQL> exit

      Disconnected from Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

      Version 23.26.2.0.0

      bash-4.4$ exit

      exit

      % 




      Oracle Backend for Firebaseをインストールする



      ORDSを実行しているコンテナlocal-26ai-ordsに接続し、データベースにFusabaseをインストールします。

      docker exec -it local-26ai-ords bash

      % docker exec -it local-26ai-ords bash

      [oracle@32c50e30cd10 ords]$ 


      fusabaseのインストーラーを起動します。

      cd /etc/ords/config
      /opt/oracle/ords/bin/ords --config /etc/ords/config fusabase install


      使用する接続プールとしてdefaultの1を選択します。

      [oracle@32c50e30cd10 ords]$ cd /etc/ords/config

      [oracle@32c50e30cd10 config]$ /opt/oracle/ords/bin/ords --config /etc/ords/config fusabase install


      ORDS: Release 26.2 Production on Wed Jul 22 06:05:10 2026


      Copyright (c) 2010, 2026, Oracle.


      Configuration:

        /etc/ords/config


      Oracle Backend for Firebase - Interactive Install


        Enter a number to select the database pool to install/upgrade FUSABASE.

          [1] default      jdbc:oracle:thin:@//26ai:1521/FREEPDB1

        Choose [1]: 


      2を選択し、暗号化用のパスフレーズを設定します。

        Enter a number to update the value or select option A to Accept and Continue

          [1] Enable Feature FUSABASE: Yes

          [2] Encryption passphrase for FUSABASE: <generate>

          [A] Accept and Continue - Update configuration

          [Q] Quit - Do not proceed. No changes

        Choose [A]: 2


      Sを選択し、パスフレーズとなる文字列を入力します。

        Enter your choice for the encryption passphrase for FUSABASE:

          [S] Specify your own encryption passphrase

          [G] Generate encryption passphrase

          [C] Cancel - No Changes

        Choose [G]: S

        Enter the encryption passphrase for FUSABASE: ***************

        Enter a number to update the value or select option A to Accept and Continue

          [1] Enable Feature FUSABASE: Yes

          [2] Encryption passphrase for FUSABASE: <specified encryption key>

          [A] Accept and Continue - Update configuration

          [Q] Quit - Do not proceed. No changes

        Choose [A]: 


      Aを選択し、Fusabaseのインストールを開始します。

      Enter the administrator usernamesysを入力し、SYS AS SYSDBAのパスワードを入力します。SYSのパスワードは、GitHubからクローンしたuc-local-apex-devの.envファイル内に、ORACLE_PWDに設定する文字列として記載されています。

        Enter a number to update the value or select option A to Accept and Continue

          [1] Enable Feature FUSABASE: Yes

          [2] Encryption passphrase for FUSABASE: <specified encryption key>

          [A] Accept and Continue - Update configuration

          [Q] Quit - Do not proceed. No changes

        Choose [A]: A

        Provide database user name with administrator privileges.

          Enter the administrator username: sys

        Enter the database password for SYS AS SYSDBA: **********

      Connecting to database user: SYS AS SYSDBA url: jdbc:oracle:thin:@//26ai:1521/FREEPDB1


      Retrieving information.

      The setting named: feature.fusabase was set to: true in configuration: default

      The setting named: fusabase.secret.encKey was set to: ****** in configuration: default

      Created folder /etc/ords/config/logs

      The log file is defaulted to the current working directory located at /etc/ords/config/logs

      Installing Oracle Backend for Firebase version 26.2.0-260613 in FREEPDB1

      Completed installation for Oracle Backend for Firebase version 26.2.0-260613. Elapsed time: 00:00:02.443 


      [oracle@32c50e30cd10 config]$ 


      インストールが正常に終了すると、Fusabaseの構成は完了です。

      ORDSのコンテナから抜け、ORDSのコンテナを再起動します。

      exit
      docker restart local-26ai-ords

      [oracle@32c50e30cd10 config]$ exit

      exit

      % docker restart local-26ai-ords

      local-26ai-ords

      ynakakoshi@Ns-Macbook ~ % 


      この状態でいかのURLにアクセスし、トップページにOracle Backend for Firebaseが存在することを確認します。



      プロジェクト用スキーマを作成する


      LiveLabs向けの構成に合わせて、プロジェクト用のスキーマとしてTESTUSERを作成します。パスワードはTESTPWDとします。

      ホストでSQLclを実行し、FREEPDB1に接続します。

      sql -name local-26ai-sys

      % sql -name local-26ai-sys


      SQLcl: 水 7月 22 15:25:36 2026のリリース26.1 Production


      Copyright (c) 1982, 2026, Oracle.  All rights reserved.


      接続先:

      Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

      Version 23.26.2.0.0


      SQL> 


      スキーマTESTUSERを作成します。

      CREATE USER testuser IDENTIFIED BY testpwd QUOTA UNLIMITED ON users;
      GRANT connect, resource TO testuser;
      GRANT CREATE SESSION, RESOURCE, DBFS_ROLE TO testuser;
      GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO testuser;
      GRANT CREATE ANY DIRECTORY TO testuser;

      SQL> CREATE USER testuser IDENTIFIED BY testpwd QUOTA UNLIMITED ON users;


      User TESTUSERは作成されました。


      SQL> GRANT connect, resource TO testuser;


      Grantが正常に実行されました。


      SQL> GRANT CREATE SESSION, RESOURCE, DBFS_ROLE TO testuser;


      Grantが正常に実行されました。


      SQL> GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO testuser;


      Grantが正常に実行されました。


      SQL> GRANT CREATE ANY DIRECTORY TO testuser;


      Grantが正常に実行されました。


      SQL> 


      Fusabaseをスキーマに対して有効にするには、OBAAS_ADMIN.OBAAS_ENABLE_SCHEMAを呼び出す必要があります。この呼び出しは、SYS、SYSTEM以外のDBAロールを持つユーザーによって実行します。

      OBAAS_ADMIN.OBAAS_ENABLE_SCHEMAを実行するためのユーザーを、fusabase_dbaとして作成します。

      CREATE USER fusabase_dba IDENTIFIED BY <パスワード> QUOTA UNLIMITED ON USERS;
      GRANT baas_dba, dba to fusabase_dba;

      SQL> create user fusabase_dba identified by ********** quota unlimited on users;


      User FUSABASE_DBAは作成されました。


      SQL> GRANT baas_dba, dba to fusabase_dba;


      Grantが正常に実行されました。


      SQL> 


      SYSから一旦抜けて、作成したfusabase_dbaで接続し直します。

      exit
      sql fusabase_dba@localhost/freepdb1

      SQL> exit

      Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

      Version 23.26.2.0.0から切断されました

      ynakakoshi@Ns-Macbook ~ % sql fusabase_dba@localhost/freepdb1


      SQLcl: 水 7月 22 15:37:23 2026のリリース26.1 Production


      Copyright (c) 1982, 2026, Oracle.  All rights reserved.


      パスワード (**********?) **********

      Last Successful login time: 水 7月  22 2026 15:37:25 +09:00


      接続先:

      Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

      Version 23.26.2.0.0


      SQL> 


      FusabaseをスキーマTESTUSERに対して有効にします。
      BEGIN
        OBAAS_ADMIN.OBAAS_ENABLE_SCHEMA(
          'TESTUSER',
          'BASE_PATH',
          'testuser',
          FALSE
        );
      END;
      /
      COMMIT;

      SQL> BEGIN

        2    OBAAS_ADMIN.OBAAS_ENABLE_SCHEMA(

        3      'TESTUSER',

        4      'BASE_PATH',

        5      'testuser',

        6      FALSE

        7    );

        8  END;

        9  /

       10* COMMIT;


      PL/SQLプロシージャが正常に完了しました。



      コミットが完了しました。


      SQL> 


      以上で、Fusabaseの構成は完了です。


      Fusabaseに接続する



      作成したユーザーTESTUSERにて、Fusabaseに接続します。

      http://localhost:8181/ords

      Oracle Backend for Firebaseを実行します。


      ユーザーTESTUSERサインインします。


      プロジェクトの作成画面が開きます。

      Create projectをクリックし、LiveLabsで使用できるプロジェクトrecipe-workshopを作成します。


      プロジェクト名はrecipe-workshopとし、Set up using quickstartを選択します。

      Create Projectをクリックします。


      プロジェクトrecipe-workshopが作成されました。作成されたプロジェクトを開きます。


      以上で、FusabaseのLiveLabs(WebiOSAndroid)のGet Startedまでの作業完了しています。

      それぞれのLab 1、Task 2のSet starter security rulesから作業を進めることができます。


      APEXからFusabaseのデータを参照する



      Fusabaseを構成すると、コネクション・プールの設定からplsql.gateway.modeが取り除かれることがありました。APEXが動作するには、plsql.gateway.modeproxiedであることが必須なので、そのような場合は設定をやり直し、ORDSを再起動します。

      docker exec local-26ai-ords bash -c \
      "ords --config /etc/ords/config config --db-pool default set plsql.gateway.mode proxied"
      docker restart local-26ai-ords

      % docker exec local-26ai-ords bash -c \

      "ords --config /etc/ords/config config --db-pool default set plsql.gateway.mode proxied"


      ORDS: Release 26.2 Production on Wed Jul 22 07:25:08 2026


      Copyright (c) 2010, 2026, Oracle.


      Configuration:

        /etc/ords/config


      The setting named: plsql.gateway.mode was set to: proxied in configuration: default

      % docker restart local-26ai-ords

      local-26ai-ords

      % 


      APEXの管理サービスにサインインし、すでに作成済みのワークスペースAPEXDEVにスキーマTESTUSERを割り当てます。

      UC Local APEX Devで作成したAPEX環境の管理者ユーザーADMINのデフォルトのパスワードは、データベース・ユーザーSYSおよびSYSTEMのパスワードと同じです。

      ワークスペースの管理を開きます。


      ワークスペースとスキーマの割り当ての管理を開きます。


      スキーマの追加をクリックします。


      追加するスキーマとして既存を選択し、へ進みます。


      ワークスペースAPEXDEVを選択し、へ進みます。


      スキーマとしてTESTUSERを選択し、APEX権限を付与オンにします。

      へ進みます。


      確認画面が開きます。スキーマの追加を実行します。


      ワークスペースAPEXDEVにスキーマTESTUSERが追加されました。


      管理サービスからサインアウトし、ワークスペースAPEXDEVにサインインします。

      ユーティリティサンプル・データセットを開き、スキーマTESTUSERにサンプル・データセットのEMP/DEPTをインストールします。


      サンプル・データセットのEMP/DEPTインストールします。


      データセットのインストール先のスキーマとしてTESTUSERを選択します。

      へ進みます。


      データセットのインストールを実行します。


      スキーマTESTUSERに、表EMP、DEPTおよびビューEMP_DEPT_Vが作成されました。

      終了します。


      Fusabaseの管理画面に移動します。

      先ほど作成したプロジェクトrecipe-workshopのサイド・メニューからDatabaseを開きます。

      Relational to collection mappingのタブを開きます。

      Link existing tablesをクリックします。


      Parent table nameempとします。

      このページでは親子関係のある表を登録し、それから1つのJSON Duality Viewを作成します。今回は確認のみなので、親子関係は登録しません。

      Saveをクリックします。


      表EMPがコレクションempにマッピングされました。Dataタブを開きます。


      Dataビューから表EMPの内容がドキュメントとして参照できます。


      従業員SMITHのドキュメントを見つけ、More actionsView/Alter Documentを実行します。


      Editをクリックし、編集モードに移ります。


      Salを800から888に変更し、Saveします。


      Oracle Backend for Firebase(Fusabase)から、コレクションempに含まれるドキュメントが更新されました。


      APEXから、スキーマTESTUSERにある表EMPの行が更新されていることを確認します。

      APEXのオブジェクト・ブラウザに移ります。

      スキーマにTESTUSERを選択し、表EMPを開きます。データ・タブを選択し、表EMPに含まれるデータを一覧します。

      表の従業員SMITHの列SALの値が888になっていることが確認できます。


      オブジェクト・ブラウザのビューより、EMP$BAASを選択します。

      DDLより、ビューEMP$BAASがJSON Duality Viewとして作成されていることが確認できます。
      CREATE OR REPLACE FORCE EDITIONABLE JSON RELATIONAL DUALITY VIEW "EMP$BAAS" AS
      SELECT JSON {
          'ename'      : "ENAME",
          'job'        : "JOB",
          'mgr'        : "MGR",
          'hiredate'   : "HIREDATE",
          'sal'        : "SAL",
          'comm'       : "COMM",
          'deptno'     : "DEPTNO",
          'OID'        : SYS_MAKE_OID_FROM_PK("EMPNO"),
          '_id'        : "EMPNO",
          'parent_oid' : '_docId'
      }
      FROM "EMP"
      WITH INSERT UPDATE DELETE;

      Oracle Backend for Firebase(Fusabase)では、JSON Duality Viewをコレクションとして扱うことにより、表に保存されているデータを直接操作することができます。

      GUIから作成できるJSON Duality Viewには制約がありますが、コマンド・ラインからもOracle Backend for Firebaseで操作できるJSON Duality Viewを作成できるようです。ドキュメントの14.3 Standalone Duality Views (Advanced)に、作成するJSON Duality Viewが満たすべき条件が説明されています。

      リードオンリーであれば、Join collectionsとして表を元にしたコレクションを作成できます。Join collectionは、JSON Duality Viewではなく、列DATAとしてJSONを返す通常のビューとして作成されます。


      今回の記事は以上になります。

      すでに作成済みの環境を使って、Oracle Backend for FirebaseのLiveLabsを試してみましょう。