跨数据库触发器
‘壹’ 如何使触发器具备良好的性能
触发器使得表和跨数据库之间数据的自动同步行为变得简单。但是,那些一眼看上去不是很明显的东西却会对他们的性能造成显着的影响。这里我将描述一个命令,他可用来减少一些不可预料的问题产生的影响 。
以反复被触发的INSERT触发器为例,尤其是当使用INSERT INTO语句用来进行大量插入操作时。在语句执行的过程中,当触发器一遍又一遍的被激发的情况下,触发器将会对每个INSERT动作发布DONE_IN_PROC消息,这会使速度明显下降。
尤其是当触发器作为一个预定了时间的sql Server Agent工作的结果而被触发时,这个速度的减慢是特别明显的 。SQL Server Agent自动在每个DONE_IN_PROC 信号后强加一个延迟,以避免服务器拥塞 。假如您想通过查询分析器来运行同样的一组命令,由于没有强加这样的延迟,他的执行将会快得多。假如您通过查询分析器运行这样的查询并且查看多个语句产生的多个"n rows affected",那么很有可能查询会被反复执行,并且触发器也被重新触发多次,这比他实际需要的次数要多很多。
要关掉DONE_IN_PROC消息,能够在触发器语句的开始用SET NOCOUNT ON命令。大多数时候,以任何方式对行进行计数都是无需的。假如确实需要,您能够考虑重新构造命令来触发触发器(或是触发器本身),这样就使任何的改变作为一个命令完成。
‘贰’ 在mysql中的两个不同的数据库之间建立触发器连接
若想利用此方法达到反向同步则可能出现察闹问题,比如想在parkfee数据库有绝大新数据插入时让当前数据库也同时插入一条记录,建立一个触发器,则形成了一个循环触发,当插入数据时会报大于最大递归次数错。因此因避败宏罩免这样的触发循环,若要达到类似效果还须想别的方法。(待续)
补充:
若两个库处于不同的数据库服务器则应先进行以下操作:
在 server1 上创建连接服务器,以便在 server1 中操作 server2,实现同步
exec sp_addlinkedserver 'server2','','SQLOLEDB','server2的数据库实例名或ip'
exec sp_addlinkedsrvlogin 'server2','false',null,'用户名','密码'
go