web-dev-qa-db-ja.com

操作では、更新可能なクエリを使用する必要があります。 (エラー3073)Microsoft Access

一部のMicrosoft Accessクエリで、次のメッセージが表示されます。操作には更新可能なクエリを使用する必要があります。 (エラー3073)。一時テーブルを使用して回避しますが、もっと良い方法があるかどうか疑問に思っています。関係するすべてのテーブルには主キーがあります。コードは次のとおりです。

UPDATE CLOG SET CLOG.NEXTDUE = (
    SELECT H1.paidthru 
    FROM CTRHIST as H1
    WHERE H1.ACCT = clog.ACCT AND
    H1.SEQNO = (
        SELECT MAX(SEQNO) 
        FROM CTRHIST 
        WHERE CTRHIST.ACCT = Clog.ACCT AND 
        CTRHIST.AMTPAID > 0 AND
        CTRHIST.DATEPAID < CLOG.UPDATED_ON
    )
)
WHERE CLOG.NEXTDUE IS NULL;
21
Knox

Jet 4以降、データを要約するSQLステートメントへの結合を持つすべてのクエリは更新できなくなります。 JOINを使用していませんが、WHERE句は結合とまったく同じであるため、Jetクエリオプティマイザーは結合を処理するのと同じように処理します。

一時テーブルがないと運が悪かったのではないかと思いますが、回避策を考え出すよりもJet SQLの知識が豊富な人がいるかもしれません。

ちなみに、Jet 3.5(Access 97)では更新可能だったかもしれません。多くのクエリが更新可能で、Jet 4にアップグレードすると更新不可能になりました。

-

23
David-W-Fenton

次のクエリが機能しないという同様の問題がありました。

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = (select LGA.LGA_NAME from tbl_Prop_LGA as LGA where LGA.LGA_CODE = LVD.LGCode)
where LVD.LGAName is null;

update tbl_LOT_VALUATION_DETAILS inner join tbl_prop_LGA on tbl_LOT_VALUATION_DETAILS.LGCode = tbl_prop_LGA.LGA_CODE 
set tbl_LOT_VALUATION_DETAILS.LGAName = [tbl_Prop_LGA].[LGA_NAME]
where tbl_LOT_VALUATION_DETAILS.LGAName is null;

ただし、DLookupを使用して問題を解決しました。

update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = dlookup("LGA_NAME", "tbl_Prop_LGA", "LGA_CODE="+LVD.LGCode)
where LVD.LGAName is null;

このソリューションは元々 https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query で提案されました

8
Ray Brack

コードにエラーはありません。ただし、次の理由によりエラーがスローされます。

 - Please check weather you have given Read-write permission to MS-Access database file.

 - The Database file where it is stored (say in Folder1) is read-only..? 

データベース(MS-Accessファイル)を読み取り専用フォルダーに保存し、アプリケーションの実行中に接続が強制的に完全に開かれないと仮定します。したがって、C:\Program filesすべてのほとんどすべてのcドライブファイルが設定されています読み取り専用この許可を変更すると、この問題が解決します。

4

問題は、(この場合)max()関数の使用に明確に関係しています。結合中に使用された集計関数(たとえば、結合されたテーブルから最大値、最小値、または平均値を取得する)は、エラーの原因になります。同じことが、元のコードのように、結合の代わりにサブクエリを使用する場合にも当てはまります。

これは、やりたいこととしてはかなり一般的なことなので、非常に迷惑です(そして不当です!)。また、一時テーブルを使用して回避する必要があります(集約ステートメントを挿入ステートメントで一時テーブルにプルし、更新でこのテーブルに結合し、一時テーブルを削除します)。

グレン

4
Glenn M

私の答えは7年遅れていますが、とにかくここに私の提案があります:

AccessがJOINを含むUPDATEクエリについて文句を言うときは、RecordsetTypeプロパティをDynaset (Inconsistent Updates)に設定してクエリを保存するだけです。

これにより、UPDATEが機能する場合があります。

3
Patrick Honorez

これは、更新されるテーブルに一意のMS-ACCESSキーがない場合に発生します。 (SQLスキーマに関係なく)。

SQLテーブルへのMS-Accessリンクを作成する場合、リンク時にインデックス(キー)を指定するよう求められます。これが正しく行われない場合、またはまったく行われない場合、リンクテーブルに対するクエリは更新できません

SQLテーブルをAccessにリンクする場合、Accessがインデックス(キー)を要求するときに、問題を回避するためにSQLが使用するものを正確に使用しますが、一意のキーを指定するだけでAccessはテーブルを更新する必要があります。

あなたが元々テーブルをリンクした人ではない場合、リンクされたテーブルをMS-ACCESSから削除し(リンクのみが削除されます)、キーを適切に指定して再リンクすると、すべてが正しく動作します。

2
Dave Nilson

AccessでUPDATEクエリを作成してみます。自分で書いたUPDATEクエリがありました

UPDATE TABLE1
SET Field1 = 
(SELECT Table2.Field2
 FROM Table2
 WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn)

クエリにより、表示されているエラーが表示されました。ただし、これは私のSQL Serverで機能しましたが、前述の回答と同様に、Access UPDATE構文は標準の構文ではありません。ただし、Accessのクエリウィザード(JOIN構文を使用)を使用して再構築すると、正常に機能しました。通常、UPDATEクエリをパススルーにして非JET構文を使用しますが、参加していたテーブルの1つはローカルアクセステーブルでした。

2
StoneJedi

(パーティーに少し遅れて...)

過去にこの問題を回避した3つの方法は次のとおりです。

  1. 開いているフォーム上のテキストボックスを参照する
  2. DSum
  3. DLookup
