Sybase 数据库技术大全:全面解析 Sybase 数据库技术 (sybase 数据库技术大全)

Sybase 数据库是一款非常流行的关系型数据库管理系统,该数据库具有高效性能、可靠性、安全性和可伸缩性等诸多优势。本文将从Sybase数据库的历史、版本、架构及其优势等方面对Sybase数据库进行全面解析。

一、Sybase数据库的历史

Sybase数据库是由 Sybase 公司在1984年推出的一款数据库管理系统,最初是面向UNIX系统的,后来又逐渐扩展到其他操作系统平台。1990年,Sybase公司推出了之一个关系型数据库管理系统 Adaptive Server Enterprise(ASE),之后,Sybase继续推出了Sybase IQ(用于商业智能分析)、Sybase Replication Server(实时数据复制)和Sybase PowerDesigner等产品。

在过去的几十年中,Sybase数据库不断升级和改进,以适应不同的业务需求。 Sybase公司于2023年被 SAP 收购,Sybase数据库也被 SAP 常用的数据库产品之一,广泛应用于金融、能源、制造业、航空、物流等不同行业领域。

二、Sybase数据库的版本

Sybase数据库目前有多个版本,如ASE、SYC、SQL Anywhere等版本,其中 ASE是最为流行的版本。ASE目前的最新版本是 Sybase ASE 16.0,该版本在原先版本的基础上增加了许多新特性和改进,包括更多的安全性控制、自动诊断和监视、简易部署等功能,大大提高了系统的可靠性和性能。

其他版本,如SYC(Sybase IQ)和SQL Anywhere也在不断升级和改进,支持更多的应用场景和业务需求。

三、Sybase数据库的架构

Sybase数据库的架构可以分为两层,即客户端和服务器端。客户端包括Sybase的工具、ODBC驱动和API,因此可以支持多个客户端。服务器端包括Sybase服务器、数据库和共享内存(shared memory)等组件。

Sybase服务器包括主控线程(MCT)、I/O线程、网络线程和处理线程等,用于实现并发的性能优化,同时可以根据业务需求进行多实例构建。数据库方面,Sybase数据库采用B+树作为索引,以提高查询效率,同时还支持VxFS、Raw Device和NetBackup等常用的数据存储策略。

四、Sybase数据库的优势

1. 高性能:Sybase数据库采用先进的多线程架构和优化算法,可以支持高并发、低延迟的数据处理,满足高速事务处理和大量查询需求。

2. 可靠性:Sybase数据库采用可靠的ACID事务,确保数据的一致性性和完整性,并支持备份和恢复工具,避免数据丢失风险。

3. 安全性:Sybase数据库支持多种身份验证和访问控制机制,如SSL加密、Kerberos身份验证、IP地址过滤等方式,可以有效避免数据库被攻击和数据泄露。

4. 可伸缩性:Sybase数据库支持多实例构建、分区和复制等机制,可以根据业务需求灵活扩展数据库,支持快速数据应用和分布式部署等场景。

5. 易用性:Sybase数据库提供了可视化的管理工具、SQL查询工具和API,支持多种编程语言以及与其他数据源的集成,方便用户快速高效地管理和查询数据。

Sybase数据库是一款强大的数据库管理系统,具有众多优势,已被广泛应用于各行业领域。不仅仅是因为其高效性能、可靠性、安全性和可扩展性等优势,更是因为Sybase数据库不断升级和改进,以满足不同用户的业务需求,成为企业数据管理的重要组成部分。

相关问题拓展阅读:

oracle sql与sybase sql

oracles

Sybase C程序快速移植到Oracle Pro*C程序吗?

原理

Sybase的C程序转换到Oracle的Pro*C程序,相对于其他类型的转换有很多优势(原谅我挑了可能是最简单的一种转换):

Sybase程序采用的是C函数调用的方式,这给将Sybase程序转换到其他任意一种数据库程序带来了很大的方便!仅仅需要使用目的数据库的语法,实现老程序使用到的Sybase函数就可以了!并且不需要对原来的C程序进行任何逻辑方面的修改!

Oracle的Pro*C提供了动态sql的开发方式,这给移植带来了极大的方便。

Oracle Pro*C与Sybase同样提供进程多连接方式。

