Estou dando suporte a um aplicativo de terceiros que usa um back-end do SQL Server 2016. Não temos acesso ao código-fonte e o suporte de terceiros demora a responder. Na maioria das vezes, posso indexar e fazer mágica para sair das consultas às vezes terríveis que ele lança no banco de dados, mas houve várias ocasiões em que não há literalmente nada que eu possa fazer (dentro de restrições de tempo, dinheiro e armazenamento ). A consulta está simplesmente errada .
Existe alguma forma de substituir administrativamente as consultas apresentadas pelo aplicativo por outras? Estou imaginando algum tipo de correspondência de regex executada no lote se o nome do aplicativo corresponder.
Exemplo:
-- Submitted by application
update Table set IsBilled = 0 where ID = '{EFD5F13C-6123-4913-B530-8941FC71B969}'
-- What I want the query to be (to avoid spurious updates to Table)
-- (Table is large, and the application is submitting this query on every page view)
update Table set IsBilled = 0 where ID = '{EFD5F13C-6123-4913-B530-8941FC71B969}' and IsBilled = 1
-- Proposed regex
-- Match
update Table set IsBilled = 0 where ID = '(\{[A-F0-9\-]+\})'
-- Replace
update Table set IsBilled = 0 where ID = '$1' and IsBilled = 1
Alguns dos meus usos concebidos seriam para evitar atualizações inúteis, outros seriam para reformular cláusulas where para manter a sargabilidade. Tenho certeza de que existem outros cenários que me vêm à mente.
Não, o mais próximo que você terá com a funcionalidade pronta para uso é o que um guia de plano pode fazer.
Nada nativo dentro do SQL Server pode fazer isso, atualmente.
Infelizmente (ou felizmente) não há nada embutido para fazer isso. Não quero dar nenhuma ideia, mas você precisaria ter uma camada intermediária entre o aplicativo e o servidor de banco de dados. Esse aplicativo de interceptação precisaria entender o TDS (que é o protocolo usado com o SQL Server) e permitir que você fizesse alterações (ou, novamente, não) nos pacotes TDS para alterar as consultas em tempo real.
Se você fez isso, você deve vendê-lo :)