1、在sql server中建立触发器,当某些条件满足时,取用户的AD信息,通过sql server的链接服务器,给相关用户发送邮件。
2、当某些条件满足时,给用户发送短信。由于公司的短信数据库在mysql 5.1(linux)上,所以要把sql server表中的数据插入到mysql表中。
功能说起来不多,从但是里面涉及到很多之前没接触过的东西,在一些功能点上花费了很多时间。
功能1详细
(1)
先说第一个功能,想获取用户的AD信息,就要先建AD链接服务器和登陆权限
Sql代码
- --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.aspx、http://technet.microsoft.com/zh-cn/library/ms189811.aspx里面有详细的介绍
(2)取AD信息
Sql代码
- 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)
Sql代码
- 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 )具体步骤,
Sql代码
- --建立 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调用这个存储过程,这样就可避免远过程调用而将本地事务提升为分布事务了。但是这样做会存在不安全因素,但是对于我们公司内网来说基本不存在这个问题。
Sql代码
- --loopback调用有insert操作的存储过程
- exec loopback.有insert操作的存储过程
(2)无法向mysql插入中文字符
本次mysql数据库版本为5.1,odbc驱动为5.2,采用链接服务器方式访问mysql时,不能插入中文字符。mysql数据库是UTF-8的编码,理论上是可以支持中文字符的,但是插入中文字符为空。经过多方面的查找,发现是由于mysql与odbc驱动的版本不一致而导致的这种问题,换成5.1版本的odbc驱动,问题得以解决。由于数据库直连的方式会涉及很多其它方面的问题,所以开发时尽量采用相同版本,避免不必要的麻烦。