Zusammenfassung
Dies ist ein bekannter Fehler , der durch die am 12. November 2019 veröffentlichten Office-Updates verursacht wurde. Der Fehler betrifft alle Versionen von Access, die derzeit von Microsoft unterstützt werden (von Access 2010 bis 365).
Dieser Fehler wurde behoben.
- Wenn Sie eine C2R-Version (Click-to-Run) von Office verwenden, verwenden Sie "Jetzt aktualisieren " :
- Access 2010 C2R: In Build 7243.5000 behoben
- Access 2013 C2R: In Build 5197.1000 behoben
- Access 2016 C2R: In Build 12130.20390 behoben
- Zugriff 2019 (v1910): In Build 12130.20390 behoben
- Zugriff 2019 (Volumenlizenz): In Build 10353.20037 behoben
- Office 365-Monatskanal: In Build 12130.20390 behoben
- Office 365 halbjährlich: In Build 11328.20480 behoben
- Office 365 Semi-Annual Extended: In Build 10730.20422 behoben
- Office 365 Semi-Annual Targeted: In Build 11929.20494 behoben
- Wenn Sie eine MSI-Version von Office verwenden, installieren Sie das Update, das Ihrer Office-Version entspricht. Alle diese Patches wurden in Microsoft Update veröffentlicht. Daher sollte die Installation aller ausstehenden Windows-Updates ausreichen:
Beispiel
Hier ist ein minimales Repro-Beispiel:
- Erstellen Sie eine neue Access-Datenbank.
- Erstellen Sie eine neue, leere Tabelle "Table1" mit dem Standard-ID-Feld und einem Long Integer-Feld "myint".
Führen Sie den folgenden Code im Direktfenster des VBA-Editors aus:
CurrentDb.Execute "UPDATE Table1 SET myint = 1 WHERE myint = 1"
Erwartetes Ergebnis : Die Anweisung wird erfolgreich beendet.
Tatsächliches Ergebnis mit einem der installierten fehlerhaften Updates: Laufzeitfehler 3340 tritt auf ("Abfrage '' ist beschädigt").
Verwandte Links:
90150000-006E-0409-0000-0000000FF1CE
... das-0409-
ist nicht der Fall-0407-
.-006E-0409-
ebenfalls vorhanden. Auf beiden Computern ist Service Pack 1 für Microsoft Office 2013 (KB2850036) installiert.{90140000-0011-0000-0000-0000000FF1CE}
das Batch-Skript verwenden.{9014...
Nicht beachten{9114..}
Einfachste Lösung
Für meine Benutzer ist es keine Option, fast einen Monat bis zum 10. Dezember auf eine feste Version von Microsoft zu warten. Die Deinstallation des fehlerhaften Microsoft-Updates auf mehreren von der Regierung gesperrten Workstations ist ebenfalls nicht möglich.
Ich muss eine Problemumgehung anwenden, bin aber nicht gerade begeistert von den Vorschlägen von Microsoft - dem Erstellen und Ersetzen einer Abfrage für jede Tabelle.
Die Lösung besteht darin, den Tabellennamen durch einen einfachen zu ersetzen
(SELECT * FROM Table)
Abfrage direkt imUPDATE
Befehl . Dies erfordert nicht das Erstellen und Speichern einer Menge zusätzlicher Abfragen, Tabellen oder Funktionen.BEISPIEL:
Vor:
Nach:
Dies sollte in mehreren Datenbanken und Anwendungen (und späterem Rollback) viel einfacher zu implementieren sein.
quelle
Dies ist kein Windows-Update-Problem, sondern ein Problem, das mit der Veröffentlichung des November Patch Tuesday Office eingeführt wurde. Eine Änderung zur Behebung einer Sicherheitslücke führt dazu, dass einige legitime Abfragen als beschädigt gemeldet werden. Da es sich bei der Änderung um eine Sicherheitskorrektur handelt, wirkt sie sich auf ALLE Office-Builds aus, einschließlich 2010, 2013, 2016, 2019 und O365.
Der Fehler wurde in allen Kanälen behoben, aber der Zeitpunkt der Lieferung hängt davon ab, auf welchem Kanal Sie sich befinden.
Für die MSI- und 2019-Volumenlizenz-Builds 2010, 2013 und 2016 sowie den halbjährlichen O365-Kanal wird der Fix im Dezember-Patch-Dienstag-Build vom 10. Dezember enthalten sein. Für O365, Monthly Channel und Insider wird dies behoben Wenn die Oktobergabel freigegeben wird, ist dies derzeit für den 24. November geplant.
Für den halbjährlichen Kanal wurde der Fehler in 11328.20468 eingeführt, der am 12. November veröffentlicht wurde, aber nicht für alle auf einmal verfügbar ist. Wenn Sie können, möchten Sie die Aktualisierung möglicherweise bis zum 10. Dezember verschieben.
Das Problem tritt bei Aktualisierungsabfragen für eine einzelne Tabelle mit festgelegten Kriterien auf (daher sollten andere Abfragetypen nicht betroffen sein, keine Abfrage, die alle Zeilen einer Tabelle aktualisiert, oder eine Abfrage, die die Ergebnismenge einer anderen Abfrage aktualisiert). Angesichts dessen besteht die einfachste Problemumgehung in den meisten Fällen darin, die Aktualisierungsabfrage so zu ändern, dass eine andere Abfrage aktualisiert wird, die alles aus der Tabelle auswählt, anstatt die Abfrage direkt zu aktualisieren.
Dh wenn Sie eine Frage haben wie:
Erstellen Sie dann eine neue Abfrage (Query1), die wie folgt definiert ist:
und aktualisieren Sie Ihre ursprüngliche Abfrage auf:
Offizielle Seite: Zugriffsfehler: "Abfrage ist beschädigt"
quelle
Die vorübergehende Behebung dieses Problems hängt von der verwendeten Access-Version ab:
Access 2010-Deinstallationsupdate KB4484127
Access 2013-Deinstallationsupdate KB4484119
Access 2016-Deinstallationsupdate KB4484113
Access 2019, WENN ERFORDERLICH (tbc). Downgrade von Version 1808 (Build 10352.20042) auf Version 1808 (Build 10351.20054)
Office 365 ProPlus-Downgrade von Version 1910 (Build 12130.20344) auf einen früheren Build, siehe https://support.microsoft.com/en-gb/help/2770432/ Wie man zu einer früheren Version von Office 2013 oder Office 2016 zurückkehrt
quelle
Wir und unsere Kunden haben in den letzten zwei Tagen damit zu kämpfen und schließlich ein Papier geschrieben, um das Problem zusammen mit einigen Lösungen ausführlich zu erörtern: http://fmsinc.com/MicrosoftAccess/Errors/query_is_corrupt/
Es enthält unsere Erkenntnisse, dass es sich auf Access-Lösungen auswirkt, wenn Aktualisierungsabfragen für lokale Tabellen, verknüpfte Access-Tabellen und sogar verknüpfte SQL Server-Tabellen ausgeführt werden.
Dies wirkt sich auch auf Nicht-Microsoft Access-Lösungen aus, die das Access Database Engine (ACE) verwenden, um mithilfe von ADO eine Verbindung zu Access-Datenbanken herzustellen. Dazu gehören Visual Studio (WinForm) -Apps, VB6-Apps und sogar Websites, auf denen Access-Datenbanken auf Computern aktualisiert werden, auf denen Access oder Office noch nie installiert waren.
Dieser Absturz kann sich sogar auf Microsoft-Apps auswirken, die ACE verwenden, z. B. PowerBI, Power Query, SSMA usw. (nicht bestätigt), und natürlich auf andere Programme wie Excel, PowerPoint oder Word, die VBA zum Ändern von Access-Datenbanken verwenden.
Zusätzlich zur offensichtlichen Deinstallation der fehlerhaften Sicherheitsupdates bieten wir einige Optionen an, wenn eine Deinstallation aufgrund von Berechtigungen oder der Verteilung von Access-Anwendungen an externe Kunden, deren PCs außerhalb Ihrer Kontrolle liegen, nicht möglich ist. Dazu gehört das Ändern aller Update-Abfragen und das Verteilen der Access-Anwendungen mit Access 2007 (Einzelhandel oder Laufzeit), da diese Version von den Sicherheitsupdates nicht betroffen ist.
quelle
Verwenden Sie das folgende Modul, um die von Microsoft vorgeschlagene Problemumgehung automatisch zu implementieren (mithilfe einer Abfrage anstelle einer Tabelle). Sichern Sie vorsichtshalber zuerst Ihre Datenbank.
Verwenden
AddWorkaroundForCorruptedQueryIssue()
Sie diese Option, um die Problemumgehung hinzuzufügen undRemoveWorkaroundForCorruptedQueryIssue()
jederzeit zu entfernen.Sie finden den neuesten Code in meinem GitHub-Repository .
AddWorkaroundForCorruptedQueryIssue()
fügt das Suffix_Table
allen Nicht-Systemtabellen hinzu, z. B. würde die TabelleIceCreams
in umbenanntIceCreams_Table
.Außerdem wird eine neue Abfrage unter Verwendung des ursprünglichen Tabellennamens erstellt, die alle Spalten der umbenannten Tabelle auswählt. In unserem Beispiel würde die Abfrage benannt
IceCreams
und die SQL ausführenselect * from [IceCreams_Table]
.RemoveWorkaroundForCorruptedQueryIssue()
macht die umgekehrten Aktionen.Ich habe dies mit allen Arten von Tabellen getestet, einschließlich externer Nicht-MDB-Tabellen (wie SQL Server). Beachten Sie jedoch, dass die Verwendung einer Abfrage anstelle einer Tabelle in bestimmten Fällen dazu führen kann, dass nicht optimierte Abfragen für eine Backend-Datenbank ausgeführt werden, insbesondere wenn Ihre ursprünglichen Abfragen, die die Tabellen verwendet haben, entweder von schlechter Qualität oder sehr komplex sind.
(Und natürlich ist es abhängig von Ihrem Codierungsstil auch möglich, Dinge in Ihrer Anwendung zu beschädigen. Nachdem Sie überprüft haben, dass das Update im Allgemeinen für Sie funktioniert, ist es nie eine schlechte Idee, alle Ihre Objekte als Text zu exportieren und einen Suchersatz zu verwenden Magie, um sicherzustellen, dass alle Vorkommen von Tabellennamen für die Abfragen und nicht für die Tabellen ausgeführt werden.)
In meinem Fall funktioniert dieses Update weitgehend ohne Nebenwirkungen, ich nur manuell benötigt umbenennen
USysRibbons_Table
wieder zuUSysRibbons
, wie ich es als Systemtabelle nicht markiert war , als ich es in der Vergangenheit erstellt.quelle
TableDef.Attributes
und diese in meine Antwort kopieren;) und eine Rückgängig-Funktion ist eine gute Idee (aber alte und neue Namen sollten in einer Tabelle gespeichert werden, da keine Tabellen mit Suffix vor dem Umbenennen vorhanden sind). Einige andere Teile sind fehlerhaft (z. B. können Tabellen mit dem Suffix enden oder der neue Name wird bereits verwendet oder später werdenOn Error Resume Next
keine Fehler behandelt). Kennen Sie RubberduckVBA ? Dieses Add-In kann Ihren Code überprüfen und macht neben allen anderen Funktionen nette Vorschläge für Verbesserungen.Für diejenigen, die diesen Prozess über PowerShell automatisieren möchten , sind hier einige Links aufgeführt, die hilfreich sein können:
Erkennen und Entfernen der fehlerhaften Updates
Hier ist ein PowerShell-Skript verfügbar: https://www.arcath.net/2017/09/office-update-remover , das die Registrierung nach einem bestimmten Office-Update durchsucht (als KB-Nummer übergeben) und es mithilfe eines Aufrufs an entfernt
msiexec.exe
. Dieses Skript analysiert beide GUIDs aus den Registrierungsschlüsseln, um den Befehl zum Entfernen des entsprechenden Updates zu erstellen.Eine Änderung, die ich vorschlagen würde, wäre die Verwendung der
/REBOOT=REALLYSUPPRESS
unter So deinstallieren von KB4011626 und anderen Office-Updates beschriebenen (zusätzliche Referenz: https://docs.microsoft.com/en-us/windows/win32/msi/uninstalling-patches ). Die Befehlszeile, die Sie erstellen, sieht folgendermaßen aus:Der Befehl zum Ausführen des Skripts würde ungefähr so aussehen:
Verhindern Sie die Installation der Updates
Der hier empfohlene Ansatz scheint das Update zu verbergen . Natürlich kann dies manuell erfolgen, aber es gibt einige PowerShell-Skripte, die bei der Automatisierung helfen können. Dieser Link: https://www.maketecheasier.com/hide-updates-in-windows-10/ beschreibt den Prozess im Detail, aber ich werde ihn hier zusammenfassen.
Verwenden Sie den folgenden Befehl, um ein Update nach KB-Nummer auszublenden:
Hide-WUUpdate -KBArticleID KB4484127
Hoffentlich hilft dies jemand anderem da draußen.
quelle
VBA-Skript für MS-Workaround:
Es wird empfohlen, das fehlerhafte Update nach Möglichkeit zu entfernen (wenn nicht, versuchen Sie es mit meinem Code), zumindest für die MSI-Versionen. Siehe Antwort https://stackoverflow.com/a/58833831/9439330 .
Bei CTR-Versionen (Click-To-Run) müssen Sie alle Office November-Updates entfernen, was zu schwerwiegenden Sicherheitsproblemen führen kann (nicht sicher, ob kritische Korrekturen entfernt werden).
Aus @ Erics Kommentaren:
Table.Tablename
Formulare zum Binden verwenden, werden sie nicht mehr gebunden, da der frühere Tabellenname jetzt ein Abfragename ist.OpenRecordSet(FormerTableNowAQuery, dbOpenTable)
wird fehlschlagen (da es jetzt eine Abfrage ist, keine Tabelle mehr)Vorsicht! Nur schnell gegen Northwind.accdb auf Office 2013 x86 CTR getestet Keine Garantie!
Zum Prüfen:
quelle
Inventory to reorder Subform for Home
ohne ProblemeInventory
inHome
Form an eine Tabelle . Auch ist es nicht empfehlenswert, Formulare an Abfragen anstatt an Tabellen zu binden (ist das nicht an Tabellen gebunden wieSelect * From table
?).Table.TableName
Notation. Wenn Sie tunSELECT * FROM TableName
stattdessen , geht es Ihnen natürlich gut. Wenn Sie jedoch verwendenTable.TableName
, wird Ihr Unterformular ungebunden, wenn Sie die Tabelle umbenennen.TableDefs!MyTableName.OpenRecordset(dbOpenTable)
(Unterstützung der Indexsuche), den ich auch tendenziell benutze und der auch Fehler bei Ihrem Ansatz verursachen wirdIch habe das
currentDb.Execute
undDocmd.RunSQL
durch eine Hilfsfunktion ersetzt. Dadurch kann die SQL-Anweisung vorverarbeitet und geändert werden, wenn eine Aktualisierungsanweisung nur eine Tabelle enthält. Ich habe bereits einedual
Tabelle (einzeilig, einspaltig), also habe ich mich für eine fakeTable-Option entschieden.Hinweis : Dadurch werden Ihre Abfrageobjekte nicht geändert. Es werden nur SQL-Ausführungen über VBA unterstützt.
If you would like to change your query objects, use FnQueryReplaceSingleTableUpdateStatements and update your sql in each of your querydefs. Shouldn't be a problem either.
Dies ist nur ein Konzept
(If it's a single table update modify the sql before execution)
. Passen Sie es Ihren Bedürfnissen an. Diese Methode erstellt keine Ersatzabfragen für jede Tabelle (was der einfachste Weg ist, aber seine eigenen Nachteile hat, dh Leistungsprobleme).+ Punkte: Sie können diesen Helfer auch dann weiter verwenden, wenn MS den Fehler behoben hat. Er ändert nichts. Falls die Zukunft ein anderes Problem mit sich bringt, sind
pre-process
Sie an einem Ort bereit für Ihre SQL. Ich habe mich nicht für die Deinstallation der Update- Methode entschieden, da hierfür der Administratorzugriff erforderlich ist. + Es wird zu lange dauern, bis alle Benutzer die richtige Version erhalten. + Selbst wenn Sie deinstallieren, installiert die Gruppenrichtlinie einiger Endbenutzer das neueste Update erneut. Sie sind wieder beim gleichen Problem.Wenn Sie Zugriff auf den Quellcode haben
use this method
und zu 100% sicher sind, dass kein Endbenutzer das Problem hat.Jetzt nur noch CTRL+F
Suchen und ersetzen
docmd.RunSQL
durchhelper.Execute
Suchen und ersetzen
[currentdb|dbengine|or your dbobject].execute
durchhelper.execute
habe Spaß!
quelle
Ok, ich melde mich auch hier, denn obwohl dieser Fehler behoben wurde, muss dieser Fix noch vollständig in verschiedenen Unternehmen ausgefüllt werden, in denen die Endbenutzer möglicherweise keine Updates durchführen können (wie bei meinem Arbeitgeber ...).
Hier ist meine Problemumgehung für
DoCmd.RunSQL "UPDATE users SET uname= 'bob' WHERE usercode=1"
. Kommentieren Sie einfach die beleidigende Abfrage aus und geben Sie den folgenden Code ein.Ich kann nicht sagen, dass es hübsch ist, aber es erledigt den Job.
quelle