Sumário
Este é um bug conhecido causado pelas atualizações do Office lançadas em 12 de novembro de 2019. O bug afeta todas as versões do Access atualmente suportadas pela Microsoft (do Access 2010 ao 365).
Este bug foi corrigido.
- Se você usa uma versão C2R (Clique para Executar) do Office, use "Atualizar agora" :
- Access 2010 C2R: corrigido na compilação 7243.5000
- Access 2013 C2R: corrigido na compilação 5197.1000
- Access 2016 C2R: corrigido na compilação 12130.20390
- Access 2019 (v1910): corrigido na compilação 12130.20390
- Access 2019 (Volume License): Corrigido na compilação 10353.20037
- Canal mensal do Office 365: corrigido na compilação 12130.20390
- Office 365 Semestral: Corrigido na Compilação 11328.20480
- Extensão semestral do Office 365: corrigida na compilação 10730.20422
- Segmentação semestral do Office 365: corrigida na compilação 11929.20494
- Se você usar uma versão MSI do Office, instale a atualização correspondente à sua versão do Office. Todos esses patches foram lançados no Microsoft Update; portanto, a instalação de todas as atualizações pendentes do Windows deve ser suficiente:
Exemplo
Aqui está um exemplo mínimo de reprodução:
- Crie um novo banco de dados do Access.
- Crie uma nova tabela vazia "Table1" com o campo de identificação padrão e um campo Inteiro Longo "myint".
Execute o seguinte código na janela Imediata do editor VBA:
CurrentDb.Execute "UPDATE Table1 SET myint = 1 WHERE myint = 1"
Resultado esperado : a instrução é concluída com êxito.
Resultado real com uma das atualizações de bugs instaladas: Ocorre um erro de tempo de execução 3340 ("Consulta '' está corrompida").
Links Relacionados:
90150000-006E-0409-0000-0000000FF1CE
...-0409-
não é-0407-
.-006E-0409-
também. Ambas as máquinas têm o Service Pack 1 para Microsoft Office 2013 (KB2850036) instalado.{90140000-0011-0000-0000-0000000FF1CE}
o script em lote. Nota{9014...
não{9114..}
Solução mais simples
Para meus usuários, aguardar quase um mês até 10 de dezembro por uma liberação de correção da Microsoft não é uma opção. Tampouco desinstalar a atualização ofensiva da Microsoft em várias estações de trabalho bloqueadas pelo governo.
Preciso aplicar uma solução alternativa, mas não estou exatamente empolgado com o que a Microsoft sugeriu - criando e substituindo uma consulta para cada tabela.
A solução é substituir o nome da tabela por uma
(SELECT * FROM Table)
consulta simples diretamente noUPDATE
comando Isso não requer a criação e o salvamento de várias consultas, tabelas ou funções adicionais.EXEMPLO:
Antes:
Depois de:
Isso deve ser muito mais fácil de implementar em vários bancos de dados e aplicativos (e reversão posterior).
fonte
Este não é um problema de atualização do Windows, mas um problema que foi introduzido com a versão de terça-feira do Patch Patch de novembro. Uma alteração para corrigir uma vulnerabilidade de segurança faz com que algumas consultas legítimas sejam relatadas como corrompidas. Como a mudança foi uma correção de segurança, ela afeta TODAS as compilações do Office, incluindo 2010, 2013, 2016, 2019 e O365.
O bug foi corrigido em todos os canais, mas o tempo de entrega dependerá do canal em que você estiver.
Para compilações de licenças de volume de 2010, 2013 e 2016 MSI e 2019 e o canal semestral da O365, a correção será na compilação de terça-feira de patch de dezembro, 10 de dezembro. Para O365, canal mensal e insiders, isso será corrigido quando o garfo de outubro for lançado, atualmente planejado para 24 de novembro.
Para o canal semestral, o bug foi introduzido em 11328.20468, lançado em 12 de novembro, mas não é lançado para todos de uma vez. Se puder, você pode adiar a atualização até 10 de dezembro.
O problema ocorre para consultas de atualização em uma única tabela com um critério especificado (portanto, outros tipos de consulta não devem ser afetados, nem qualquer consulta que atualize todas as linhas de uma tabela, nem uma consulta que atualize o conjunto de resultados de outra consulta). Dado isso, a solução mais simples na maioria dos casos é alterar a consulta de atualização para atualizar outra consulta que seleciona tudo da tabela, em vez de atualizar a consulta diretamente.
Ou seja, se você tiver uma consulta como:
Em seguida, crie uma nova consulta (Consulta1) definida como:
e atualize sua consulta original para:
Página oficial: Erro de acesso: "A consulta está corrompida"
fonte
Para resolver temporariamente esse problema, depende da versão do Access em uso:
Atualização de desinstalação do Access 2010 KB4484127 Atualização de desinstalação do
Access 2013 KB4484119 Atualização de desinstalação do
Access 2016 KB4484113 Atualização de desinstalação do KB4484113
Access 2019 SE NECESSÁRIO (tbc). Fazer o downgrade da versão 1808 (compilação 10352.20042) para a versão 1808 (compilação 10351.20054) O
Office 365 ProPlus Downgrade da versão 1910 (compilação 12130.20344) para uma compilação anterior, consulte https://support.microsoft.com/en-gb/help/2770432/ como reverter para uma versão anterior do office-2013-or-office-2016-clic
fonte
Nós e nossos clientes lutamos com isso nos últimos dois dias e finalmente escrevemos um artigo para discutir o problema em detalhes, juntamente com algumas soluções: http://fmsinc.com/MicrosoftAccess/Errors/query_is_corrupt/
Ele inclui nossas descobertas de que afeta as soluções do Access ao executar consultas de atualização em tabelas locais, tabelas do Access vinculadas e até tabelas do SQL Server vinculadas.
Ele também afeta as soluções que não são do Microsoft Access usando o ACE (Access Database Engine) para conectar-se aos bancos de dados do Access usando o ADO. Isso inclui aplicativos do Visual Studio (WinForm), aplicativos VB6 e até sites que atualizam bancos de dados do Access em máquinas que nunca tiveram o Access ou o Office instalado.
Essa falha pode até afetar aplicativos da Microsoft que usam ACE como PowerBI, Power Query, SSMA etc. (não confirmado) e, é claro, outros programas como Excel, PowerPoint ou Word usando o VBA para modificar os bancos de dados do Access.
Além da desinstalação óbvia das Atualizações de Segurança ofensivas, também incluímos algumas opções quando não é possível desinstalar devido a permissões ou distribuição de aplicativos do Access a clientes externos cujos PCs estão fora de seu controle. Isso inclui alterar todas as consultas de atualização e distribuir os aplicativos do Access usando o Access 2007 (varejo ou tempo de execução), pois essa versão não é afetada pelas atualizações de segurança.
fonte
Use o módulo a seguir para implementar automaticamente a solução alternativa sugerida pela Microsoft (usando uma consulta em vez de uma tabela). Como precaução, faça backup do seu banco de dados primeiro.
Use
AddWorkaroundForCorruptedQueryIssue()
para adicionar a solução alternativa eRemoveWorkaroundForCorruptedQueryIssue()
removê-la a qualquer momento.Você pode encontrar o código mais recente no meu repositório GitHub .
AddWorkaroundForCorruptedQueryIssue()
adicionará o sufixo_Table
a todas as tabelas que não são do sistema, por exemplo, a tabelaIceCreams
seria renomeada paraIceCreams_Table
.Também criará uma nova consulta usando o nome da tabela original, que selecionará todas as colunas da tabela renomeada. No nosso exemplo, a consulta seria nomeada
IceCreams
e executaria o SQLselect * from [IceCreams_Table]
.RemoveWorkaroundForCorruptedQueryIssue()
faz as ações inversas.Eu testei isso com todos os tipos de tabelas, incluindo tabelas externas não MDB (como o SQL Server). Mas lembre-se de que o uso de uma consulta em vez de uma tabela pode levar à execução de consultas não otimizadas em um banco de dados back-end em casos específicos, especialmente se as consultas originais que usaram as tabelas forem de baixa qualidade ou muito complexas.
(E, é claro, dependendo do seu estilo de codificação, também é possível quebrar as coisas em seu aplicativo. Portanto, depois de verificar se a correção geralmente funciona para você, nunca é uma má idéia exportar todos os seus objetos como texto e usar algumas opções de substituição de localização mágica para garantir que quaisquer ocorrências de nomes de tabelas sejam executadas nas consultas e não nas tabelas.)
No meu caso, essa correção funciona em grande parte sem quaisquer efeitos colaterais, eu só precisava para mudar o nome manualmente
USysRibbons_Table
de volta paraUSysRibbons
, como eu não tinha marcado como uma tabela do sistema quando eu criei no passado.fonte
TableDef.Attributes
e copiá-la para minha resposta;) e uma função desfazer é uma boa idéia (mas o nome antigo e o novo devem ser armazenados em uma tabela, dependendo de nenhuma tabela com sufixo antes da renomeação). Algumas outras partes estão com defeito (por exemplo, tabelas podem terminar com o sufixo ou newname já está em uso ouOn Error Resume Next
sem manipular erros posteriormente). Você conhece RubberduckVBA ? Este suplemento pode inspecionar seu código e fazer boas sugestões de melhoria, além de todos os outros recursos.Para aqueles que desejam automatizar esse processo via PowerShell , aqui estão alguns links que achei úteis:
Detectar e remover as atualizações incorretas
Há um script do PowerShell disponível aqui https://www.arcath.net/2017/09/office-update-remover que pesquisa no registro uma atualização específica do Office (transmitida como um número de kb) e a remove usando uma chamada para
msiexec.exe
. Esse script analisa os dois GUIDs das chaves do Registro para criar o comando e remover a atualização apropriada.Uma alteração que eu sugeriria seria usar o
/REBOOT=REALLYSUPPRESS
descrito em Como desinstalar o KB4011626 e outras atualizações do Office (referência adicional: https://docs.microsoft.com/en-us/windows/win32/msi/uninstalling-patches ). A linha de comando que você está construindo tem a seguinte aparência:O comando para executar o script seria algo como isto:
Impedir a instalação das atualizações
A abordagem recomendada aqui parece estar ocultando a atualização . Obviamente, isso pode ser feito manualmente, mas existem alguns scripts do PowerShell que podem ajudar na automação. Esse link: https://www.maketecheasier.com/hide-updates-in-windows-10/ descreve o processo em detalhes, mas vou resumir aqui.
Use o seguinte comando para ocultar uma atualização pelo número de KB:
Hide-WUUpdate -KBArticleID KB4484127
Espero que isso ajude alguém mais por aí.
fonte
Script VBA para solução alternativa do MS:
É recomendável remover a atualização de buggy, se possível (se não tentar o meu código), pelo menos para as versões MSI. Consulte a resposta https://stackoverflow.com/a/58833831/9439330 .
Nas versões CTR (clique para executar), é necessário remover todas as atualizações do Office November, o que pode causar sérios problemas de segurança (não tenho certeza se alguma correção crítica seria removida).
Dos comentários de @ Eric:
Table.Tablename
para vincular formulários, eles serão desvinculados, pois o nome da tabela anterior agora é um nome de consulta !.OpenRecordSet(FormerTableNowAQuery, dbOpenTable)
falhará (já que é uma consulta agora, não uma tabela)Cuidado! Testado rapidamente contra Northwind.accdb no Office 2013 x86 CTR Sem garantia!
Para teste:
fonte
Inventory to reorder Subform for Home
àInventory
tabela emHome
forma, sem problemas. Mesmo não é recomendado vincular formulários a consultas em vez de tabelas (não é vinculativo a tabelas comoSelect * From table
?).Table.TableName
notação. Se você fizer issoSELECT * FROM TableName
, é claro que está bem. Mas se você usarTable.TableName
, seu subformulário se tornará independente se você renomear a tabela.TableDefs!MyTableName.OpenRecordset(dbOpenTable)
, embora (suporte do índice de busca), que também tendem a usar e também irá causar erros com a sua abordagemSubstituí a função
currentDb.Execute
eDocmd.RunSQL
por uma função auxiliar. Isso pode pré-processar e alterar a instrução SQL se alguma instrução de atualização contiver apenas uma tabela. Eu já tenho umadual
tabela (linha única, coluna única), então fui com a opção fakeTable.Nota : Isso não altera seus objetos de consulta. Isso ajudará apenas as execuções SQL via 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.
Este é apenas um conceito
(If it's a single table update modify the sql before execution)
. Adapte-o conforme suas necessidades. Este método não cria consultas de substituição para cada tabela (que pode ser a maneira mais fácil, mas tem suas próprias desvantagens. Por exemplo, problemas de desempenho)+ Pontos: Você pode continuar usando esse auxiliar, mesmo após a correção do bug pela Microsoft, ele não mudará nada. Caso o futuro traga outro problema, você estará pronto para o
pre-process
seu SQL em um só lugar. Não fui para desinstalar o método de atualizações porque isso exige que o acesso do administrador demore muito para obter todos na versão correta, mesmo que você desinstale, a política de grupo de alguns usuários finais instala a atualização mais recente novamente. Você voltou ao mesmo problema.Se você tiver acesso ao código-fonte
use this method
e tiver 100% de certeza de que nenhum usuário final está tendo o problema.Agora apenas CTRL+F
Pesquise e substitua
docmd.RunSQL
porhelper.Execute
Pesquise e substitua
[currentdb|dbengine|or your dbobject].execute
porhelper.execute
diverta-se!
fonte
Ok, também vou comentar aqui, porque, embora esse bug tenha sido corrigido, essa correção ainda não foi preenchida por várias empresas nas quais os usuários finais podem não ser capazes de atualizar (como meu empregador ...)
Aqui está minha solução alternativa
DoCmd.RunSQL "UPDATE users SET uname= 'bob' WHERE usercode=1"
. Basta comentar a consulta incorreta e soltar o código abaixo.Não posso dizer que é bonito, mas faz o trabalho.
fonte