標籤:management sqlserver microsoft 控制台 管理工具
由於簡訊項目的需求,需要將sqlserver當中的表即時同步到mysql當中,於是採用觸發器完成該功能,對insert操作進行監控,當sqlserver進行插入操作時,同時將資料插入到mysql當中。
安裝sqlserver2008以及mysql。
建立mysql連結的伺服器。
在本電腦上安裝mysql驅動。Mysql-connector-odbc-5.1.6-win32.msi.
安裝完畢後,在電腦控制台-管理工具-odbc資料來源-系統dsn-添加-選擇mysql odbc driver-完成。
輸入連結參數,點擊測試,儲存,完成。成功之後的:
650) this.width=650;" width="498" height="361" src="http://s3.51cto.com/wyfs02/M01/4C/31/wKioL1Q4lBSCXrByAAHCdtOEAj4794.jpg" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" title="a.png" />
開啟sql server management studio,點擊伺服器對象-連結的伺服器,右鍵點選連結伺服器-建立連結的伺服器-輸入串連伺服器名稱,伺服器類型選擇-其他資料來源,提供者選擇“Microsoft OLE DB Provider for ODBCDrivers”,資料來源就選擇剛才建好的glb。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/4C/2F/wKiom1Q4k92iY2oPAAEbq-SeZEI651.jpg" title="b.png" alt="wKiom1Q4k92iY2oPAAEbq-SeZEI651.jpg" />
測試語句
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;
-- Insert statements for procedure here
Insert openquery(MYSQL, ‘select * from user‘)(user_name,user_pwd)values(@user_name,@user_pwd)
END
注意點:sqlserver中預存程序中的輸入參數要指定長度,不然在觸發器中傳入的參數會被截取。
sqlserver與mysql資料同步問題