首页 > Linux操作系统 > Linux操作系统 > sybase EDCA异构访问
SYBASE EDCA组件用于sybase ase访问异构数据库(non-sybase)所必须的,而replication server要复制异构数据库时,也必须先通过EDCA和异构数据库建立连接,EDCA组件需要单独下载,网上的参考资料几乎为0,主要的参考资料可用sybase官网提供的产品文档。
下面主要记载一下配置过程,主要参考sybase官网产品文档replication server hetergenous edition以及replication server options这两部分文档。
1. 安装EDCA组件,ecda1261win32,dc1261client(DCManager和TDSDriver)windows下安装比较简单,选择安装目录,下一步一直点击就OK了。我安装在E:\sybase下面。
2. 创建一个新的DirectConnect Server
使用cmd命令操作比较方便,进入DC-12_6安装目录,
cd E:\sybase\DC-12_6
运行DC_SYBASE这个脚本,这个脚本的作用是配置环境当前环境变量。
DC_SYBASE
然后进入 bin目录
cd bin
创建新的DC Server是通过AddServer这个脚本创建的,这个脚本的作用是接受两个参数,第一个参数为DC Server名字,第二个参数为port number,这个端口对外提供,SYBASE ASE最终通过这个服务器的IP和这个port进行异构数据库的访问。AddServer脚本自动创建DC Server的相关配置文件,在DC-12_6目录下会产生一个和DC Server 名字一个的目录。里面存放有配置文件,和日志。
AddServer LQDTEST 10030
创建成功后,这个DC Server会自动运行起来,此时需要关闭进一步配置。
按键 Ctrl + C 。
修改配置文件 dcany.cfg、server.cfg以及snrf.tbl
Dcany.cfg内容如下:
[Service Library]
{Logging}
LogSvcLibStatistics=0
{Client Interaction}
SvclibDescription=Access Service Library for ODBC. 以上为创建完成自动产生,不必修改
EnableAtStartup=yes
[LQDSQL] 这个是访问服务名字,可任意命名。
{ACS Required}
ConnectionSpec1=LBABY_SQL2 这个是数据源的名字,在ODBC中进行配置
server.cfg只要修改一项即可:
ServiceRedirectionFile=snrf.tbl 制定服务访问名字的参数文件
Snrf.tbl配置内容如下:
* * ServiceName
* * * LQDSQL 这个名字对应dcany.cfg中的服务访问名字(这个必须配置,之前因为漏了这个没配置,导致sybase ase中,可用建立远程服务器,而且可以连通,但是无法创建代理表)
配置完成后保存退出,在命令行中重新启动刚刚创建DC Server
DCStart -SLQDTEST
这样就配置创建完成。
最后测试一下配置是否OK,cmd中操作
isql -Usa –P -SLQDTEST 这种不需要密码的只适合于ODBC驱动类型为DC SQL Server wire protocol
>select @@sqldbmsname
>go

如果显示上图信息,配置OK.
接下来就可以用isql 操作MSSQL了
>select * from lqdtest.dbo.test
>go
如果驱动类型配置为SQL server的,则需要用户名和密码同时提供
Isql –Usa –Payd123456 -SLQDTEST
配置的驱动类型不同,在sybase ase中添加远程服务器中有一步是需要添加需要一个externlogin ,如果是ODBC配置为 SQL server类型,则需要加上远程用户的密码,
sp_addexternlogin LQDTEST,sa,sa,password
如果是DC SQL server wire protocol 类型的,则不需要加上密码
sp_addexternlogin LQDTEST,sa,sa
ODBC数据源的配置,MSSQL要选择驱动类型为DC SQL Server wire protocol。配置

点击test connect
表示配置成功。
上面是ODBC以及DC server wire protocol 方式的配置。
下面是EDCA for oracle 的配置
创建DCO 连接,使用 DCOConfig.bat脚本,这个脚本的作用是,根据用户输入的参数创建一个服务 ,也就是产生一个启动参数文件,也可以自己根据示例参数文件编写启动参数文件。
这个文件在 DCO安装目录下面的install下面,
cmd 中运行
DCOconfig
根据提示输入即可,server_name,port,tnsnames.ora的路径,错误日志文件路径,tnsnames.ora中对应的oracle连接名,oracle中用户名。
创建完成后,会自动把server_name,port写入到接口文件中。而且会自动启动起来。在install目录下,会自动生参数文件,日志文件,参数文件名字和server_name必须一致。而且会自动生成一个服务启动脚本。RUN_servername.bat
再次启动可以直接运行这个脚本,或者使用bin/dcoracle.exe –Sservername也可以启动。
在sybase ase中创建oracle远程数据库,在指定远程用户的时候,必须加上用户的密码,
Eg:
Sp_addserver ORCLDC,direct_connect,ORCLDC
Sp_serveroption ORCLDC,’rpc security model A’,true
Sp_addexternlogin ORCLDC,sa,lqd,ayd123456
其中lqd和ayd123456是在oracle中有效的用户名和密码
后续,sybase ase访问远程数据库的方式
exec sp_addserver LBABY_SQL, direct_connect, LBABY_SQL
exec sp_serveroption LBABY_SQL, 'rpc security model A', true
go
exec sp_addexternlogin LBABY_SQL, sa, sa
go
sybase ase可以通过replication server进行远程数据库的访问,远程数据库包括MSSQL,oracle,db2,
ASE,sybaseiq 等等,如果远程数据库是ASE或者IQ的话,直接通过接口文件而不需要replicatio server
就可以访问远程数据库。而其他数据库产品必须通过replication server来访问。
其他数据库在replication server 上进行端口映射,sybase ase通过这个replication server的IP和相
应端口进行访问,也就是把replication server的IP和端口写到接口文件中,(windows平台是sql.ini,
*uix平台是interfaces)。
windows下通过配置 【Open Client 目录服务编辑器】进行接口文件的配置,注意下面参数的写法,IP逗号 端口。

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