Resumen
Este es un error conocido causado por las actualizaciones de Office lanzadas el 12 de noviembre de 2019. El error afecta a todas las versiones de Access actualmente compatibles con Microsoft (desde Access 2010 hasta 365).
Este error se ha corregido.
- Si usa una versión C2R (Hacer clic y ejecutar) de Office, use "Actualizar ahora" :
- Access 2010 C2R: corregido en Build 7243.5000
- Access 2013 C2R: corregido en Build 5197.1000
- Access 2016 C2R: corregido en Build 12130.20390
- Acceso 2019 (v1910): corregido en la compilación 12130.20390
- Access 2019 (Licencia por volumen): corregido en Build 10353.20037
- Canal mensual de Office 365: corregido en la compilación 12130.20390
- Office 365 semestral: corregido en la compilación 11328.20480
- Office 365 semestral extendido: corregido en Build 10730.20422
- Office 365 semestral dirigido: corregido en la compilación 11929.20494
- Si usa una versión MSI de Office, instale la actualización que coincida con su versión de Office. Todos estos parches se han lanzado en Microsoft Update, por lo que debería ser suficiente instalar todas las actualizaciones de Windows pendientes :
Ejemplo
Aquí hay un ejemplo de reproducción mínima:
- Cree una nueva base de datos de Access.
- Cree una nueva tabla vacía "Tabla1" con el campo ID predeterminado y un campo Entero largo "myint".
Ejecute el siguiente código en la ventana Inmediato del editor de VBA:
CurrentDb.Execute "UPDATE Table1 SET myint = 1 WHERE myint = 1"
Resultado esperado : la declaración finaliza correctamente.
Resultado real con una de las actualizaciones de errores instaladas: se produce el error 3340 en tiempo de ejecución ("La consulta 'está dañada").
Enlaces relacionados:
90150000-006E-0409-0000-0000000FF1CE
... eso-0409-
no-0407-
.-006E-0409-
también. Ambas máquinas tienen instalado el Service Pack 1 para Microsoft Office 2013 (KB2850036).{90140000-0011-0000-0000-0000000FF1CE}
en el script por lotes. Nota{9014...
no{9114..}
La solución más simple
Para mis usuarios, esperar casi un mes hasta el 10 de diciembre para una versión de reparación de Microsoft no es una opción. Tampoco está desinstalando la actualización ofensiva de Microsoft en varias estaciones de trabajo bloqueadas por el gobierno.
Necesito aplicar una solución alternativa, pero no estoy exactamente entusiasmado con lo que sugirió Microsoft: crear y sustituir una consulta para cada tabla.
La solución es reemplazar el nombre de la tabla con una
(SELECT * FROM Table)
consulta simple directamente en elUPDATE
comando. Esto no requiere crear y guardar un montón de consultas, tablas o funciones adicionales.EJEMPLO:
Antes de:
Después:
Eso debería ser mucho más fácil de implementar en varias bases de datos y aplicaciones (y en una reversión posterior).
fuente
Este no es un problema de actualización de Windows, sino un problema que se introdujo con la versión de noviembre de Patch Tuesday Office. Un cambio para corregir una vulnerabilidad de seguridad hace que algunas consultas legítimas se denuncien como corruptas. Debido a que el cambio fue una solución de seguridad, afecta TODAS las compilaciones de Office, incluidas 2010, 2013, 2016, 2019 y O365.
El error se ha corregido en todos los canales, pero el momento de la entrega dependerá de en qué canal se encuentre.
Para 2010, 2013 y 2016 MSI, y las compilaciones de licencias por volumen de 2019, y el canal semestral O365, la corrección se realizará en la versión Martes de parche de diciembre, 10 de diciembre. Para O365, Canal mensual e Insiders, esto se solucionará cuando se lanza la bifurcación de octubre, actualmente planificada para el 24 de noviembre.
Para el canal semianual, el error se introdujo en 11328.20468, que se lanzó el 12 de noviembre, pero no se implementa a todos a la vez. Si puede, es posible que desee retrasar la actualización hasta el 10 de diciembre.
El problema ocurre para las consultas de actualización en una sola tabla con un criterio especificado (por lo que otros tipos de consultas no deberían verse afectados, ni ninguna consulta que actualice todas las filas de una tabla, ni una consulta que actualice el conjunto de resultados de otra consulta). Dado eso, la solución más simple en la mayoría de los casos es cambiar la consulta de actualización para actualizar otra consulta que seleccione todo de la tabla, en lugar de actualizar la consulta directamente.
Es decir, si tiene una consulta como:
Luego, cree una nueva consulta (Consulta1) definida como:
y actualice su consulta original a:
Página oficial: Error de acceso: "La consulta está dañada"
fuente
Para resolver este problema temporalmente depende de la versión de Access en uso:
Access 2010 Desinstalar la actualización KB4484127
Access 2013 Desinstalar la actualización KB4484119
Access 2016 Desinstalar la actualización KB4484113
Access 2019 SI SE REQUIERE (por confirmar). Descenso de la versión 1808 (compilación 10352.20042) a la versión 1808 (compilación 10351.20054)
Office 365 ProPlus Descenso de la versión 1910 (compilación 12130.20344) a una compilación anterior, consulte https://support.microsoft.com/en-gb/help/2770432/ cómo-revertir-a-una-versión-anterior-de-office-2013-u-office-2016-clic
fuente
Nosotros y nuestros clientes hemos tenido problemas con esto en los últimos dos días y finalmente escribimos un documento para discutir el problema en detalle junto con algunas soluciones: http://fmsinc.com/MicrosoftAccess/Errors/query_is_corrupt/
Incluye nuestros hallazgos de que impacta las soluciones de Access cuando se ejecutan consultas de actualización en tablas locales, tablas de acceso vinculadas e incluso tablas vinculadas de SQL Server.
También afecta a las soluciones que no son de Microsoft Access que utilizan el Motor de base de datos de acceso (ACE) para conectarse a las bases de datos de Access mediante ADO. Eso incluye aplicaciones de Visual Studio (WinForm), aplicaciones VB6 e incluso sitios web que actualizan bases de datos de Access en máquinas que nunca tenían Access u Office instaladas en ellas.
Este bloqueo incluso puede afectar las aplicaciones de Microsoft que usan ACE como PowerBI, Power Query, SSMA, etc. (no confirmado) y, por supuesto, otros programas como Excel, PowerPoint o Word que usan VBA para modificar bases de datos de Access.
Además de la obvia desinstalación de las Actualizaciones de seguridad ofensivas, también incluimos algunas opciones cuando no es posible desinstalar debido a permisos o distribución de aplicaciones de Access a clientes externos cuyas PC están fuera de su control. Eso incluye cambiar todas las consultas de Actualización y distribuir las aplicaciones de Access usando Access 2007 (minorista o en tiempo de ejecución) ya que esa versión no se ve afectada por las actualizaciones de seguridad.
fuente
Use el siguiente módulo para implementar automáticamente la solución sugerida de Microsofts (usando una consulta en lugar de una tabla). Como precaución, primero haga una copia de seguridad de su base de datos.
Use
AddWorkaroundForCorruptedQueryIssue()
para agregar la solución alternativa yRemoveWorkaroundForCorruptedQueryIssue()
para eliminarla en cualquier momento.Puede encontrar el último código en mi repositorio de GitHub .
AddWorkaroundForCorruptedQueryIssue()
agregará el sufijo_Table
a todas las tablas que no sean del sistema, por ejemplo, la tablaIceCreams
se renombrará aIceCreams_Table
.También creará una nueva consulta con el nombre de la tabla original, que seleccionará todas las columnas de la tabla renombrada. En nuestro ejemplo, la consulta se nombraría
IceCreams
y ejecutaría el SQLselect * from [IceCreams_Table]
.RemoveWorkaroundForCorruptedQueryIssue()
hace las acciones inversas.Probé esto con todo tipo de tablas, incluidas las tablas externas que no son MDB (como SQL Server). Pero tenga en cuenta que el uso de una consulta en lugar de una tabla puede conducir a consultas no optimizadas que se ejecutan en una base de datos de back-end en casos específicos, especialmente si sus consultas originales que utilizaron las tablas son de baja calidad o muy complejas.
(Y, por supuesto, dependiendo de su estilo de codificación, también es posible romper cosas en su aplicación. Entonces, después de verificar que la solución generalmente funciona para usted, nunca es una mala idea exportar todos sus objetos como texto y usar algunos reemplazos de búsqueda magia para garantizar que cualquier aparición de nombres de tablas se ejecute en las consultas y no en las tablas).
En mi caso, esta solución funciona en gran medida, sin efectos secundarios, sólo tenía que cambiar manualmente el nombre
USysRibbons_Table
de nuevo aUSysRibbons
, ya que no había marcado como una tabla del sistema cuando creé que en el pasado.fuente
TableDef.Attributes
y copie eso en mi respuesta;) y una función de deshacer es una buena idea (pero el nombre antiguo y el nuevo deben almacenarse en una tabla, ya que no dependen de tablas con sufijo antes del cambio de nombre). Algunas otras partes están defectuosas (por ejemplo, las tablas pueden terminar con el sufijo o newname ya está en uso oOn Error Resume Next
sin errores de manejo más adelante). ¿Conoces RubberduckVBA ? Este complemento puede inspeccionar su código y hace buenas sugerencias para mejorar, además de todas las otras características.Para aquellos que buscan automatizar este proceso a través de PowerShell , aquí hay algunos enlaces que encontré que pueden ser útiles:
Detectar y eliminar las actualizaciones ofensivas
Hay una secuencia de comandos de PowerShell disponible aquí https://www.arcath.net/2017/09/office-update-remover que busca en el registro una actualización específica de Office (pasada como un número kb) y la elimina mediante una llamada a
msiexec.exe
. Este script analiza los dos GUID de las claves del registro para generar el comando para eliminar la actualización adecuada.Un cambio que sugeriría sería usar el
/REBOOT=REALLYSUPPRESS
que se describe en Cómo desinstalar KB4011626 y otras actualizaciones de Office (Referencia adicional: https://docs.microsoft.com/en-us/windows/win32/msi/uninstalling-patches ). La línea de comando que está creando se ve así:El comando para ejecutar el script se vería así:
Evitar que se instalen las actualizaciones
El enfoque recomendado aquí parece estar ocultando la actualización . Obviamente, esto se puede hacer manualmente, pero hay algunos scripts de PowerShell que pueden ayudar con la automatización. Este enlace: https://www.maketecheasier.com/hide-updates-in-windows-10/ describe el proceso en detalle, pero lo resumiré aquí.
Use el siguiente comando para ocultar una actualización por número KB:
Hide-WUUpdate -KBArticleID KB4484127
Esperemos que esto sea de ayuda para alguien más.
fuente
VBA-Script para MS-Solución:
Se recomienda eliminar la actualización con errores, si es posible (si no prueba mi código), al menos para las versiones de MSI. Consulte la respuesta https://stackoverflow.com/a/58833831/9439330 .
Para las versiones CTR (Hacer clic y ejecutar), debe eliminar todas las actualizaciones de noviembre de Office, lo que puede causar serios problemas de seguridad (no estoy seguro de si se eliminarán las correcciones críticas).
De los comentarios de @ Eric:
Table.Tablename
para vincular formularios, se desvinculan ya que el antiguo nombre de tabla ahora es un nombre de consulta.OpenRecordSet(FormerTableNowAQuery, dbOpenTable)
fallará (ya que ahora es una consulta, ya no es una tabla)¡Precaución! Simplemente probado rápidamente en Northwind.accdb en Office 2013 x86 CTR ¡ Sin garantía!
Para las pruebas:
fuente
Inventory to reorder Subform for Home
a laInventory
tabla enHome
forma, sin problemas. Incluso no se recomienda vincular formularios a consultas en lugar de tablas (¿no se vincula a una tabla comoSelect * From table
?).Table.TableName
notación. Si lo hacesSELECT * FROM TableName
, por supuesto que estás bien. Pero si lo usaTable.TableName
, su subformulario se desatará si cambia el nombre de la tabla.TableDefs!MyTableName.OpenRecordset(dbOpenTable)
embargo, hay una ventaja sustancial de (soporte de búsqueda de índice), que también tiendo a usar y también causará errores con su enfoqueReemplacé el
currentDb.Execute
yDocmd.RunSQL
con una función auxiliar. Eso puede preprocesar y cambiar la instrucción SQL si cualquier instrucción de actualización contiene solo una tabla. Ya tengo unadual
tabla ( una sola fila, una sola columna), así que elegí una opción de tabla falsa.Nota : Esto no cambiará sus objetos de consulta. Solo ayudará a las ejecuciones de SQL a través de VBA.
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.
Esto es solo un concepto
(If it's a single table update modify the sql before execution)
. Adaptarlo según sus necesidades. Este método no crea consultas de reemplazo para cada tabla (que puede ser la forma más fácil pero tiene sus propios inconvenientes, es decir, problemas de rendimiento)+ Puntos: puede seguir utilizando este ayudante incluso después de que MS solucione el error, no cambiará nada. En caso de que el futuro traiga otro problema, está listo para
pre-process
su SQL en un solo lugar. No elegí el método de desinstalación porque eso requiere acceso de administrador + va a tomar demasiado tiempo para que todos tengan la versión correcta + incluso si desinstalas, la política de grupo de algunos usuarios finales instala la última actualización nuevamente. Has vuelto al mismo problema.Si tiene acceso al código fuente
use this method
y está 100% seguro de que ningún usuario final tiene el problema.Ahora solo CTRL+F
Buscar y reemplazar
docmd.RunSQL
conhelper.Execute
Buscar y reemplazar
[currentdb|dbengine|or your dbobject].execute
conhelper.execute
¡que te diviertas!
fuente
Ok, también intervenir aquí, porque a pesar de que este error se ha solucionado, esa solución aún no se ha completado por completo a través de varias empresas en las que los usuarios finales no pueden actualizar (como mi empleador ...)
Aquí está mi solución para
DoCmd.RunSQL "UPDATE users SET uname= 'bob' WHERE usercode=1"
. Simplemente comente la consulta ofensiva y coloque el código a continuación.No puedo decir que sea bonito, pero hace el trabajo.
fuente