我有一个应用程序的想法,但理想情况下,它将依赖于能够为 MSSQL 编写一种“sql 重写”引擎(与 HTTP 服务器可以拥有“URL 重写”模块的方式非常相似),它可以在服务器处理 sql 语句之前将其相交并首先运行其他代码。
使用 MSSQL 是否可行,或者我是否需要寻求其他方法来实现我的目标?
答案1
问题不是“如何”进行重写,而是“在哪里”进行重写。您说您希望在 IIS 中实现类似的东西,但这在 MSSQL 中是不可能的。在 IIS 中,您有请求处理管道,并且有很多点可以将自定义代码插入此管道(即在 Global.asax 中创建您自己的 ISAPI 扩展、HTTPModule、事件)
在 SQL Server 中,没有为开发人员开放的 SQL 管道。当 SQL 请求到达 SQL Server 时,您无法重写它。如果您想替换原始查询中的表名,触发器 BEFORE 或 INSTEAD OF update/insert/delete 将无法解决问题,因为如果此表不存在,您将在触发器中执行任何自定义业务逻辑之前收到异常。
但是,您可以通过创建自定义数据提供程序(如果您有 ADO.NET 应用程序)在客户端(而不是在 SQL 服务器上)“重写”SQL。请参阅MSDN - 实现 .NET Framework 数据提供程序。这不是一件容易的事,需要付出很多努力。在您的代码中,您可以重用标准 MSSQL 数据提供程序 (System.Data.SqlClient) 的大多数标准功能,并仅覆盖您想要解析 SQL 和替换某些命令的函数。
另请查看http://sqlfaultretryprovide.codeplex.com/- 该项目旨在为 SQL Server 构建一个自定义 .NET 数据提供程序,该程序可以自动提供“出错时重试”功能。因此,这不是 SQL 重写器,但可以用作构建您自己的重写器的示例。
答案2
答案3
您可能正在考虑在 SQL 中创建一个业务层。如果您尝试修改现有应用程序,那么您可能会遇到一些麻烦,因为 SQL 适配器都是专有的,但如果您的应用程序可以修改,您可能可以编写一个业务层来位于 DB 上,它将使用共享内存连接将命令处理到 SQL 服务器中。
另一个选择是一个神奇的 CLR 存储过程,您可以将 SQL 提供给它,然后对其进行编辑并针对 SQL 数据库运行它(使用比共享内存更快的上下文连接)。
但请注意,SQL 服务器编写得非常好,您尝试实现的功能最好在客户端使用 API 来实现,这样处理就会按客户端数量进行分布,并允许 SQL 服务器优化实际正在运行的 SQL。
答案4
您可以编写使用.net 类的触发器。
http://www.15seconds.com/issue/041006.htm
http://aspalliance.com/1273_CLR_Triggers_for_SQL_Server_2005.all
http://www.google.com/search?rlz=1C1_____enUS397US397&sourceid=chrome&ie=UTF-8&q=sql+.net+trigger
祝你好运。