Web SQL の非推奨化と削除

ユーザーのパソコンに構造化された方法で(SQLite データベース エンジンに基づいて)データを保存できる Web SQL Database API は、2009 年 4 月に導入され、2010 年 11 月に廃止されました。この機能は WebKit(Safari の基盤)で実装され、Blink エンジン(Chrome の基盤)でもアクティブのままでしたが、Gecko(Firefox の基盤)では実装されず、WebKit は 2019 年にこの機能を削除しました。

World Wide Web Consortium(W3C)は、ウェブ データベースを必要とする企業に対して、Web Storage API テクノロジー(localStoragesessionStorageIndexedDB など)の導入を推奨しています。これらのテクノロジーは、Key-Value ストアと構造化データに関して強みを発揮しますが、強力なクエリ言語がないなどの弱点もあります。ユーザーがウェブ上で SQL を求める理由はいくつかあります。

Web SQL のサポート終了と削除の手順

  • [ 完了。]Web SQL は、Chromium 97(2022 年 1 月 4 日)でサードパーティ コンテキストで非推奨になり、削除されました。
  • [ 完了] セキュアでないコンテキストでの Web SQL アクセスは、Chromium 105(2022 年 1 月 4 日)で非推奨になりました。この時点で、Chrome DevTools の問題パネルに警告メッセージが表示されました。

Chrome DevTools の [Issues] パネルに、セキュアでないコンテキストで Web SQL が表示されるという警告が表示される機能は、サポートを終了しました。

  • [ 完了] Chromium 110(2022 年 1 月 4 日)以降、セキュアでないコンテキストでの Web SQL アクセスは利用できなくなります。Chromium 110(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)まで、この機能を引き続き使用するためのエンタープライズ ポリシーをご利用いただけます。
  • [ 完了] すべてのコンテキストでの Web SQL アクセスは Chromium 115(2022 年 1 月 4 日)で非推奨になり、Chrome DevTools の問題パネルに警告メッセージが表示されます。
  • [ 完了] Web SQL を引き続き使用するためのサポート終了トライアルは、Chromium 117(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)まで利用できました。非推奨トライアルの詳細については、オリジン トライアルの開始をご覧ください。
  • [ 完了] Chromium 119 以降、すべてのコンテキストで Web SQL にアクセスできなくなります。

次のステップ

概要で説明したように、多くの場合は localStoragesessionStorage などの Web Storage API テクノロジー、または IndexedDB 標準が適切な代替手段となりますが、必ずしもすべてのケースで利用できるわけではありません。

ストレージをウェブ デベロッパーに任せる理由

Wasm の登場により、SQL または NoSQL ソリューションがウェブに登場しました。たとえば、DuckDB-Wasmabsurd-sql です。こうした結果から、デベロッパー コミュニティはブラウザ ベンダーよりも迅速かつ効果的に新しいストレージ ソリューションを反復開発できると考えています。

Google は Web SQL を削除するだけではありません。実際、この機能は、オープンソース コミュニティによってメンテナンスされ、ブラウザに直接修正や新機能を導入する負担なしで、必要に応じて更新できるパッケージとして提供されるものに置き換えられました。Google の目的は、デベロッパーが独自のデータベースをウェブに持ち込めるようにすることです。

さらに、この例がオープンソース データベースの新しいエコシステムの繁栄に役立つことを願っています。ファイル システム アクセス ハンドルのリリースにより、カスタム ストレージ ソリューションを構築できる新しいプリミティブが提供されるようになりました。

Web SQL のサポート終了の理由

持続可能性とセキュリティに関する懸念

Web SQL 仕様は持続的に実装できないため、イノベーションと新機能が制限されます。標準の最後のバージョンには、文字通り「ユーザー エージェントは Sqlite 3.6.19 でサポートされている SQL 言語を実装する必要があります」と記載されています

SQLite は当初、悪意のある SQL ステートメントを実行するように設計されていませんでしたが、WebSQL を実装すると、ブラウザはまさにこれを実行する必要があります。セキュリティと安定性の修正に対応するには、Chromium の SQLite を更新する必要があります。これは、SQLite 3.6.19 とまったく同じ動作をするという Web SQL の要件と直接矛盾します。

API シェイプ

Web SQL は、経過時間を表示する API でもあります。2000 年代後半に登場したこのライブラリは、次のコードサンプル(Nolan Lawson 提供)に示すように、「コールバック地獄」の典型的な例です。ご覧のとおり、SQL ステートメント(SQLite SQL 言語を使用)は文字列としてデータベース メソッドに渡されます。

openDatabase(
  // Name
  'mydatabase',
  // Version
  1,
  // Display name
  'mydatabase',
  // Estimated size
  5000000,
  // Creation callback
  function (db) {
    db.transaction(
      // Transaction callback
      function (tx) {
        // Execute SQL statement
        tx.executeSql(
          // SQL statement
          'create table rainstorms (mood text, severity int)',
          // Arguments
          [],
          // Success callback
          function () {
            // Execute SQL statement
            tx.executeSql(
              // SQL statement
              'insert into rainstorms values (?, ?)',
              // Arguments
              ['somber', 6],
              // Success callback
              function () {
                // Execute SQL statement
                tx.executeSql(
                  // SQL statement
                  'select * from rainstorms where mood = ?',
                  // Arguments
                  ['somber'],
                  // Success callback
                  function (tx, res) {
                    // Do something with the result
                    var row = res.rows.item(0);
                    console.log(
                      'rainstorm severity: ' +
                        row.severity +
                        ',  my mood: ' +
                        row.mood,
                    );
                  },
                );
              },
            );
          },
        );
      },
      // Error callback
      function (err) {
        console.log('Transaction failed!: ' + err);
      },
      // Success callback);
      function () {
        console.log('Transaction succeeded!');
      },
    );
  },
);

このコードを実行して Chrome DevTools で作成されたテーブルを調べると、次のようになります。

Chrome DevTools の [Web SQL] セクションを調べると、mydatabase というデータベースと、rainstorms というテーブルが見つかります。このテーブルには、mood(テキスト)列と severity(整数)列があり、mood が somber で severity が 6 のエントリが 1 つあります。

実装者のサポートがない

(少なくとも今日の観点から)難解な API の形状以外にも、Mozilla は SQLite 上に構築された Web SQL について多くの懸念を抱いていました。

「[SQLite] は、一般的なウェブ コンテンツに公開される API の適切な基盤ではないと考えています。特に、有用な方法で SQL をサブセット化する信頼性が高く、広く受け入れられている標準がないためです。また、SQLite の変更が後でウェブに影響することを望んでおらず、SQLite に主要なブラウザ リリース(およびウェブ標準)を活用することは慎重であると考えます。」

Mozilla の懸念事項については、元 Mozilla 社員の Vladimir Vukićević のブログ投稿をご覧ください。詳細については、W3C ウェブ アプリケーション ワーキング グループの議事録(詳細を確認したい場合は、IRC ログ)とメーリング リスト アーカイブをご覧ください。また、Nolan Lawson のブログ投稿では、発生した事象の概要を確認できます。

フィードバック

この投稿でお知らせした非推奨の手順について懸念がある場合は、blink-dev メーリング リストでお知らせください。このグループへの参加は誰でも可能で、誰でも投稿できます。

謝辞

この記事は、Joe MedleyBen MorssJoshua Bell が確認しました。