Oracle 9采用parse=full的编译选项时,C的定义变量可以直接在EXEC SQL中使用,这给程序的编写方便了不少。

还有其他优势,不再一一列举。

三、实现

针对Sybase的几个主要函数,下面概述处理办法,具体的实现参照源代码:

dbinit():该函数仅仅将针对数据库操作的一些变量进行初始化。

一些用户名、密码的设置,没有太多可说的。比较简单。

dbopen():该函数实际进行数据库的连接,在连接过程中,我设置了全局变量AllOpenProcess用于保存所有的连接指针,并产生了一个连接串用于标识该连接。保存于全局变量中是因为Sybase函数dbexit没有输入参数。

dbcmd():该函数进行sql语句的分析,以便进一步进行判断。

dbexec():该函数进行命令的执行(不太清楚为什么Sybase将该函数与dbcmd分开)。对无返回结果集的命令(insert、update、delete)直接通过EXEC SQL AT EXECUTE IMMEDIATE的语法执行。对与存在返回结果集的select,采用oracle动态sql4的方法进行处理。因为时间以及老的程序的关系,本函数的实现仅仅针对了传入完整sql语句的字符串。

dbresults():判断返回结果。

dbbind():绑定存储值的地址,并判断传入的类型是否正确。因为老程序仅仅使用了NTBSTRINGBIND类型,所以示例中也仅仅处理了此种类型。

dbnumcols():返回数据列数目,在语句类型为select时有效。

dbnextrow():取得下一条数据值,并填写到dbbind所绑定的地址空间内。此处需要根据源类型select_dp->T以及目标类型进行相关的数据转换。

dbdead():判断数据库连接是否正常。采用从DUAL表中取值的方式来测试。

dbexit():退出数据库连接。

还有其他很多函数,但是因为我没有使用到,嘿嘿,就不作实现了。

四.移植

移植的方法很简单,将原来c/c++文件中#include “Sybfront.h” #include “sybdb.h”等引用Sybase头文件的地方去掉,更换为附件中的#include “database_op.h”,同时将附件中database_op.cxx加入到工程中,加上适当的编译语句(PROC),然后去除原来连接sybase的lib,加入oracle的lib:orasql9.lib。就可以在基本不修改源程序的情况下完成程序的移植!当然,如果你的sybase程序采用了非NTBSTRINGBIND类型的话,自己在cxx文罩陪野件中加入相关的处理方式吧!祝好运!欢迎探讨。

五、技巧

下面我总结一些开发过程中使用到的一些小的技巧,各位见笑。如何充分利用 Visual C++ 的开发乱颂环境进行 Pro*C 程序开发:

相信各位对 Visual C++ 的集成开发环境使用比较熟吧,别告诉我你开发 Unix 下的 C/C++ 程序还在使用 vi、UltraEdit、EditPlus 吧!当然了,如果你坚持我也不反对,不过您老此时就不用浪费时间向下翻页了。

oracle 的 Pro*C 程序一般以 PC 结尾。而以 PC 结尾的程序,没法按照 C/C++ 的物喊语法在 Visual C++ 的集成开发环境下显示!只是白纸黑字一片。不像 UltraEdit,可以定制使得 PC 文件按照 C/C++ 的语法显示(在 UltraEdit 安装目录下的 WORDFILE.TXT 文件中包含 “C CPP CC CXX H HPP AWK” 内容的后面加上 “PC” 就可以了)(也许VC有这个功能,不过我没找到)。怎么办呢?简单,修改PC文件后缀为CXX,此时,文件就按照C/C++语法进行显示了!此时,设置该文件属性页(在VC开发环境的WORKSPACE中选中该文件,按 ALT+F7 )中 General 下的 Always use custom build step 为选中状态,Curstom Build 页下的 Commands/Outputs 下参考 oracle 的 example 输入相应的编译选项。记得将对应的PC后缀修改为 cxx 后缀。

database_op.cxx

/*

database_op.cxx

负责兼容 sybase 和 oracle对数据库的操作

*/

#include “stdio.h”

#include “stdlib.h”

#include “string.h”

#include “database_op.h”

#ifdef SYBASE_PLATFORM

/*

* 不需要任何动作

*/

#endif

#ifdef MSSQL_PLATFORM

