我支持使用 SQL Server 2016 后端的第三方应用程序。我们没有源代码访问权限,第三方支持响应缓慢。大多数时候,我可以通过索引和变魔术摆脱它向数据库抛出的有时可怕的查询,但在很多情况下我几乎无能为力(在时间、金钱和存储的限制下) ). 查询是错误的。
有没有办法在管理上用应用程序提交的查询替换其他查询?如果应用程序名称匹配,我正在想象对批处理执行某种正则表达式匹配。
例子:
-- 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
我设想的一些用途是避免无用的更新,其他用途是改写 where 子句以保持可搜索性。我相信还有其他场景会浮现在脑海中。
不,最接近开箱即用功能的是计划指南的功能。
目前,SQL Server 内部没有任何原生的东西可以做到这一点。
不幸的是(或幸运的是)没有内置的东西可以做到这一点。我不想给你任何想法,但你需要在应用程序和数据库服务器之间有一个中间层。此拦截应用程序需要了解 TDS(这是与 SQL Server 一起使用的协议)并允许您更改(或再次不更改)TDS 数据包以动态更改查询。
如果你做了这个,你应该卖掉它:)