Sybase SqlAnywhere数据库应用技巧几则

软件世界

在利用PowerBuilder 5.0(以下简称PB)以上版本开发应用单用户版的程序时,普遍采用Sybase SqlAnwhere来作为后台数据库,Sybase SqlAnywhere的SQL语句基本上和Sybase Adaptive Server以及标准SQL一致,而且功能也相当强。使用方便、成本低廉是它的优点,但也存在一些问题,如数据库文件易损坏、安全性差等。下面就笔者开发使用经验得出的下述几点应用技巧和大家探讨。

一、充分利用日志文件

SqlAnywhere数据库由后缀分别为.db和.log的两个文件组成,其中,.db文件是用来存放数据库信息(包括表结构、视图、数据、过程等),.log文件是个日志文件,日志文件的创建、改名、指定、大小限制均可以在Sybase Central中的Change Log File Information工具中完成。日志文件用来记录用户每一次对数据库有影响的操作,例如创建或删除表、视图、触发器等对象,插入、删除、修改表中的数据等。所以只要把.log文件的内容转换成一条条的SQL语句,然后建一个空的数据库,再执行这些SQL语句,则恢复数据的问题就可以解决了。
相信PB开发者都有这样的经验:在编程中打开数据库时,遇到突然断电或不正常关机;在资源管理器或两台微机间拷贝数据库文件时,都有可能破坏SqlAnywhere数据,在配置好ODBC连接数据库,却出现不断提示输入口令,连接失败,还有误操作造成的数据丢失,都可以利用日志文件进行恢复。方法如下:
1.首先建立一个新的数据库:new.db和new.log。
2.使用Sybase Central中的Translate Log工具将旧的日志文件old.log转换为old.sql文件,处理一下此old.sql文件。文件中有几类数据行:
(1)行头加带“%”或者“%%”的注释行,如:
%%CONNECT-1002-"dba"-2002/jan/02 11:09
%%BEGIN TRANSACTION-1002
(2)事务开始与提交行等,如:
BEGIN TRANSACTION
go
COMMIT WORK
go
(3)标准SQL语句行,如:
INSERT INTO "dba".fpjhb(fpbh,bbh,rq,sh,hm,syxd,byxd,bs,bsdl,zbdl,sjdl,dj, bz)
VALUES ('068234','1','1997/feb/01 00:00','F','李茂鹏',4545,4675,1,0,0,130,.879,'非工业')
如果sql文件较大,可先利用文件拆分工具将它分割为较小文件,再利用记事本之类的文本编辑器的查找替换功能找到相应的误操作语句,将它们删除后,保存相应的sql文件。其中前两类数据行一般不必动。
3.去掉old.db、old.log的只读属性,命令为:
attrib -r old.db
attrib -r old.log
4.用新的空数据库文件覆盖被破坏的旧数据库文件,其命令为:
copy new.db old.db
5.用新的日志文件覆盖被破坏的旧日志文件,其命令为:
copy new.log old.log
6.利用Isql从sql文件中读取 SQL 语句并执行
如果sql文件大于1MB时,可能无法在Isql中提交这些sql语句,此时可以利用其他工具进行提交,比如PowerBuilder中的Database Administration或者Dephi的SQL Explorer即可完成整个恢复过程。需要注意不同工具中对sql文件中的书写要求不同。PowerBuilder中的Database Administration中要求sql语句必须要有中止符号──分号,所以,对于Sybase Central中的Translate Log工具导出的sql文件不大适合。Dephi的SQL Explorer基本不用改变什么,只要将菜单中Options中的Query…打开,出现如下窗口后,在Comment styles框中加上“%”即可。
设置完毕后,在连接数据库new.db后在右侧点选鼠标右键菜单中的“load from file …”选项选择处理好的sql文件执行即可。
实际应用中恢复3万多条记录的数据库表大约只需要3分钟。

二、合并同名数据库中的数据

针对单用户的数据应用,有时需要进行数据合并工作。如果库表中数据没有重复记录时,这个过程很简单,直接使用save rows as 文本文件、import文本文件即可完成。但如果有关键字重复的记录时,往往就无法完成了,这时候就需要利用pipeline数据管道,且同时打开两个数据库进程。但默认ODBC设置时,无法实现,需要特别注意如下方法:
因为要合并的两个数据库为同名数据库,所以在配置ODBC时其Data Source Name和Database Name默认情况下一样,要手动进行调整为不同名称,即可实现同时启动两个数据库进程,配置完毕后进行pipeline的设置,选择相应库表,选择updata/add rows一项即可实现数据库合并,而无需担心数据中有关键字重复的记录。

三、更改数据库的默认口令

SqlAnywhere数据库的默认用户名和口令是DBA和SQL,要维护数据库安全,就应当更改口令或用户名,不然密码就形同虚设。
在Sybase central中很容易完成这项任务。连接相应数据库后,在数据库项目列表中,打开users & groups,可以完成添加用户及口令、添加用户组、以及更改DBA口令的工作。
因为Sql Anywhere一般是单机小型应用,通常只用修改dba用户的口令,然后在PBL的open script事件中加入:
SQLCA.DBMS ="odbc"
SQLCA.DbParm= "connectstring='dsn=数据源名;uid=dba;pwd=新口令'"
connect using sqlca;
即可连接数据库,编译成EXE文件后,再将ODBC中的数据源描述UID和PWD内容去掉,你的数据库口令就不会那么容易泄露了。
另外在连接数据库的时候,还有一种方法是use integrated login,即按登录到NT服务器域的用户及口令来登录数据库,如果在数据库创建了同域用户一样的用户和口令,用这一项就可以直接连接数据库。

四、充分利用Sybase central

利用Sybase central可以实现创建数据库、压缩、备份、改变库结构等工作。其中最为实用的是改变库结构。在PB的table画板下或者编程利用动态SQL时不能改变字段类型和长度只能缩小不能扩大的问题,在Sybase central下却可以轻松解决。