在进行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-----------------------------------------------------------------------------------------------------------------------------------------------