Bei einigen Microsoft Access-Abfragen wird die folgende Meldung angezeigt: Der Vorgang muss eine aktualisierbare Abfrage verwenden. (Fehler 3073). Ich arbeite mit temporären Tabellen um, aber ich frage mich, ob es einen besseren Weg gibt. Alle beteiligten Tabellen haben einen Primärschlüssel. Hier ist der Code:
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;
Seit Jet 4 sind alle Abfragen, die eine Verknüpfung mit einer SQL-Anweisung haben, die Daten zusammenfasst, nicht aktualisierbar. Sie verwenden kein JOIN, aber die WHERE-Klausel entspricht genau einem Join. Daher behandelt das Jet-Abfrageoptimierungsprogramm dieselbe Verknüpfung wie ein Join.
Ich fürchte, Sie haben ohne temporäre Tabelle kein Glück, obwohl vielleicht jemand mit größeren Jet SQL-Kenntnissen eine Problemumgehung hat.
BTW, es war möglicherweise in Jet 3.5 (Access 97) aktualisierbar, da eine ganze Reihe von Abfragen aktualisierbar waren, die beim Aktualisieren auf Jet 4 nicht mehr aktualisiert werden konnten.
-
Ich hatte ein ähnliches Problem, bei dem die folgenden Abfragen nicht funktionierten.
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;
Durch die Verwendung von DLookup wurde das Problem jedoch behoben.
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;
Diese Lösung wurde ursprünglich unter https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query vorgeschlagen.
Es ist kein Fehler im Code. Der Fehler wird jedoch aus folgendem Grund ausgelöst.
- 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..?
angenommen, Sie sind in der Datenbank (MS-Access-Datei) im schreibgeschützten Ordner gespeichert. Während Sie Ihre Anwendung ausführen, wird die Verbindung nicht erzwungen. Ändern Sie daher die Dateiberechtigungen/die darin enthaltenen Ordnerberechtigungen, wie in C:\Program files
alle fast alle c Laufwerkdateien read-only gesetzt, so dass das Ändern dieser Berechtigung dieses Problem löst.
Das Problem bezieht sich definitiv auf die Verwendung von (in diesem Fall) der Funktion max (). Jede während eines Joins verwendete Aggregationsfunktion (z. B. zum Abrufen des maximalen oder minimalen oder durchschnittlichen Werts aus einer verbundenen Tabelle) verursacht den Fehler. Dasselbe gilt für die Verwendung von Unterabfragen anstelle von Verknüpfungen (wie im ursprünglichen Code).
Dies ist unglaublich ärgerlich (und ungerechtfertigt!), Da dies eine ziemlich übliche Sache ist, die man tun möchte. Ich musste auch temporäre Tabellen verwenden, um das Problem zu umgehen (ziehen Sie den aggregierten Wert mit einer Einfügeanweisung in eine temporäre Tabelle, verknüpfen Sie diese Tabelle dann mit Ihrem Update und löschen Sie die temporäre Tabelle).
Glenn
Ich weiß, meine Antwort ist 7 Jahre zu spät, aber hier ist mein Vorschlag trotzdem:
Wenn Access über eine UPDATE-Abfrage klagt, die einen JOIN enthält, speichern Sie die Abfrage einfach mit der RecordsetType
-Eigenschaft, die auf Dynaset (Inconsistent Updates)
gesetzt ist.
Manchmal kann UPDATE funktionieren.
Dies ist der Fall, wenn für die zu aktualisierenden Tabellen kein UNIQUE MS-ACCESS-Schlüssel vorhanden ist. (Unabhängig vom SQL-Schema).
Beim Erstellen von MS-Access-Links zu SQL-Tabellen werden Sie aufgefordert, den Index (Schlüssel) zur Linkzeit anzugeben. Wenn dies falsch oder überhaupt nicht geschieht, kann die Abfrage der verknüpften Tabelle nicht aktualisiert werden
Beim Verknüpfen von SQL-Tabellen mit Access MAKE SURE verwenden Sie, wenn Sie von Access zur Eingabe des Indexes (Schlüssels) aufgefordert werden, genau das, was SQL verwendet, um Probleme zu vermeiden. Die Angabe eines eindeutigen Schlüssels ist jedoch alles, was Access zur Aktualisierung der Tabelle benötigt.
Wenn Sie nicht die Person waren, die die Tabelle ursprünglich verknüpft hat, löschen Sie die verknüpfte Tabelle aus MS-ACCESS (die Verknüpfung wird nur gelöscht), und verknüpfen Sie sie erneut, indem Sie den Schlüssel richtig angeben, und alle werden ordnungsgemäß funktionieren.
Ich würde versuchen, die UPDATE-Abfrage in Access zu erstellen. Ich hatte eine UPDATE-Abfrage, die ich mir selbst geschrieben habe
UPDATE TABLE1
SET Field1 =
(SELECT Table2.Field2
FROM Table2
WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn)
Die Abfrage hat mir diesen Fehler gegeben. Dies funktionierte zwar auf meinem SQL Server, aber wie bereits in früheren Antworten erwähnt, ist die Access UPDATE-Syntax keine Standardsyntax. Wenn ich es jedoch mit dem Abfrageassistenten von Access neu erstellte (er verwendete die JOIN-Syntax), funktionierte es einwandfrei. Normalerweise würde ich nur die UPDATE-Abfrage zu einem Passthrough machen, um die Nicht-JET-Syntax zu verwenden, aber eine der Tabellen, mit denen ich mich verband, war eine lokale Access-Tabelle.
(Etwas spät zur Party ...)
Die drei Arten, wie ich dieses Problem in der Vergangenheit umgehen konnte, sind:
Meine ist mit einer einfachen INSERT-Anweisung fehlgeschlagen. Behebung durch Starten der Anwendung mit 'Als Administrator ausführen' access.
Ich hatte das gleiche Problem.
Meine Lösung ist, zuerst eine Tabelle aus der nicht aktualisierbaren Abfrage zu erstellen und dann die Aktualisierung von Tabelle zu Tabelle durchzuführen.
MS Access - Verknüpfen von Tabellen in einer Aktualisierungsabfrage ... So wird es aktualisierbar
Ich habe immer den gleichen Fehler erhalten, aber alle SQLs werden in Access sehr gut ausgeführt.
und wenn ich die Erlaubnis von AccessFile geändert habe.
das Problem behoben !!
Ich erteile dem Konto "Network Service" die vollständige Zugriffsberechtigung. Dieses Konto wird für IS
Heute in meinem MS-Access 2003 mit einer ODBC - Tabla, die auf einen SQL Server 2000 mit sa-Kennwort zeigt, gab es den gleichen Fehler.
Ich habe einen Primärschlüssel für die Tabelle in der SQL Server-Datenbank definiert, und das Problem wurde behoben.
Die Antwort von iDevlop hat für mich funktioniert. Beachten Sie, dass ich die RecordsetType-Eigenschaft in meiner Aktualisierungsabfrage nicht finden konnte. Ich konnte diese Eigenschaft jedoch finden, indem ich meine Abfrage in eine Auswahlabfrage umwandelte, diese Eigenschaft wie iDevlop feststellte und dann meine Abfrage in eine Aktualisierungsabfrage umwandelte. Dies hat funktioniert, es ist keine Temp-Tabelle erforderlich.
Ich hätte mir gewünscht, dass dies nur ein Kommentar zu dem ist, was von iDevlop veröffentlicht wurde, sodass es von seiner Lösung floss, aber ich habe nicht genug Punkte.
Es gibt hier ein anderes Szenario, das zutreffen würde. Eine Datei, die von Visual Source Safe ausgecheckt wurde, für alle, die sie noch verwenden, die weder in der Option Ansicht noch in Auschecken mit "Writeablity" versehen wurde, erhält diese Fehlermeldung.
Die Lösung besteht darin, die Datei erneut von Source Safe zu beziehen und die Einstellung für die Beschreibbarkeit anzuwenden.
Sie können den Code immer in VBA schreiben, der ähnlich aktualisiert wird. Ich hatte auch dieses Problem, und meine Problemumgehung bestand darin, eine Auswahlabfrage mit all den Verknüpfungen durchzuführen, die alle Daten enthielt, nach denen ich suchen konnte, um ein Update durchführen zu können. Dabei wurde ein Recordset erstellt und die Updateabfrage wiederholt als Updateabfrage ausgeführt Nur die Aktualisierungstabelle, nur die Kriterien, nach denen Sie suchen
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
Ich mache dies nur mit etwa 60 Datensätzen pro Tag. Es könnte einige Zeit dauern, bis ein paar Tausend Datensätze ausgeführt werden, da die Abfrage mehrmals von Anfang bis Ende ausgeführt wird, anstatt nur eine Gesamtgruppe auszuwählen und Änderungen vorzunehmen. Möglicherweise müssen Sie die Anführungszeichen für tableID angeben, da dies eine Zeichenfolge ist, aber ich bin mir ziemlich sicher, dass dies bei mir funktioniert hat.
Als ich diesen Fehler erhalten habe, liegt dies möglicherweise daran, dass meine UPDATE-Syntax falsch war, aber nachdem ich die Aktualisierungsabfrage behoben hatte, erhielt ich wieder den gleichen Fehler ... also ging ich zum ODBC Data Source Administrator
und stellte fest, dass meine Verbindung schreibgeschützt war. Nachdem ich die Verbindung schreibgeschützt und neu verbunden hatte, funktionierte das einwandfrei.
Überprüfen Sie Ihre DB (Datenbankberechtigung) und erteilen Sie die vollständige Berechtigung
Gehen Sie zum DB-Ordner-> Rechtsklick Eigenschaften-> Sicherheit-> Bearbeiten-> Geben Sie die volle Kontrolle & Startmenü -> Ausführen-> Typ "Uac" machen es runter (wenn es hoch ist)
Um weiter zu antworten, worauf DRUA in seiner/ihrer Antwort hingewiesen hat ...
Ich entwickle meine Datenbanken in Access 2007. Meine Benutzer verwenden die Access 2007-Laufzeitumgebung. Sie haben Leseberechtigungen für einen database_Front (Front-End) -Ordner und Lese-/Schreibberechtigungen für den database_Back-Ordner.
Beim Rollout einer neuen Datenbank hat der Benutzer nicht die vollständigen Anweisungen zum Kopieren des Front-End auf seinen Computer befolgt und stattdessen eine Verknüpfung erstellt. Wenn Sie das Front-End über die Verknüpfung ausführen, wird eine Bedingung erstellt, bei der die Abfrage aufgrund der Dateischreibbeschränkungen nicht aktualisierbar ist.
Das Kopieren des Frontends in den Dokumentenordner löst das Problem.
Ja, es macht die Dinge komplizierter, wenn die Benutzer eine aktualisierte Version des Front-End benötigen, aber zumindest die Abfrage funktioniert, ohne auf temporäre Tabellen und dergleichen zurückgreifen zu müssen.
Ich habe immer die gleiche Fehlermeldung erhalten, bis ich das Verbindungsfeld in beiden Verbindungstabellen zu einem eindeutigen Index gemacht habe. Erst dann wurde die Abfrage aktualisierbar.
Philip Stilianos
Während Ihr SQL absolut vernünftig erscheint, hat Jet die SQL-Standardsyntax für UPDATE
nie unterstützt. Stattdessen wird eine eigene proprietäre Syntax verwendet (die sich wiederum von der UPDATE
-Syntax von SQL Server unterscheidet), die very limitiert ist. Oft sind die einzigen Problemumgehungen "Operation muss eine aktualisierbare Abfrage verwenden" sehr schmerzhaft. Erwägen Sie ernsthaft den Wechsel zu einem leistungsfähigeren SQL-Produkt.
Weitere Informationen zu Ihren spezifischen Problemen und mögliche Problemumgehungen finden Sie unter Aktualisieren von Abfragen basierend auf Summenabfragen .