现在我有一个需求是需要在两个不同的SQL SERVER 2012的服务器之间进行数据访问和更新。我们需要把Server One的数据插入到Server Two的服务器上去,一天执行一次任务。我们的首选方案是在两个服务器之间建立链接服务器,下面介绍下如何建立链接服务器。
我需要做的事情是,我需要定时的全量的把Server one的数据插入到Server Two里去。所以这里就涉及到需要把Server Two里的表的信息做删除操作,由于我们都知道delete表是需要记录日志,他是为了回滚用的。所以要记录详细的日志。由于我此表比较大,而且每天都做一次删除,我也不需要写日志。所以我不想用delete操作,我想用truncate来删除表。这就是故事的有趣的点。
如何SQL Server 2012建立链接服务器
两个服务器的配置:
Server one:
DB Version: 2012
Server IP: 192.168.21.252
Souce Database
Server two:
DB Version: 2012
Server IP: 192.168.25.210
Target Database
我们可以在任意一个服务器上建立链接服务器,但是是有细微的区别的,下面看我在处理数据的时候遇到的问题,此问题让我了解到在任意一个服务器上建立链接服务器是有区别的。
方法一:我在源数据库服务器上建立一个链接服务器,我想让源数据库主动的把数据push到目标数据库中。
1,建立链接服务器
在源数据库服务器上建立链接服务器如下:
![](https://i-blog.csdnimg.cn/blog_migrate/b16826283a9e428525b1a736cd8d7e02.jpeg)
注意:链接服务器IP:192.168.25.210是我的目标数据库,建立的这个链接服务器就想直接访问192.168.25.210的服务器上的数据库表。由于我是SQL SERVER 2012 到SQL SERVER 2012数据库,所以服务器类型选择SQL Server。
![](https://i-blog.csdnimg.cn/blog_migrate/c30ff90b0e158d9f9d4cda72ed7ca504.jpeg)
需要添加一个本地服务器登录到远程服务器的登录映射。
![](https://i-blog.csdnimg.cn/blog_migrate/4f5bb4de919002ed21533b2437e367b8.jpeg)
这个时候我们看到了一个192.168.25.210的链接服务器了。
![](https://i-blog.csdnimg.cn/blog_migrate/6b1a3aab64756bca99fe0405c646b7f9.jpeg)
可以测试下链接服务器是否链接成功。
2, 在源数据库服务器上建立一个job主动的把数据push到目标数据库里去。
a, 新建立作业
![](https://i-blog.csdnimg.cn/blog_migrate/ead67e3e2a0796f5881fe554f5eda81c.jpeg)
b,编辑步骤
![](https://i-blog.csdnimg.cn/blog_migrate/5fc6e538d9be7d40785b0c877719d902.jpeg)
我从源数据库push数据到目标数据库的sql语句是:
truncate table [192.168.25.210].BI.[dbo].[BIU8_GL_ACCVOUCH]
go
insert into [192.168.25.210].BI.[dbo].[BIU8_GL_ACCVOUCH] SELECT * FROM BI.DBO.[BIU8_GL_ACCVOUCH]
go
go
insert into [192.168.25.210].BI.[dbo].[BIU8_GL_ACCVOUCH] SELECT * FROM BI.DBO.[BIU8_GL_ACCVOUCH]
go
c,新建作业计划
我修改了下计划的执行时间,让他立马执行下这个job.下面问题来了。如下图:
下面我把job里的脚本放到查询分析器里执行了下,执行结果让我很迷茫。如下图:
从上图的错误提示可以看出这个语句是有问题的不可以这么执行的。 但是这个语句的语法是没有错的。truncate table [192.168.25.210].BI.[dbo].[BIU8_GL_ACCVOUCH],我一开始怀疑是否不可以这么执行SQL 语句,如是我执行了下面的语句
从上面可以看出链接数据库的写法是正确的,因为delete from [192.168.25.210].BI.[dbo].[BIU8_GL_ACCVOUCH]删除目标数据库的表示成功的。
因为我说了,我不想用delete来删除数据表,这样会产生很多的日志的。我希望用truncate删除数据。于是我用方法二来再做一次。
方法二:我在目标数据库服务器上建立一个链接服务器,我想让目标数据库主动地从源数据库中把数据pull到自己的数据库中。
1,在目标库服务器上(192.168.25.210)建立链接服务器,连接服务器(192.168.21.252)如下图,具体步骤请参考上面的方法。
![](https://i-blog.csdnimg.cn/blog_migrate/c3d3b424b5fbda28708ff28fc51e770f.jpeg)
2,测试链接服务器是否链接成功
3,在目标数据库服务器上建立一个job主动的把源数据库的数据pull到自己的数据库里来。关于如何建立job的细节可以参考上面的步骤。
4,新建立作业名:pull_data_from_target_db
5,具体的作业步骤代码如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/1f045920e066c80c1d56920d67ef2a9c.jpeg)
我从目标数据库pull源数据库的sql语句是:
truncate table BI.[dbo].[BIU8_GL_ACCVOUCH]
go
insert into BI.[dbo].[BIU8_GL_ACCVOUCH] SELECT * FROM [192.168.21.252].BI.DBO.[BIU8_GL_ACCVOUCH]
go
go
insert into BI.[dbo].[BIU8_GL_ACCVOUCH] SELECT * FROM [192.168.21.252].BI.DBO.[BIU8_GL_ACCVOUCH]
go
6,新建立作业计划
![](https://i-blog.csdnimg.cn/blog_migrate/e07baf56a1b2ebbdc9cdaab068e06572.jpeg)
7,查看job的执行情况如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/7f22432dfa865fbe38cfc0b9a27e1e4d.jpeg)
从上面2014/12/19 9:48:02就是我刚才执行的,它成功的执行了job。可以看出下面的语句是执行成功的。
truncate table BI.[dbo].[BIU8_GL_ACCVOUCH]
go
insert into BI.[dbo].[BIU8_GL_ACCVOUCH] SELECT * FROM [192.168.21.252].BI.DBO.[BIU8_GL_ACCVOUCH]
go
go
insert into BI.[dbo].[BIU8_GL_ACCVOUCH] SELECT * FROM [192.168.21.252].BI.DBO.[BIU8_GL_ACCVOUCH]
go
所以从上的操作中可以得出如下的非常重要的结论:
链接服务器有两个特点:
1:通过链接服务器不能删除(including truncate)链接源服务器的任何对像.
2:能过链接服务器可以对链接源服务器的表进行insert,updae,delete操作.
关于如何通过SQL SERVER2012来创建链接服务器到ORACLE数据库请参考:http://blog.csdn.net/waterxcfg304/article/details/43162403