1
mark

私は単純なINSERTステートメントで失敗しました。 '管理者として実行'アクセスでアプリケーションを起動することで修正されました。

1
nspire

同じ問題がありました。

私の解決策は、最初に更新不可能なクエリからテーブルを作成し、次にテーブルからテーブルへの更新を実行することです。

1
marcnz

MS Access-更新クエリでテーブルを結合する...更新可能にする方法

  1. デザインビューでクエリを開く
  2. リンクb/w tables/viewを1回クリックします
  3. [プロパティ]ウィンドウで、[一意のレコード]の値を[はい]に変更します。
  4. クエリを更新クエリとして保存し、実行します。
1
Paul Dungan

同じエラーが引き続き発生しますが、すべてのSQLはAccessで非常にうまく実行されます

accessFileのpermissionを修正したとき。

問題が修正されました!!

'ネットワークサービス'アカウントにフルコントロールのアクセス許可を与えます。このアカウントは[〜#〜] iis [〜#〜]の場合

0

今日、MS-Access 2003で、ODBC tablaでsaパスワードを使用してSQL Server 2000をポイントすると、同じエラーが発生しました。
SQL Serverデータベースのテーブルで主キーを定義しましたが、問題はなくなりました。

0
Ariel Alvarez

上記のiDevlopによる答えは私にとってはうまくいきました。更新クエリでRecordsetTypeプロパティを見つけることができなかったことに注意してください。ただし、クエリを選択クエリに変更し、そのプロパティをiDevlopが指摘したとおりに設定してから、クエリを更新クエリに変更することで、そのプロパティを見つけることができました。これは機能し、一時テーブルは必要ありません。

私はこれが、iDevlopが投稿したものへのコメントであり、それが彼のソリューションから流れ出るようにしたかったのですが、十分なスコアがありません。

0
Sue White

ここには別のシナリオが適用されます。 [表示]オプションまたは[チェックアウト]で "Writeablity"が指定されていないVisual Source Safeからチェックアウトされたファイルも、このエラーメッセージを受け取ります。

解決策は、ソースセーフからファイルを再取得し、書き込み設定を適用することです。

0
htm11h

同様に更新するコードをいつでもVBAで作成できます。私もこの問題を抱えており、私の回避策は、更新できるように探しているすべてのデータを含むすべての結合を持つ選択クエリを作成し、そのレコードセットを作成し、更新クエリとして更新クエリを繰り返し実行していました更新するテーブルのみ、探している基準のみを検索する

    Dim updatingItems As Recordset
    Dim clientName As String
    Dim tableID As String
    Set updatingItems = CurrentDb.OpenRecordset("*insert SELECT SQL here*");", dbOpenDynaset)
    Do Until updatingItems .EOF
        clientName = updatingItems .Fields("strName")
        tableID = updatingItems .Fields("ID")
        DoCmd.RunSQL "UPDATE *ONLY TABLE TO UPDATE* SET *TABLE*.strClientName= '" & clientName & "' WHERE (((*TABLE*.ID)=" & tableID & "))"
        updatingItems.MoveNext
    Loop

グループ全体を選択して変更を行うのではなく、クエリを最初から最後まで複数回実行しているため、これを1日あたり約60件のレコードに対して行うだけで、数千回行うにはさらに時間がかかります。 tableIDの文字列であるため、tableIDの引用符の前後に ''が必要になる場合がありますが、これが私にとってうまくいったことは確かです。

0
RSmith

このエラーが発生したとき、UPDATE構文が間違っていたためである可能性がありますが、更新クエリを修正した後、同じエラーが再び表示されたため、ODBC Data Source Administratorと接続が読み取り専用であることがわかりました。接続を読み書き可能にして再接続した後、正常に機能しました。

0
leeand00

dB(データベース許可)を確認し、完全な許可を与えます

DBフォルダーに移動->プロパティを右クリック->セキュリティ->編集->フルコントロールと[スタート]メニューを実行->実行->「uac」と入力して(高ければ)

0
Manoj essl

DRUAが回答で言及した内容にさらに回答するには...

Access 2007でデータベースを開発しています。ユーザーはAccess 2007ランタイムを使用しています。これらには、database_Front(フロントエンド)フォルダーに対する読み取り権限と、database_Backフォルダーに対する読み取り/書き込み権限があります。

新しいデータベースを展開する際、ユーザーはフロントエンドをコンピューターにコピーするという完全な指示に従わず、代わりにショートカットを作成しました。ショートカットを介してフロントエンドを実行すると、ファイルの書き込み制限のためにクエリを更新できない条件が作成されます。

フロントエンドをドキュメントフォルダーにコピーすると、問題が解決します。

はい、ユーザーがフロントエンドの更新バージョンを取得する必要がある場合、事態は複雑になりますが、少なくとも一時テーブルなどに頼ることなくクエリは機能します。

0

接続フィールドを両方の接続テーブルで一意のインデックスにするまで、同じエラーが発生し続けました。その後、クエリは更新可能になりました。

フィリップ・スティリアノス

0

本質的に、SQLは完全に合理的に見えますが、JetはUPDATEのSQL標準構文をサポートしていません。代わりに、very制限のある独自の独自の構文(SQL Server独自のUPDATE構文とは異なる)を使用します。多くの場合、「操作は更新可能なクエリを使用する必要があります」という唯一の回避策は非常に苦痛です。より有能なSQL製品への切り替えを真剣に検討してください。

特定の問題と考えられる回避策の詳細については、 合計クエリの失敗に基づくクエリの更新 を参照してください。

0
onedaywhen