#endif

#ifdef ORACLE_PLATFORM

EXEC SQL INCLUDE sqlca;

EXEC SQL INCLUDE sqlda;

EXEC SQL WHENEVER NOT FOUND CONTINUE ;

EXEC SQL WHENEVER SQLWARNING CONTINUE ;

EXEC SQL WHENEVER SQLERROR CONTINUE ;

char dyn_statement;

SQLDA *select_dp = NULL;

#define MAXCOLNUM 126

#define MAXCOLVALUE 1024

char chValueBuff={0};

/* Maximum lengths of the _names_ of the

select-list items or indicator variables. */

#define MAX_VNAME_LEN 80

#define MAX_INAME_LEN 80

typedef struct Securepair

{

struct Securepair *next;

char *labelname;

char *labelvalue;

} SECLABELS;

typedef struct loginrec

{

char chLogName;

char chLogPass;

} LOGINREC_STR;

enum SQLTYPE_ENUM{SQL_NULL=0,SQL_SELECT,SQL_INSERT,SQL_UPDATE,SQL_DELETE};

struct dbprocess {

sql_context ctx;

char connName;

/*当前sql语句类型,包括查询select insert update delete,*/

/*通过在sqldata中查找上述字符串获得*/

enum SQLTYPE_ENUM sqltype ;

long rowindex ; /*执行本次sql后,被取出的行的数目/下次需要取出的索引*/

long rownum ; /*本次sql得到的行数目*/

long colnum ; /*当前列数目*/

long sqlerror ;/*SQL语句错误号*/

void * ppbuff ; /*当前绑定了字段的内存地址*/

long pbufftype ;

/*当前sql语句值,在执行后更改上面的rowindex,rownum,colnum*/

char sqldata ;

};

typedef struct dbprocess DBPROC_STR;

DBPROC_STR * AllOpenProcess={0};

EHANDLEFUNC ehandfunc = 0 ;

MHANDLEFUNC mhandfunc = 0 ;

RETCODE dbinit (void)

{

int i ;

if( select_dp ) return SUCCEED ;

if ((select_dp =sqlald (MAXPOINTNUM, MAX_VNAME_LEN, MAX_INAME_LEN)) == (SQLDA *) 0)

{

fprintf(stderr,”Cannot allocate memory for select descriptor.”);

return FAIL;

}

select_dp->N = MAXPOINTNUM;

/* Allocate the pointers to the indicator variables, and the

actual data. */

for (i = 0; i I = (short *) malloc(sizeof(short));

select_dp->V = (char *) malloc(1);

}

return SUCCEED;

}

void errhandlefunc()

{

if( ehandfunc )

(*ehandfunc)(0,0,0,0,””,””) ;

}

void mhandlefunc()

{

if( mhandfunc )

(*mhandfunc)(0,0,0,0,””,””,””,0) ;

}

EHANDLEFUNC dberrhandle (EHANDLEFUNC handler)

{

ehandfunc = handler ;

/* EXEC SQL WHENEVER SQLERROR DO errhandlefunc() ;*/

return 0 ;

}

MHANDLEFUNC dbmsghandle (MHANDLEFUNC handler)

{

mhandfunc = handler ;

/* EXEC SQL WHENEVER SQLWARNING DO mhandlefunc() ;***/

return 0 ;

}

void * dblogin (void)

{

LOGINREC_STR * rec ;

rec = (LOGINREC_STR*)malloc(sizeof(LOGINREC_STR)) ;

if( NULL == rec ) return rec ;

memset(rec,0,sizeof(LOGINREC_STR));

return rec;

}

RETCODE dbsetlname (LOGINREC_STR *lptr,char *values,int type)

{

if( NULL == lptr || NULL == values ) return FAIL ;

if( (DBSETUSER != type) &&(DBSETPWD != type) ) return FAIL ;

if( DBSETUSER == type )

{

if( strlen(values) >= sizeof(lptr->chLogName) ) return FAIL ;

strcpy( lptr->chLogName,values) ;

}

if( DBSETPWD == type )

{

if( strlen(values) >= sizeof(lptr->chLogPass) ) return FAIL ;

strcpy( lptr->chLogPass,values) ;

}

return SUCCEED ;

}

/*

该函数内进行数据库连接尝试

*/

