不清楚什么是分区视图的请先看http://edobnet.cnblogs.com/archive/2005/12/23/303613.aspx
--=====================================
--分布式分区视图创建
--分布式分获视图的主要作用是:可以把一个数据库中的
--一个大表按照一定的条件分布到不同的多个数据库中
--这样可以减少单台服务器的压力。并且,如果所要查询的
--数据只在一台服务器上,则只会查询所需要的服务器
--但,分布式分区视图的最大缺点是受网络状况的影响
--比较大。
--author:boyi55,date:2006-12-14
--环境:两台2003服务器,sql server 2000
--引用请注明出处
--=====================================
昨天因为版本问题搞的很是郁闷,晚上也没睡好觉。今天起了个大早,还好把这个问题搞好了。下面一步一步的说一下我的做法吧!
因为我只是简单的测试环境,所以一切都比较简单。我的两台服务器名称分别为:computer和boyi55,首先,分别在两个sql server上建test数据库:
--===============================
--create database on computer and boyi55
--===============================
create database test
分布式分区视图必须要用到check约束,并且,所定义的check约束必须是主键或者主键的一部分(也就是说表中必须要有主键)约束的条件必须不能有重复。下面是我建的两个表
--==============================
--create table
--==============================
--create table on computer
create table dpv1(dpvid int not null primary key,addr varchar(30) not null,
constraint ck_dpv check(dpvid between 1 and 255))
--create table on boyi55
create table dpv1(dpvid int not null primary key,addr varchar(30) not null,
constraint ck_dpv check(dpvid between 256 and 800))
--check中只能包含 between and or >
下面在computer和boyi55上分别建立链接服务器dpv2和dpv1,这里我用的是oldb(具体过程略)
用sp_helpserver查看链接服务器是否成功建立,我的sql返回的结果为
--on computer
name network_name status id collation_name nnect_timeout query_timeout
----- ------------ -------------------------------------------- ---- ------------- ------------ --------------
DPV2 NULL data access,use remote collation,lazy schema validation 1 NULL 0 0
--on boyi55
name network_name status id collation_name nnect_timeout query_timeout
----- ------------ -------------------------------------------- ---- ------------- ------------ --------------
DPV1 NULL data access,use remote collation,lazy schema validation 1 NULL 0 0
分别在两个数据库中执行下面存储过程
--set lazy schema validation true
--on computer
sp_serveroption dpv2,'lazy schema validation,true
--on boyi55
sp_serveroption dpv1,'lazy schema validation,true
接着,分别在两个数据库上建立分区视图
--on computer
create view dpv_view
as
select dpvid,addr from dpv1
union all
select dpvid,addr from dpv2.test.dbo.dpv
-- on boyi55
create view dpv_view
as
select dpvid,addr from dpv1.test.dbo.dpv1
union all
select dpvid,addr from dpv
这时,select可以正常,说明视图已经成功创建,但是还不能做插入操作。
插入数据是会提示:
服务器: 消息 7391,级别 16,状态 1,行 1
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
这时我们要设置msdtc,具体方法为:
打开管理工具--->组件服务--->组件服务--->计算机--->我的电脑--->右击属性--->MSDTC--->安全配置--->选中“网络DTC访问”并选择“允许远程客户端”,“允许入站”,“允许出站”,“不要求进行验证”然后点确定。
另外还要注意一点,如果是在局域网里,要打开NETBIOS或者在HOSTS文件里加入IP地址和对应的主机名。否则还是不能进行插入操作的。
上面设置完成以后,进行插入和修改操作(:注意,一定要打开xact_abort 开关)
--on boyi55
set xact_abort on
insert into dpv_view (dpvid,addr)values(777,'boyi55')
set xact_abort off
--on computer
set xact_abort on
update dpv_view
set dpvid=666
where dpvid=777
一切正常,说明分布式分区视图已经成功创建。