由于短信项目的需求,需要将sqlserver当中的表实时同步到MysqL当中,于是采用触发器完成该功能,对insert操作进行监控,当sqlserver进行插入操作时,同时将数据插入到MysqL当中。
在本电脑上安装MysqL驱动。mysql-connector-odbc-5.1.6-win32.msi.
输入链接参数,点击测试,保存,完成。成功之后的截图:
打开sql server management studio,点击服务器对象-链接服务器,右键点击链接服务器-新建链接服务器-输入连接服务器名称,服务器类型选择-其他数据源,访问接口选择“Microsoft OLE DB Provider for ODBCDrivers”,数据源就选择刚才建好的glb。
测试语句
Select * from OPENQUERY(MysqL,”select * from table”)
Insert openquery(MysqL,”select * from table”)(id,name,password)values(‘8’,’qidanei’,’9’)
写触发器
Create trigger tr_insert_user on [test_trigger].[dbo].[user]
For insert
As
Begin
Insert openquery(MysqL,”select * from user”)select * frominserted
End
执行此触发器,当对user表进行添加的时候,sqlserver会报错,说不支持分布式事务,查了很多资料,都说sqlserver不支持此操作,于是换了一种方式,通过建立回环,在触发器中调用存储过程来实现。
建立回环
--建立LOOPBACK 服务器链接
EXEC sp_addlinkedserver@server = N'loopback' , @srvproduct = N' ' , @provider = N'sqlNCLI', @datasrc = @@SERVERNAME
--设置服务器链接选项,阻止sql Server 由于远过程调用而将本地事务提升为分布事务(重点)
EXEC sp_serveroptionloopback, N'rpc out' , 'TRUE'
EXEC sp_serveroptionloopback, N'remote proc transactionpromotion' , 'FALSE'
重写触发器
create trigger tr_insert_user on [test_trigger].[dbo].[user]
for insert
as
declare @username nchar(100),@userpwd nchar(100)
select @username=user_name,@userpwd=user_pwd from inserted;
begin
print @username
print @userpwd
exec loopback.test_trigger.dbo.sp_test@username,@userpwd
end
存储过程
create PROCEDURE sp_test(@user_name nchar(100),@user_pwd nchar(100))
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
print 'sp_test:' + @user_name
print 'sp_test:' + @user_pwd
SET NOCOUNT ON;
@H_914_502@ -- Insert statements for procedure hereInsert openquery(MysqL, 'select * from user')(user_name,user_pwd)values(@user_name,@user_pwd)
END
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。