DBPROCESS *dbopen (LOGINREC_STR *logon_ptr,char *servername)

{

int iLen ,iIndex ;

DBPROC_STR * dbprocess ;

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR username;

VARCHAR password;

VARCHAR dbstring;

EXEC SQL END DECLARE SECTION;

if( NULL == logon_ptr ) return NULL ;

dbprocess = (DBPROC_STR*)malloc(sizeof(DBPROC_STR));

if( NULL == dbprocess ) return NULL ;

memset(dbprocess,0,sizeof(DBPROC_STR));

iLen = sizeof(AllOpenProcess)/sizeof(DBPROC_STR * );

for ( iIndex = 0 ; iIndex connName,”conn%d”,iIndex);

break ;

}

}

if( iIndex == iLen )

{

free(dbprocess) ;

dbprocess = NULL ;

}

/*

此处进行连接尝试!!!!!!!!!

*/

strncpy((char *) username.arr, logon_ptr->chLogName, sizeof(username.arr));

username.len = strlen((char *) username.arr);

strncpy((char *) password.arr, logon_ptr->chLogPass, sizeof(password.arr));

password.len = strlen((char *) password.arr);

EXEC SQL CONTEXT ALLOCATE :dbprocess->ctx;

EXEC SQL CONTEXT USE :dbprocess->ctx;

if( NULL == servername )

{

EXEC SQL CONNECT :username IDENTIFIED BY :password AT:dbprocess->connName ;

}

else

{

strncpy((char*)dbstring.arr,servername,sizeof(dbstring.arr) ) ;

dbstring.len = strlen((char*)dbstring.arr);

EXEC SQL CONNECT :username IDENTIFIED BY

:password

AT:dbprocess->connName

USING :dbstring ;

}

if (sqlca.sqlcode = sizeof(dbproc->sqldata) ) return FAIL ;

memcpy( dbproc->sqldata, cmdstring , l_len + 1) ;

strupr(dbproc->sqldata);

dbproc->colnum =0 ;

dbproc->rowindex = 0 ;

dbproc->rownum = 0 ;

memset(dbproc->ppbuff,0,sizeof(dbproc->ppbuff));

memset(dbproc->pbufftype,0,sizeof(dbproc->pbufftype));

/*分析命令类型*/

pSelect = strstr(dbproc->sqldata,”SELECT”);

pInsert = strstr(dbproc->sqldata,”INSERT”);

pUpdate = strstr(dbproc->sqldata,”UPDATE”);

pDelete = strstr(dbproc->sqldata,”DELETE”);

pMin = dbproc->sqldata + strlen(dbproc->sqldata) ;

dbproc->sqltype = SQL_NULL ;

