sql server 与mysql跨平台跨数据库操作

     之前做了一个跨平台跨数据库操作的功能,sql server 2008windows64,mysql 5.1linux);这里重点说明的是两个功能:

1、在sql server中建立触发器,当某些条件满足时,取用户的AD信息,通过sql server的链接服务器,给相关用户发送邮件。

2、当某些条件满足时,给用户发送短信。由于公司的短信数据库在mysql 5.1linux)上,所以要把sql server表中的数据插入到mysql表中。

功能说起来不多,从但是里面涉及到很多之前没接触过的东西,在一些功能点上花费了很多时间。

 

功能1详细

(1)

先说第一个功能,想获取用户的AD信息,就要先建AD链接服务器和登陆权限

 

--Create the linked server

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] 
     [ , [ @provider= ] 'provider_name' ]
     [ , [ @datasrc= ] 'data_source' ] 
     [ , [ @location= ] 'location' ] 
     [ , [ @provstr= ] 'provider_string' ] 
     [ , [ @catalog= ] 'catalog' ] 

--Create the login account 
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname' 
     [ , [ @useself = ] 'TRUE' | 'FALSE' | NULL ] 
     [ , [ @locallogin = ] 'locallogin' ] 
     [ , [ @rmtuser = ] 'rmtuser' ] 
     [ , [ @rmtpassword = ] 'rmtpassword' ] 

关于sp_addlinkedsrvlogin大家可以看一下http://technet.microsoft.com/zh-cn/library/ms190479.aspxhttp://technet.microsoft.com/zh-cn/library/ms189811.aspx里面有详细的介绍

 

(2)取AD信息

 

SELECT 
  @EMAIL=mail,@TEL=telephoneNumber 
FROM OPENQUERY
(
  ADSI,
  'SELECT  要显示的字段 
  FROM ''LDAP://[LDAP服务器ip]:[LDAP服务器端口]/dc=[公司的域名],dc=com,dc=cn'''
)

 

(3)配置SQL SERVER数据库邮件

    这里不多说了,网上有很多例子

 

(4)调用数据库邮件存储过程(msdb.dbo.sp_send_dbmail)

    EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'SQLMailConfig',--数据库邮件配置文件名
    @recipients = @EMAIL,--邮箱地址
    @body = @EMAIL_CONTENT,--内容
    @subject = @subject;--标题

 

功能2详细

(1)分布式事务问题处理

     要实现短信功能,需要把数据insert到mysql的数据库表中。在sql server触发器中调用mysql链接服务器进行mysql表的insert操作会产生分布式事务。由于mysql部署在linux系统的机器上,sql server是在windows平台上,由于操作系统不同无法采用windows平台上的MSDTC服务,所以为避免产生分布式事务,通过 loopback 服务器链接执行远过程调用, 让此过程拥有独立的事务作用域(适用于 SQL Server 2008 )具体步骤,

 

--建立 LOOPBACK 服务器链接
EXEC sp_addlinkedserver @server = N'loopback' , @srvproduct = N' ' , @provider = N'SQLNCLI'
 , @datasrc = @@SERVERNAME
--设置服务器链接选项,阻止 SQL Server 由于远过程调用而将本地事务提升为分布事务(重点)
EXEC sp_serveroption loopback, N'rpc out' , 'TRUE'
EXEC sp_serveroption loopback, N'remote proc transaction promotion' , 'FALSE' 

 
    然后用把insert操作放到一个存储过程中,再用loopback调用这个存储过程,这样就可避免远过程调用而将本地事务提升为分布事务了。但是这样做会存在不安全因素,但是对于我们公司内网来说基本不存在这个问题。

--loopback调用有insert操作的存储过程
exec loopback.有insert操作的存储过程

 

(2)无法向mysql插入中文字符

     本次mysql数据库版本为5.1,odbc驱动为5.2,采用链接服务器方式访问mysql时,不能插入中文字符。mysql数据库是UTF-8的编码,理论上是可以支持中文字符的,但是插入中文字符为空。经过多方面的查找,发现是由于mysql与odbc驱动的版本不一致而导致的这种问题,换成5.1版本的odbc驱动,问题得以解决。由于数据库直连的方式会涉及很多其它方面的问题,所以开发时尽量采用相同版本,避免不必要的麻烦。

 

 重点内容就是这么多,给自己记录一下,也希望可以给大家帮助。。。

 

展开阅读全文

没有更多推荐了,返回首页