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

2021-07-26 11:10:10 浏览数 (1)

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

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

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

功能1详细

(1)

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

Sql代码

  1. --Create the linked server
  2. sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
  3.      [ , [ @provider= ] 'provider_name' ]  
  4.      [ , [ @datasrc= ] 'data_source' ]   
  5.      [ , [ @location= ] 'location' ]   
  6.      [ , [ @provstr= ] 'provider_string' ]   
  7.      [ , [ @catalog= ] 'catalog' ]   
  8. --Create the login account 
  9. sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
  10.      [ , [ @useself = ] 'TRUE' | 'FALSE' | NULL ]   
  11.      [ , [ @locallogin = ] 'locallogin' ]   
  12.      [ , [ @rmtuser = ] 'rmtuser' ]   
  13.      [ , [ @rmtpassword = ] 'rmtpassword' ]   

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

(2)取AD信息

Sql代码

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

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

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

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

Sql代码

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

功能2详细

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

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

Sql代码

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

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

Sql代码

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

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

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

0 人点赞