[讨论]sybase 代理表的实现与测试
<strong>SYBASE如何跨server操作?<wbr></wbr><br/><br/></strong>1. 在远程服务器及本地服务器<br/>sp_addserver local_server_name,local<br/>重新启动保证设置生效<br/><br/>2. 在本地主机中使用 dsedit添加远程服务器的接口<br/> 注:在AIX或者LINUX系列系统中,修改interfaces文件(注意保存原来的interfaces的备份)<br/>3. 在本地服务器上添加远程服务器名称<br/><br/>sp_addserver remote_server_name,ASEnterprise,server_net_name<br/><br/>2,3步骤应该在本地服务器及远程服务器两方都进行添加<br/><br/>4. 设置远程服务器选项<br/><br/>exec sp_addserver 远程服务器逻辑名称,类型,本地DSEDIT配置的服务器名称<br/><br/>exec sp_addserver sybcdsrv, sql_server, ase12 <br/>exec sp_serveroption sybcdsrv, "timeouts", true <br/>exec sp_serveroption sybcdsrv, "net password encryption", false <br/>exec sp_serveroption sybcdsrv, "readonly", false (只对CIS生效)<br/>exec sp_serveroption sybcdsrv, "rpc security model A", true <br/>go<br/><br/>5. 增加远程用户与本地用户的映射关系<br/><br/>sp_addremotelogin remote_server_name,local_login,remote_login<br/><br/>local_login及remote_login均为服务器上已经存在的login<br/>local_login跟remote_login口令应该一致,如果不一致,在<br/>Open Client Client-Library编程中可以使用 ct_remote_pwd 命令进行设置<br/>但在isql 及 bcp 中不允许指定 rpc 口令<br/><br/>另外,一旦到远程服务器的连接建立成功,在退出当前会话前,不论远程服务器是否对相关remote_login进行了口令更改,远程存储过程的调用及其他远程操作都可以进行。<br/><br/>5. 设置服务器之间的信任关系<br/><br/>sp_remoteoption remote_server_name,local_login,remote_login,trusted,true<br/><br/>6. 调用远程存储过程<br/><br/>isql -Usa -P -Slocal_server_name<br/>1>;exec remote_server_name.database_name.owner_name.procedure_name<br/>2>;go<br/><br/>另外可以在 isql 中使用connect remote_server_name命令连接到远程服务器上,以测试远程服务器是否配置正常、网络是否正常、远程服务器是否接受连接。<br/><br/>除了远程存储过程调用方式,也可以采用其他一些方式对远程服务器上的数据进行更改,其中包括建立代理表,使用sp_remotesql等方式。具体操作方法请参见ASE命令参考手册及相关文档。<br/><br/>sp_remotesql ase12,"insert into pubs2..tr1 values(09,'test remote sql')"<br/><br/>其他信息:<br/><br/>还可以使用代理表<br/><br/>所对应远程服务器表 信息 在系统表 sysattributes 中 char_value 字段 <strong>SYBASE如何跨server操作?<br/><br/><wbr></wbr></strong>例子两台ASE服务器名称为 Server1,Server2,需要在Server1中建立代理表,并通过Server1上的存储过程对Server1自身及Server2中表进行更新<br/>1. 建立代理表<br/> 在Server2数据库pubs2建立表t_testproxy<br/> create table t_testproxy (id int,name char(10))<br/> 在Server1数据库test中添加代理表信息<br/> use test<br/> go<br/> create proxy_table t_testproxy at "Server2.pubs2.dbo.t_testproxy"<br/> 代理表名与原表名可以不同<br/><br/> Server1上查看代理表 信息如下:<br/><br/>Name Owner Object_type <br/>---- ----- ----------- <br/>t_testproxy dbo user table <br/><br/>Data_located_on_segment When_created <br/>----------------------- ------------ <br/>default Nov 28 2002 11:59AM <br/><br/>Column_name Type Length Prec Scale Nulls Default_name Rule_name Access_Rule_name Identity <br/>----------- ---- ----------- ----------- ----------- ----------- ------------ --------- ---------------- ----------- <br/>id int 4 NULL NULL 0 NULL NULL NULL 0 <br/>name char 10 NULL NULL 0 NULL NULL NULL 0 <br/><br/>exp_row_size reservepagegap fillfactor max_rows_per_page identity_gap <br/>------------ -------------- ----------- ----------------- ------------ <br/> 1 0 0 0 0 <br/><br/>concurrency_opt_threshold <br/>------------------------- <br/> 0 <br/><br/>Object is Remote/External<br/>-------------------------<br/>presales.pubs2.dbo.t_testproxy <font style="LINE-HEIGHT: 1.3em;"> //可从此处看出代理表所指向的真正对象</font><wbr></wbr><br/><br/>Object created with 'existing' option<br/><br/>Object does not have any indexes.<br/>No defined keys for this object.<br/>Object is not partitioned.<br/>Lock scheme Allpages<br/>The attribute 'exp_row_size' is not applicable to tables with allpages lock scheme.<br/>The attribute 'concurrency_opt_threshold' is not applicable to tables with allpages lock scheme.<br/><br/><br/>2. 代理表测试<br/> Server2上插入数据:<br/> insert into t_testproxy values(1,'Server2')<br/> Server2上插入数据:<br/> insert into t_testproxy values(2,'Server1')<br/><br/> Server1上查询数据:<br/> select * from t_testproxy<br/><br/> id name <br/>----------- ---- <br/> 1 Server2 <br/> 2 Server1 <br/><br/>3. 视图测试<br/> 在Server1上test数据库中建立用户表t_testproxyview<br/> create table t_testproxyview (id int,address varchar(30)<br/> 插入测试数据<br/> insert into t_testproxyview (1,'Chengdu')<br/> insert into t_testproxyview (2,'Sichuan') <br/> insert into t_testproxyview (3,'sky')<br/><br/> 建立视图<br/> create view v_proxy as select a.*,b.address from t_testproxy a,t_testproxyview b<br/> where a.id = b.id<br/><br/> 查询视图<br/>select * from v_proxy<br/><br/>id name address <br/>----------- ---- ------- <br/> 1 Server2 Chengdu <br/> 2 Server1 Sichuan <br/><br/> 视图的更新<br/> update v_proxy set address = 'test' where id = 2 更新本地表 执行成功 <br/> update v_proxy set name = 'test' where id = 2 更新远程表 报告错误如下:<br/>The optimizer could not find a unique index which it could use to scan table 'pubs2.dbo.t_testproxy' for cursor 'C11'. <br/> 必须为远程表建立 主键或者唯一索引<br/> Server2上执行(不能在Server1上为代理表建立主键):<br/> alter table t_testproxy add constraint pk_t_testproxy primary key (id)<br/><br/> update v_proxy set name = 'test' where id = 2 再次更新代理表,成功<br/><br/>id name address <br/>----------- ---- ------- <br/> 1 Server2 Chengdu <br/> 2 test test <br/> <br/> 对试图中本地表及代理表同时作更新<br/> update v_proxy set name = 'test1',address = 'test1' where id = 1<br/> 报告错误:<br/> View 'v_proxy' is not updatable because the FROM clause names multiple tables. <br/> <br/> Sybase不支持在视图中一次更新多表<br/><br/>4. 存储过程测试<br/> 在Server1上<br/> create proc p_proxy(@id int)<br/> as<br/> begin<br/> begin tran<br/> update t_testproxy set name = 'test3' where id = @id --更新代理表<br/> update t_testproxyview set address = 'test3' where id = @id<br/> commit<br/> end<br/> <br/> exec p_proxy 2<br/><br/>id name address <br/>----------- ---- ------- <br/> 1 Server2 Chengdu <br/> 2 test3 test3 <br/><br/> 结论:可以在存储过程中对本地及远程表进行操作,并利用事务来保证一致性<br/><br/><font face="Tahoma" size="2" style="LINE-HEIGHT: 1.3em;"><font color="#330099" style="LINE-HEIGHT: 1.3em;"><font color="#cc0000" style="LINE-HEIGHT: 1.3em;">需要注意一点的是</font><wbr></wbr>:</font><wbr></wbr>建代理表时,远程表的结构数据已经存储在了本地,并且不会检测该表的结构是否发生改变,因此远程表的结构发生改变时,本地是不知道的,需要重新创建代理表,相当于重新刷新本地的存储的结构.</font><wbr></wbr><br/><font face="Tahoma" size="2" style="LINE-HEIGHT: 1.3em;">5、代理表的索引问题。</font><wbr></wbr><br/><font face="Tahoma" size="2" style="LINE-HEIGHT: 1.3em;"> 如上注意中提到,修改表结构后,需要重新建立代理表,代理表的索引会根据源表的索引一起建立成功。另外一种方法:手工建立临时表;在源表中添加索引后,手工在临时表中添加。</font><wbr></wbr><br/>ALTER TABLE temp_c**_*est<br/>ADD<br/>CONSTRAINT id_id PRIMARY KEY CLUSTERED (id) <br/> <br/>有什么问题,找到解决方法后再添加<img src="http://imgcache.qq.com/qzone/em/e7.gif" alt=""/><wbr></wbr>
页:
[1]