if( (pSelect) && (pSelect sqltype = SQL_SELECT ; }

if( (pInsert) && (pInsert sqltype = SQL_INSERT ; }

if( (pUpdate) && (pUpdate sqltype = SQL_UPDATE ; }

if( (pDelete) && (pDelete sqltype = SQL_DELETE ; }

if( SQL_NULL == dbproc->sqltype )

{

dbproc->sqlerror = -1 ;

return FAIL ;

}

return SUCCEED ;

}

/*

该函数 执行命令

*/

SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。如今无论是像Oracle ,Sybase,Informix,SQL server这些大型的数据库管理系统,还是像Visual Foxporo,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。

SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。他不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录作为操纵对象,所有SQL语句接受作为输入,返回作为输出,这种特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语言可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的一个单独事件只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。

SQL同时也是数据库文件格式的扩展名。

SQL语言包含4个部分:

数据查询语言(SELECT语句)绝耐

数据操纵语言(INSERT, UPDATE, DELETE语句)

数据定义语言(如CREATE, DROP等语句)

数据控制语言(如COMMIT, ROLLBACK等语句)

SQL语言是结构化语言(Structure Query Language)的缩写,是一种用于数据库查询和编程的语言,已经成为关系型数据库普遍使用的标准,使用这种标准数据库语言对程序设计和数据库的维护都带来了极大的方便,广泛地应用于各种数据查询。VB和其他的应用程序包括Access、Foxpro、Orcale、SQL Server等都支持SQL语言。

SQL语言的常用操作有:建立数据库数据表(CREATE TABLE),如本系统中的学生及成绩备份就用到该语句;从数据库中筛选一个记录集(SELECT),这是最常用的一个语句,功能强大,能有效地对数据库中一个或多个数据表中的数据进行访问,并兼有排序、分组等功能;在数据表中添加一个记录(INSERT);删除符合条件的记录(DELETE);更改符合条件的记录(UPDATE);

VB中的数据库操作对象都提供了对SQL语句的支持。其一般的用法是以VB的各种控件接收用户对数据库访问的请求,在事件响应程序代码中滚宏吵将其转换成对数据库的SQL查询语句,并以字符串的形式存在,然后将其传递给相应的数据库操作对象,最终完成对数据库的访问

数据库,顾名思义,是存入数据的仓库。只不过这个仓库是在计算机存储设备上的,而且数据是按一定格式存放的。

当人们收集了大量的数据后,应该把它们保存起来进入近一步的处理,进一步的抽取有用的信息。当年人们把数据存放在文件柜中,可现在随着社会的发展,数据量急剧增长,现在人们就借助计算机和数据库技术科学的保存大量的数据,以便能更好的利用这些数据资源。

要是下定义的话,就应该是:指长期储存在计算机内的、有组织的、可共享的数据。

数据库包含关系数据库、面向对象数据库及新兴的XML数据库等多种,目前应用最广泛的是关系数据库,若在关系数据库基础上提供部分面向对象数据库功能的对象关系数据库。在数据库技术的早期还曾经流行过层次数据库与网状数据库,但这两类数据库目前已经极少使用。

数据库管理

数据库管理(Database Administration)是有关建立、存储、修改和存取数据库中信息的技术,是指为保证数据库系统的正常运行和服务质量,有关人员须进行的技术管理工作。负责这些技术管理工作的个人或集体称为数据库管理员(DBA)。数据库管理的主要内容有:数据库的建立、数据库的调整、数据库的重组、数据库的重大侍构、数据库的安全控制、数据的完整性控制和对用户提供技术支持。

数据库的建立:数据库的设计只是提供了数据的类型、逻辑结构、联系、约束和存储结构等有关数据的描述。这些描述称为数据模式。要建立可运行的数据库,还需进行下列工作:

(1)选定数据库的各种参数,例如更大的数据存储空间、缓冲决的数量、并发度等。这些参数可以由用户设置,也可以由系统按默认值设置。

(2)定义数据库,利用数据库管理系统(DBMS)所提供的数据定义语言和命令,定义数据库名、数据模式、索引等。

(3)准备和装入数据,定义数据库仅仅建立了数据库的框架,要建成数据库还必须装入大量的数据,这是一项浩繁的工作。在数据的准备和录入过程中,必须在技术和制度上采取措施,保证装入数据的正确性。计算机系统中原已积累的数据,要充分利用,尽可能转换成数据库的数据。

注: “数据库”这个词对于不同的人应该给予不同的感觉。如果你是一个最终用户,你根本就不关心数据存储和维护的细节,数据库也不应该拿这些事情来烦你。但是如果你是一个数据库管理员,那么有些细节上的东西你就必须要清楚。数据库管理系统可以为不同的用户提供不同的视图,也就是他们所看到的数据库是不一样的。这就需要进行数据抽象,以形成这些不同的视图。

  最早是在CODASYL的DG报告中完整地给出了数据抽象的三个层次。ANSI/SPARC报告中也提出了类似的建议,这个报告中抽象的层次为内部层、概念层和外部层。但是,现在的数据库管理系统是根据DG的报告从三个层次来进行抽象的,它们分别是物理层、逻辑层和视图层(概念层)。

数据库的种类

大型数据库有:Oracle、Sybase、DB2、SQL server

小型数据库有:Access、MySQL、BD2等。

SELECT COUNT(*),tbb.trans_date, tbb.trans_code

FROM tba,tbb

WHERE tba.trans_code =tbb.trans_code

GROUP BY tbb.trans_date,tbb.trans_code

这样其伏敏链实效拿配果是一样的,sybase不支持缺孙子查询很讨厌

关于sybase 数据库技术大全的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Sybase 数据库技术大全:全面解析 Sybase 数据库技术 (sybase 数据库技术大全)