SQL Server 2012 关键字覆盖



一个我已经知道没有漂亮答案的问题。

我有一个无法更改的第三方应用程序。该应用程序的数据库已从MS Access转换为SQL Server 2012。该程序与 ODBC 连接,不关心后端。它发送非常简单的SQL,似乎也可以在SQL Server上运行良好。

但是,一个名为"PLAN"的表存在问题,我已经知道它是SQL Server关键字。

我知道您通常会访问带有方括号的此类表,但由于我无法更改 SQL,我想知道是否有任何"丑陋"的黑客可以覆盖关键字或动态转换 SQL。

您可以尝试使用十六进制编辑器编辑第三方应用程序。如果您找到字符串 PLAN,请将其编辑为 PPAN 之类的内容,然后重命名表、视图等。如果你抓住了所有,它可能会起作用。但是,这当然是一件丑陋的事情。

恐怕

你搞砸了。 我唯一可以建议的其他方法是

  1. 在网络数据包到达SQL Server之前拦截网络数据包,这显然非常复杂。 请参阅 https://reverseengineering.stackexchange.com/questions/1617/server-side-query-interception-with-ms-sql-server,特别是回答 https://reverseengineering.stackexchange.com/a/1816

  2. 反编译程序以更改它,例如,如果是Java或.Net应用程序。

我怀疑你被灌输了。你可以

  • 将第三方应用连接到使用链接表的填充程序 MS Access 数据库,其中 Access 表只不过是基础 SQL Server 表的传递。您要做的是:

    • 更改 SQL Server 架构中违规的列名称。
    • 在 Access 中创建链接表
    • 在访问权限中创建一组视图/查询,该视图/查询具有与第三方应用所需的相同架构。


    完成此操作后,第三方应用程序应该能够像往常一样说"访问SQL"。Access 负责 T-SQL 的"转换"。生活是美好的。我怀疑你会受到一些性能影响,因为你通过 Access 代理所有内容,但我认为它不会很大。

    这将是我的首选解决方案。

  • 另一种选择是编写一个"填充码"DLL,该 DLL 实现 ODBC API,并简单地包装对真正 ODBC 驱动程序的实际调用。然后捕获请求并根据需要在调用包装的 DLL 方法之前对其进行改进。棘手的部分是,您的第三方应用程序可能会按序号位置跟踪列,或者可能按列名跟踪它们。或混合。这意味着您可能需要在返回时转换列名称,这可能比看起来更困难。

最新更新