我有一个应用程序的想法,但理想情况下,它将依靠能够编写一种MSSQL的“SQL重写”引擎(就像HTTP服务器可以有“URL重写”模块),这可能会相交于SQL语句之前服务器处理它们并首先运行其他代码。
这甚至可能与MSSQL或我需要寻求一种替代方法来实现我的目标?
问题不在于如何进行重写,而是在哪里重写。 你说你想在IIS中像这样,但这在MSSQL中是不可能的。 在IIS中,您有请求处理pipe道,并且有很多地方可以将自定义代码插入到这个pipelene(即在Global.asax中创build您自己的ISAPI扩展,HTTPModule,事件)
在SQL Server中没有为开发人员打开的SQLpipe道。 当SQL请求到达SQL Server时,您不能重写它。 如果您想要replace原始查询中的表名称,则触发器在更新/插入/删除时不会解决问题,因为如果此表不存在,您将在执行任何自定义业务之前收到exception触发器中的逻辑。
但是,您可以通过创build自定义数据提供程序(如果您有ADO.NET应用程序)“重写”客户端上的SQL(而不是SQL服务器上)。 请参阅MSDN – 实现.NET Framework数据提供程序 。 这不是一件容易的事情,需要付出很多努力。 在您的代码中,您可以重用标准MSSQL数据提供程序(System.Data.SqlClient)的大多数标准function,并仅覆盖要parsingSQL并replace某些命令的function。
请参考http://sqlfaultretryprovide.codeplex.com/ – 这个项目是为SQL Serverbuild立一个自定义的.NET数据提供者,它可以自动提供“错误重试”function。 所以这不是一个SQL重写器,但可以作为一个例子来build立自己的。
您可以使用INSERT,UPDATE和DELETE的触发器 ,但不存在SELECT的等效触发器。
另一种方法是编写拦截TDS调用 ,修改它们并将它们传递给SQL服务器的程序。 所以你可以让你的程序监听端口1433,或者在你的安装程序中更改SQL服务器端口以侦听端口1434。
您可能正在考虑将业务层创build为SQL。 如果您正在尝试修改现有的应用程序,那么您可能会遇到一些麻烦,因为SQL适配器都是专有的,但是如果您的应用程序可以修改,则可以编写一个业务层来坐在数据库上,这将处理命令SQL服务器使用共享内存连接。
另一个select是一个神奇的CLR存储过程,它提供了SQL,然后对其进行编辑,并在SQL数据库上运行它(使用比共享内存更快的上下文连接)。
请注意,尽pipeSQL服务器编写得很好,但是您想要实现的function最好在使用API的客户端上实现,以便处理由多个客户端传播,并允许SQL Server优化实际的SQL跑。
当你说“URL重写”,你真的是指“URL”? 因为我不知道SQL Server曾经被URL访问过。
如果你打个比方,你能否澄清一下?
您可以编写使用.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
祝你好运。