前言
本文将从一个数据库程序员的角度介绍sybase公司出品的SQL Anywhere Studio(SAS) 6.0.3 for Linux的特征、强项、弱项、安装和管理技巧,并给出一个精美的例子。如果你用C语言程序员,你可以从本文介绍的SQLC入门教材获益匪浅。
Sybase是SQL数据库管理系统中著名老牌产品之一。事实上,微软的SQL Server最早是一个移植到DOS/Windows平台的Sybase产品。自从两公司分手,Sybase一直专长于Unix系统,当数据库和其他企业应应开发商都认为Unix行将终结而NT取得市场地位时,Sybase仍继续在1997和1998专著于Unix,结果它本性未改并在1998年的业界移植到Linux的狂热中,将其企业服务器的旗舰产品ASE(Adaptive Server Enterprise)移植到Linux上,过多的与RedHat、caldera和SuSE捆绑的评测软件包以及可以证明Sybase对Linux社团的支持。
Sybase新近发布了SQL Anywhere Studio 6.0.3,它是一套捆绑ASE及其工具的集成套件。6.0.3版最终增加与RedHat 6.0兼容性。现在,RedHat 5.x和6.x是唯一支持的平台,但是Sybase称支持Caldera、OpenLinux和SuSE等官方发行版本的工作也正在进行。
缩略词汇表
SQL:
Structured Query Language / 结构化查询语言
DBMS: Database
Management System / 数据库管理系统
ASE: Adaptive
Server Enterprise / Sybase数据库产品
SAS: SQL Anywhere
Server / Sybase数据库集成工具
RAM: Random
Access Memory / 随机存取记忆
bash: Bourne
Again Shell / : 一种Linux系统的Shell
ISQL: Interactive
SQL / 交互式结构化查询语言
UI: User
Interface / 用户接口
GNOME: GNU Object
Modeling Environment / GNU对象建模环境
JDK: Java
Development Kit / Java 开发工具包
JVM: Java Virtual
Machine / Java 虚拟机
JDBC: Java
Database Connectivity / Java 数据库连接
URL: Universal
Resource Locator / :通用的的资源定位器
HTML: Hypertext
Markup Language / 超文本标注语言
SQLC: SQL in C /
SQL in C
PSM: Procedural Stored Model /存储过程模型
SQLJ: SQL in Java
/ Java语言的SQL
BLOB: Binary
Large Objects / 大型二进制对象
CLOBs: Character
Large Objects / 大型字符对象
XML: Extensible
Markup Language / 可扩展的标注语言
jar: Java Archive
/ Java 归档文件
stdout: Standard
Output / 标准输出设备
stderr: Standard
Error / 标准出错设备
API: Application
Programming Interface / 应用编程接口
GTK: Gimp Toolkit
/ Gimp工具箱
KDE: K Desktop
Environment / K桌面环境
DBA: Database
administrator / 数据库管理员
ODBC: Open
Database Connectivity / 开放数据库连接
Tcl: Tool Command
Language / 工具命令语言
SQSH: SQL Shell /
结构化查询语言外壳程序
PHP: PHP
Hypertext Processor / PHP 超文本处理器
TDS: Tabular Data
Stream / 表格化数据流
安装和设置
我在两台机器上安装SAS 6.0.3测试网络工作组功能。我首先在在一台96MB内存的奔腾400运行RedHat
6.0的机器上安装SQL服务器。光盘中有一个安装脚本启动一个全屏幕字符菜单的安装程序(见图1)。我用root用户运行该脚本。首先,我被要求选择一个要安装的部件(我选了Adaptive
Server Enterprise 6.0.3);接下来我选择在部件以内被给包裹的选择(我选择了网络服务器,它包含一个SQL
Remote的Personal Server,并且表明了我想要Java支持)。它给出一个正在安装文件的提示,然后询问我的名字、公司和许可证的类型。
图1 SQL服务器安装程序
然后怪事发生了,安装脚本开始安装Sybase Central(Java控制面板),但接下来报错目录$SYBASE不存在,在安装前,我已经指定了/opt/sybase-ase6作为安装目录,因此我期望脚本能相应地设定$SYBASE环境变量,但它建议/opt/sybase作为默认目录,与原来建议的默认目录/opt/SYBSase6不同。
结果,我不能肯定安装是否确实要求Sybase Central在另一个不同的地点。我继续并且重新指定/opt/sybase-asa6。一切看上去正常,但是这点混乱Sybase应该能很容易地避免并纠正。
接下来返回组件菜单,从那里我选择结束安装,然后在我的个人用户帐目定义$SYBASE,并将$SYBASE/bin增加到PATH,/$SYBASE/lib增加到LD_LIBRARY_PATH中。对bash用户,命令是:
$ export SYBASE=/opt/sybase-asa6
$ export PATH=$PATH:$SYBASE/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SYBASE/lib
然后我浏览了quick-start/tutorial目录下的README.1ST文件,用下面的命令启动一个数据库例子:
$ dbeng6 asademo.db
不要在命令行后加&以后台进程来运行服务器,相反,用选项"-gu"以守护进程方式运行。
Interactive SQL的安装
然后我打开全屏字符模式查询界面,在另一窗口运行dbisql命令启动Interactive
SQL(ISQL),ISQL寻找运行的本地服务器,如果它找到,自动联接,当然首先询问你的用户名和口令当然。从ISQL,我执行一个简单的查询:
select * from employee
查询结果见图2。
SQL键盘命令表
F1:Help
/ 帮助
F5:Scroll data
display left / 向左滚动数据显示
F6:Scroll data
display right / 向右滚动数据显示
F9:Execute the
SQL query you have entered / 执行你的输入的SQL查询
F10 :Activate the
menus / 激活菜单
Ctrl+PgUp :Move to top
of data display / 移到数据显示的顶部
Ctrl+PgDn :Move to
bottom of data display / 移到数据显示的底部
图2 Select查询的结果
注意你必须按F9键来执行查询。这只是几个老式键盘和图形用户界面的选择之一,可惜这表明Isql有些陈旧。鼠标器在运行GNOME终端的bash控制台上不能工作。但它有时能很精确地确定你在点按的位置。
ISQL包含一个界面执行SQL查询,并且它也能用于其他很多数据库管理任务。但是Sybase也在新的Sybase
Central Java Edition(Java版Sybase Central)中提供了一个更人友好的数据库管理接口。为了运行它,你必须有一个能工作的JDK,不幸的是,JDK还不是RedHat或其他Linux发行版本的核心部件。我使用Blackdown移植计划(参见附录)的jdk117_v3。注意Sybase
Central使用JDK 1.1版,这样就不需要最新的Blackdown或其他JDK 1.2版。
$SYBASE/sybcentral32/java/scjview
你首先要注意的是Sybase Central显示有些不清晰的字体(见图 3 ),这很可能是JVM而不是应用的问题,但是如果应用允许字体的更改就更好了。 Sybase宣称正在解决此问题。下面的屏幕快照是连接上面已经启动的数据库服务器例子的情形。你必须用主机名或IP地址指定服务器。端口是标准的Sybase端口(2638 ),并且数据库名字是asademo。这确实只是连接一个JDBC查询的前端,该JAVA查询设置数据库连接的URL并初始化强大的类集合以树状结构显示各种数据库组件(我们以后将看见本文中用到的一些底层JDBC)。应用使用Swing Java用户接口类(Sybase自带,因此没有必要单独下载他们),并且你能在运行时刻改变外观。不幸地,这些显示选项没有改进字体的选择。
图3 用Sybase Central Java Edition连接样本数据库
在CD-ROM上软件包有优秀文档,它以HTML形式被组织很好并且交叉参考。Sybase确实尽力使用户快速而容易进入软件包,并且它在文档方面显示出了这种努力。
SQLC编程-将SQL嵌入C语言
大多数数据库管理系统引擎现在都支持C和C++代码中嵌入SQL查询。Sybase使它更简单。不幸的是,提供的例子不必兜圈子,也不必为各种的操作系统包含一个条件章节的大全。我开始便写设计运行在Linux上一个更直接例子,你将在它下面找到:
如果你对SQLC还不熟悉,你要注意的第一事情是散布在代码中以EXEC
SQL开始的非C语言语句,这些是特殊的指令,SQLC预处理器知道是静态语句(static
statements),这个预处理器将这些语句转换为正确的C代码,他们引用DBMS库函数以便在数据库引擎上执行命令。因为他们是硬编码(hard-coding)到结果目表代码,因此他们是静态语句。
SQLC功能强大的部分是特殊声明的C变量,它能直接被嵌入到SQL语句以接受结果,或把变量传递给运行时刻(runtime)询问。这样的变量被看作主机变量(host
variables),在上面例子中在fetch_rows函数重使用主机变量将查询结果从查询传递给标准C变量。
EXEC SQL FETCH RELATIVE 1 C1
INTO
:emp_id, :name, :sex, :birthdate;
emp_id、name、sex和birthdate是基本C指针,包含查询返回值。这种情况下,查询准备从以前用下列语句设置的光标中获取下一行值。
EXEC SQL DECLARE C1 CURSOR FOR
SELECT emp_id, emp_fname || ' ' ||
emp_lname, sex, birth_date
FROM "dba".employee;
表达式emp_fname || ' ' || emp_lname连接两个字符类型的列emp_fname和emp_lname,变成一个字符串值,从查询返回值。
为了使这个例子工作,拷贝例子源码到一个文件listing1.sqc中,并且运行SQLC预处理器:
$ sqlpp listing1.sqc
为了使这个例子工作,拷贝例子源码到一个文件listing1.sqc中,并且运行SQLC预处理器:
$ sqlpp listing1.sqc
它输出一个C文件listing1.sqc,你必须编译它,特别小心地指定相关的库和包括文件目录:
$ cc -Wall -I$SYBASE/include/ -L$SYBASE/lib/ -ldblib6 -ldbtools6 -o listing1 listing1.c
产生一个可执行文件listing1。在运行它之前,保证有一台引擎运行范例数据库:
$ dbeng6 asademo.db
它的输出应该是这样的:
Java内幕
我在另一篇关于Oracle 8.0.5介绍中讨论过JDBC,在Sybase中使用JDBC十分类似(当然这是JDBC的主要目标之一)。然而,主要的数据库管理系统供应商在一个更专利的基础上一直在竞争的一个领域Java存储过程(JAVA
stored procedure)。例如 PL/SQL 过程我在Oracle的文章有所论述,它允许用户创造能存储在数据库中的特定例程,与数据协作,这在客户端查询中允许更加成熟和定制特性。
Sybase支持传统的存储过程、程序存储模型和Transact-SQL方法,但是它也允许存储过程甚至使用JAVA重写的扩展类型。注意,Sybase确实至今还不允许对应于JAVA的SQLJ(SQLC对应C/C+)。Sybase的Java存储过程使用JDBC,并且是不比客户端的Java开发困难。
Sybase的Java存储过程仍不支持一些有用的JDBC数据类型,包括大二进制对象(BLOB)、大字符对象(CLOB
)和数组。有希望的是,Sybase将不久支持这些,特别是CLOB对集中XML文件存储是非常有用的。
为了对Java存储过程有个印象,我写了下列代码:
增加一个存储过程或函数看起来很简单。你写出类并且导入(import)适当的包(package),然后简单地编写过程或函数,把这些过程或函数作为公共类的静态方法存储器来(对数据库存取使用JDBC)。在我们的例子中,我们定义函数GetContactBuddy,它取一个整数并且返回一个整数。
我使用了Sybase自带样品数据库,它包含雇员、部门和合同的表(table)。我小小的演示函数的想法是我们决定了在我们的公司实现一个伙伴系统,所有的合同都有一个基于地理位置雇员伙伴。基本上,我们用与邮政编码相同的合同号挑选雇员。Java函数帮助我们选择。如果你传来一个合同号,它将返回一个位于相同邮政编码的一个雇员标识符(如果有),当然如果没有,我就能用一个连接(join)从单独的查询得到结果:
select e.emp_id from employee e, contact c where e.zip_code = c.zip
但是那将是更加没趣。
为了使用该函数,我们必须首先编译它,将上面代码拷贝到listing3.java,并且运行命令:
$ javac listing3.java
另外,你需要JDK 1.1.x并在CLASSPATH中包括$SYBASE/java/asajdbc.zip。当然,上述命令生成listing3.class。
现在,我们在样品数据库中登记它。通过Sybase Central我们很容易做到,在树状图中沿着asademo/Java
Objects路径,点击Add Java Class或Jar图标。Java Wizard(Java向导)将询问你是否登记一个类或一个Java归档(jar),然后你指定类文件的路径,全部搞定。
你能通过标准SQL语句调用函数,运行ISQL并且进入命令窗口:
select listing3>>GetContactBuddy('7')
它被当作常规的SQL选择,从函数返回整数值。如果你正在使用样品数据库,回答应该是409。如果我们的类定义成一个过程(一个没有返回方法)。我们能这样调用它:
call java_class>>method_name(arguments)
你可能注意了Java代码中的打印语句,例如:
System.out.println(zip);
并且你可能一直想知道他们的输出在哪儿出现。存储过程将数据库引擎的stdout和stderr作为控制台,因此如果你到正在运行dbeng6的终端,你将看见输出。如果有任何异常,你也将看见栈跟踪。
所有这些似乎足够直观,但是我在简单的存储过程编程中的掩盖了巨大的烦恼,他们大多数确实应该提一提。
所有这些似乎足够直观,但是我在简单的存储过程编程中的掩盖了巨大的烦恼,他们大多数确实应该提一提。
不足
首先,Sybase Central慢地惊人。我猜想这是使用远程数据库API和Java造成的不可避免的后果之一,但是不提太痛苦了。也许Sybase能通过开发一个GTK、KDE或WxWindows版本的界面,才能更好地向Linux爱好者展示。
另一个问题是我只能通过在Sybase Central树状途中的asademo/Java
Objects/Packages路径定位我登记的类,问题是几乎所有sun(故意用双关语)下面的Java类也出现在该表中,它与极慢的滚动一起,使得寻找一个特定类的要求变得难上加难。而且,自从你通过类图标的属性菜单将任何改动再装入到你的过程后,当开发并调试你的代码时,你可能必须多次进行这种搜索。侥幸的是,存储过程使用JDBC,因此围绕此问题还有一个好方法:给你的类增加main以允许他们成为远程应用的实用手段。这允许你在不得不在数据库登记他们而遇到麻烦前,用一个简单的编译/执行周期即可捕捉许多臭虫,但是这个解决办法有点奇特,考虑产品是一个数据库管理系统,并且DBMS应当帮助管理你的数据。Sybase并没有说它为解决提到的大量问题而正在研制过滤器。
至于ISQL,我发现,如果我改变了服务器端的代码,ISQL直到我重新连接到数据库才识别出变化。这实际上式一件好事-它保证正在运行的应用将不会突然发现他们的服务器端组件自行改动。但是它没被文档记录,并且我浪费了一些时间尝试弄明白为什么我的改变没被客户登记。我也发现了如果你在一个过程或函数使用错误的参数类型或数量,服务器将返回一个“过程没找到”的错误。我想这是因为他们使用一个乱名(name-mangling)技术以允许过程名字的多态性。但是这在数据库存储过程的上下文有些混乱。再者,后端好像不提供标准Java包装(wrapper)类作为参数的变换器(像Integer和Double那样),用如Integer或Double那样的原语,否则你将遇到“过程没找到”的错误。
但是一旦你熟悉它,使用Sybase SAS的Java存储过程是很容易的,要考虑到它是一种高级特性。
管理
Sybase提供很多基本的数据库管理工具用于安全性、网络连接、数据库复制、存储过程管理等。Sybase
Central以树状结构提供存储过程和用户资料等的数据库信息。Sybase将它的复制代理移植到Linux,它允许DBA把数据库以高度定制的方法复制。然而,Sybase公司还没移植它的复制服务器到Linux平台(尽管它说工作正在进行)。如果你想为你的数据库提供ASE的全部动力,只有到这样的移植成形,否则你无法运行单独在一个不同的平台上运行ASE复制服务器(例如Solaris)。然后你能在Linux系统上运行实际的数据库,使用复制代理的Linux版本。注意那种低频、简单的复制也用SQL
Remote管理而不必干扰一个单独数据库。
Sybase已经努力减少调节和管理企业级数据库管理系统的大部分复杂性。有一个内置的查询优化程序能从早先的询问学习以变得更聪明,动态优化而非要求很多秘传的数据库管理员的绝技,因为DBMS是公开的。最终目标是允许非数据库管理能有效地运用数据库。Sybase完成一部分这个值得称道的目标,甚至从版本6.0.3开始消除一些缺陷,例如,为一个使用-c选项启动的SQL服务器实例(instancs)调节缓存大小,过去一直很重要(一般到期望的数据库最大尺寸的大约20%)。也有必要使用-p选项增加网络包尺寸,现在这样的参数设置有更加智能化的默认值。
结论与一些工具
有很多Sybase第三方Linux程序。如果你希望使用ODBC,Openlink的ODBC驱动程序是一个好选择。Pathon用户可以结合像Marc-Andre
Lemburg的mxODBC模块来访问Sybase,因为Python没有直接的捆绑。Tcl用户有点幸运:他们有Tom
Poindexter的Sybtcl,它是Tcl的一个原生Sybase库。Scott Gray编写了SQSH,它是一个很受欢迎的ISQL替换品,它设计成仿真典型的Unix外壳。Martin
Mevald用PHP编写了一个简单的基于Web的查询接口。Walter Rawdanik最近提出了SybSQL,一个用Qt工具包编写的SQL编辑器,它用TDS协议连接Sybase
ASE或Microsoft SQL Server。最后,有一个免费软件方案-FreeTDS,它创建一个库在报文级表格式数据流来访问Sybase。当Sybase没有一个Linux客户时,这显得更加关键,但是为了Sybase数据库写操作更有效,底层的工具仍然是好方法。微软的SQL
Server,它从Sybase继承了TDS,所以也能使用 FreeTDS被访问,请参见附录资源连接。
有一件事情是相当清楚:Sybase for Linux必Oracle 8.0.5 for Linux或DB2 6.0
for Linux更容易安装、设置和管理。一般地讲,可亲近性(accessibility)使得Sybase更引起人们的注意,我向没有安装和维护方面顶尖数据库管理员经验的部门和组织推荐Sybase。Sybase服务器的Central确实仍然在可用性的方面需要一些工作。一个好即时Java编译器(just-in-time
Jave compiler)也许能帮助改进其性能;但是 Sybase应该理会像在视图终提供过过滤器这样的细节。Sybase的可亲近性扩大到了它的编程接口,但是JDBC驱动程序中缺乏对CLOB、BLOB和数组的支持使人们怀疑Java组件的成熟程度,目前缺乏SQLJ也是如此。这不应该有什么担心,除了最高级Java数据库程序员,但是那些在痛苦边缘人们可能会考虑Oracle或
Db2跟多的Java特性。总之, Sybase的加入广受Linux世界的欢迎,它为可能不能幸运地雇用到企业数据库管理员的人提供企业数据库管理系统。
附录:参考文献
Sybase:
http://sybase.com/
Sybase SQLAnywhere:
http://sybase.com/products/anywhere/index.html
"Oracle on Linux," Uche Ogbuji (LinuxWorld, May 1999):
http://www.linuxworld.com/linuxworld/lw-1999-05/lw-05-oracle.html
The public Sybase NNTP server, with the forums sybase.public.sqlanywhere.linux
and sybase.public.sqlserver.linux:
news://forums.sybase.com
The Blackdown JDK port:
http://www.blackdown.org
Linux ODBC drivers and connectivity software:
http://www.openlinksw.com/
Web-based query interface:
http://www.penguin.cz/~martinmv/websql/
Library for Sybase's wire-level protocol:
http://www.freetds.org/
Python ODBC library:
http://starship.skyport.net/~lemburg/mxODBC.html
Linux ISQL replacement:
http://www.voicenet.com/~gray/sqsh.html
Tcl Interface to Sybase:
http://www.nyx.net/~tpoindex/tcl.html#Sybtcl
Qt Sybase SQL Editor:
http://www.megsinet.net/~agatka/
——摘自:Linuxworld