ASP でエラー "更新可能なクエリであることが必要です。" が返される


現象


Active Server Pages (ASP) で ActiveX Data Objects (ADO) を使用すると、次の一般的なエラーが表示されることがあります。

Microsoft OLE DB Provider for ODBC Drivers エラー '80004005'

[Microsoft][ODBC Microsoft Access 97 Driver] 更新可能なクエリであることが必要です。

原因


この資料では、上記のエラーの主な原因 4 つとそれぞれの回避方法について説明します。 この資料では Microsoft Access データベースについて述べていますが、この資料に記載されている情報は他の種類のデータベースにも該当します。

解決方法


このエラーが発生するのは、通常、UPDATE など、データベースの情報に変更を加える操作をスクリプトで実行するときです。 以下のいずれかの原因で ADO によるデータベースへの書き込みができない場合に発生します。

  1. 最も頻度の高い原因は、デフォルトで "Everyone" グループに含まれているインターネット ゲスト アカウント (IUSR_MACHINE) に、データベース ファイル (.mdb) に対する書き込みのアクセス許可がないことです。 この問題を解決するには、エクスプローラで、対象のファイルのプロパティの [セキュリティ] タブを修正して、インターネット ゲスト アカウントに適切なアクセス許可を付与します。

    注: ADO と共に Microsoft Access データベースを使用する場合、インターネット ゲスト アカウントに、.mdb ファイルが格納されているディレクトリに対する書き込みのアクセス許可を与える必要もあります。 これは、データベースのロックを処理するために Jet により .ldb ファイルが作成されるためです。 また、Jet では Temp フォルダに一時ファイルが作成されることもあるため、このフォルダに対する読み取りおよび書き込みのアクセス許可を与える必要もあります。
  2. このエラーの原因として 2 番目に挙げられるのは、データベースが書き込みに適した MODE で開かれなかったことです。 Connection オブジェクトに対して Open を実行する場合は、次のように Mode プロパティを使用して接続に対するアクセス許可を指定します。

          SQL = "UPDATE Products Set UnitPrice = 2;"
    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Mode = 3 '3 = adModeReadWrite
    Conn.Open "myDSN"
    Conn.Execute(SQL)
    Conn.Close

    注: MODE はデフォルトでは 0(adModeUnknown) に設定され、通常では更新が許可されます。
  3. このエラーのもう 1 つの原因として挙げられるのは、ODBC マネージャのこのデータ ソース名 (DSN) の [オプション] ページで [読み取り専用] チェック ボックスがオンになっている場合です。
  4. この最後の原因と回避方法は、どのような SQL データ ソースでも関係します。 データベースの参照整合性に違反する SQL ステートメントが原因でエラーが発生することがあります。 失敗する最も一般的なクエリのいくつかを以下に示します。
    • 対応が最も簡単なのは、UniqueValue プロパティが Yes に設定される、クロス集計、SQL パススルー クエリ、結合クエリ、または更新クエリ (つまりテーブル作成クエリ) など、ユーザーが変更できないものです。

    • 非常に一般的なもう 1 つの原因は、一意のインデックスを持たないリンクした ODBC テーブルが結合に含まれている場合です。 この場合、SQL には、クエリによって値が変わるフィールドを持つテーブル内で、レコードが一意であることを保証する方法はありません。

    • 確実な回避策がある原因もあります。 "一対多" のクエリの "一" の側にある結合フィールドを更新する場合、連鎖更新を有効にしないと失敗します。 連鎖更新を有効にすることにより、参照整合性を JET エンジンに委任できます。

状態


この動作は仕様です。