地下室的流星雨
看一个人是否聪明看他的答案;看一个人是否有智慧看他的问题。

 

在进行Windows Mobile开发时,有时需要中途更改同步数据库的结构,也即是要进行数据库结构的升级。关于数据库结构的升级(增删改字段),暂提出以下解决方案,以供参考。

1.如果对字段的长度进行更改,只需统一端和远程端同时将字段长度更改过来即可(注意:远程端修改字段的长度需要先删除发布,修改完字段长度后重新建回发布和预订)。
2.如果对字段进行增加或者删除操作,就会比较复杂。下面暂以增加字段为例进行测试(删除操作与增加类似,只是脚本的更改不同,不再赘述。)。

测试环境:

操作系统:Windows XP
统一数据库:Oracle10g
远程数据库:Sql Anywhere 12

操作步骤:

begin---------------------------------------------------------------------------------------------------------------------------------------

第 1 步:创建并配置数据库

a.新建一个Oracle用户mluser。(用户名:mluser,密码:mluser。)

b.新建一个表customer
CREATE TABLE customer (
   id      number primary key,
   name    varchar2( 256),
   phone   varchar2( 12 )
);
commit;

c.通过sql anywhere 12的ODBC数据源管理器添加一个连接到表的customer的ODBC连接(oracle数据源名称:ServerDB)。

d.在Sybase Central中建立一个新的Mobilink项目并进行部署(具体步骤此处省略)。

相关参数名称:同步模型名称:MlModel
              发布:p1
              脚本版本:my_ver1
              mobilink同步用户:u1             
              同步预订:my_sub

-------------------------------------------------------------------------------------------------------------------------------------------

第 2 步:同步远程数据库

a.启动mobilink服务器

 mlsrv12 -c "dsn=ServerDB;uid=mluser;pwd=mluser"  -x tcpip(port=2439)  -v+ -dl

b.启动个人数据库服务器

 
c.使用连接到统一数据库的 Interactive SQL 实例执行以下 SQL,以便在 customer 表中插入行。

 INSERT INTO "MLUSER"."CUSTOMER"(ID,NAME,PHONE) VALUES( 100, 'John Jones', '519-555-1234' );
 COMMIT;
 

d.使用连接到远程数据库的 Interactive SQL 实例执行以下 SQL,以便在 customer 表中插入行。

 INSERT INTO "MLUSER"."CUSTOMER" VALUES( 1, 'Willie Lowman', '705-411-6372' );
 COMMIT;
 

e.同步

---------------------------------------------------------------------------------------------------------------------------------------------


第 3 步:在远程数据库中插入数据

a.使用连接到远程数据库的 Interactive SQL 实例执行以下 SQL,以便在 customer 表中插入行:

 INSERT INTO "MLUSER"."CUSTOMER" VALUES( 2, 'Sue Slow', '602-411-5467' );
 COMMIT;


----------------------------------------------------------------------------------------------------------------------------------------------

第 4 步:在统一数据库上执行模式更改

 

a.将在 customer 表中添加新列来存储客户的手机号码。首先,通过在连接到统一数据库的 Interactive SQL 实例中执行以下 SQL,以便在统一数据库中添加新列。

 ALTER TABLE "MLUSER"."CUSTOMER" ADD cell_phone varchar(12) default null;
 

b.接下来,创建一个称为 my_ver2 的新脚本版本来处理新模式远程数据库的同步。旧模式的远程数据库将继续使用旧脚本版本 my_ver1。对统一数据库执行以下 SQL:

CALL ml_add_column('my_ver2', 'CUSTOMER', 'ID', null );
CALL ml_add_column('my_ver2', 'CUSTOMER', 'NAME', null );
CALL ml_add_column('my_ver2', 'CUSTOMER', 'PHONE', null );
CALL ml_add_column('my_ver2', 'CUSTOMER', 'CELL_PHONE', null );

CALL ml_add_table_script( 'my_ver2', 'CUSTOMER', 'upload_insert',
      'INSERT INTO "MLUSER"."CUSTOMER" ( ID, NAME, PHONE, CELL_PHONE ) '
      || 'VALUES ({ml r.id}, {ml r.name}, {ml r.phone}, {ml r.cell_phone})' );

CALL ml_add_table_script( 'my_ver2', 'CUSTOMER', 'download_cursor',
       'SELECT MLUSER.CUSTOMER.ID, MLUSER.CUSTOMER.NAME, MLUSER.CUSTOMER.PHONE, MLUSER.CUSTOMER.CELL_PHONE from MLUSER.CUSTOMER' );

CALL ml_add_table_script( 'my_ver2', 'CUSTOMER', 'download_delete_cursor', '--{ml_ignore}' );
COMMIT;


注意:此处修改了同步脚本,要更新部署或者重启mobilink服务器才能生效。

-----------------------------------------------------------------------------------------------------------------------------------------------

第 5 步:在远程数据库上执行模式更改


a.首先,开始执行同步模式更改。对于大多数影响同步表的模式更改,这一步是必需步骤。此语句可更改用于同步预订的脚本版本,并锁定受影响的表,以使模式更改能够继续安全执行。

使用连接到远程数据库的 Interactive SQL 实例,在远程数据库上执行以下 SQL:

 START SYNCHRONIZATION SCHEMA CHANGE
 FOR TABLES "MLUSER"."CUSTOMER"
 SET SCRIPT VERSION = 'my_ver2';
 

b.接下来,使用以下 SQL 在 customer 表中添加新列:

 ALTER TABLE "MLUSER"."CUSTOMER" ADD cell_phone varchar(12) default null;
 

c.最后,关闭可解锁表的模式更改项。

 STOP SYNCHRONIZATION SCHEMA CHANGE;


-------------------------------------------------------------------------------------------------------------------------------------------------

第 6 步:向数据库中插入数据

a.使用 Interactive SQL 对远程数据库执行以下 SQL:

 INSERT INTO "MLUSER"."CUSTOMER" VALUES( 3, 'Mo Hamid', '613-411-9999', '613-502-1212' );
 COMMIT;
 

b.使用 Interactive SQL 对统一数据库执行以下 SQL:

 INSERT INTO "MLUSER"."CUSTOMER"(ID,NAME,PHONE,CELL_PHONE) VALUES( 101, 'Theo Tug', '212-911-7677', '212-311-3900' );
 COMMIT;

-------------------------------------------------------------------------------------------------------------------------------------------------

第 7 步:同步

a.同步
 

模式更改前插入的 Sue Slow 行通过脚本版本 my_ver1 进行上载。模式更改后插入的 Mo Hamid 行通过脚本版本 my_ver2 进行上载。各行通过 my_ver2 的下载游标进行下载。

模式更改现已完成,您可以继续正常同步。

end-----------------------------------------------------------------------------------------------------------------------------------------------

 

posted on 2012-02-08 21:13  地下室的流星雨  阅读(3474)  评论(0编辑  收藏  举报