远程Sybase数据库技术支持,联系手机:13811580958,QQ:289965371!

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从http://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站http://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 点击这里给我发消息
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

create procedure

说明 创建存储过程或可以带一个或多个用户提供的参数的扩展存储过程

(ESP)


image

注释 注意: 130 页的 “ create function (SQLJ)有关用于创建过程的

SQLJ 命令的语法和用法信息,请参见。

image


语法 create procedure [owner.]procedure_name[;number] [[(@parameter_name datatype [(length) | (precision [, scale])]

[= default][output]

[, @parameter_name datatype [(length) | (precision [, scale])] [= default][output]]...)]]

[with {recompile | execute as {owner | caller}} ] as {SQL_statements | external name dll_name}

参数 procedure_name

是过程的名称。它必须符合标识符规则,并且不能是变量。指定所有 者的名称,以创建由当前数据库中的其他用户拥有的另一个同名过 程。 owner 的缺省值是当前用户。

;number

是一个可选的整数,用于将同名的过程分成一组,以便能用单个 drop procedure 语句一并删除它们。同一应用程序中使用的过程经常用此 方法分组。例如,如果将与名为 orders 的应用程序一起使用的过程命 名为 orderproc;1orderproc;2 等等,则以下语句将删除整个组:

drop proc orderproc

一旦将过程分组,就不能单独删除组中的过程。例如,以下语句是不 允许的:

drop procedure orderproc;2

如果在已评估的配置中运行 Adaptive Server,则不能对过程分组。已 评估的配置要求不允许过程分组,以便每个存储过程都有唯一的对象 标识符,并可单独删除。如果不允许过程分组,系统安全员必须用 sp_configure 重新设置 allow procedure grouping。有关已评估配置的详细 信息,请参见 《系统管理指南》。


parameter_name 是该过程的参数名。过程执行时,提供每个输入参数的值。在 create procedure 语句中,参数名是可选的 过程不需要带任何参数。

参数名前面必须带有 @ 符号,且必须符合标识符的规则。参数名

(包括 @ 符号)最长为 30 个字符,标识符则更长。参数局限于过 程:同一参数名可用于其它过程。

如果参数的值包含非字母数字字符,则必须用引号将其引起来。这包 括数据库名或所有者名限定的对象名,因为它们包含一个句点。如果 字符参数的值以数字字符开头,则还必须用引号将其引起来。

datatype[(length) | (precision [, scale])]

是参数的数据类型。请参见 《参考手册:构件块》 1 章 “系统数 据类型和用户定义的数据类型” 42 页的 “用户定义的数据类 型”。存储过程参数的数据类型不能为 textunitext image,也不能 是基础类型为 textunitext image 的用户定义数据类型。

charvarcharunicharunivarcharncharnvarcharbinary varbinary 数据类型应该在括号中包括 length。如果省略了 lengthAdaptive Server 会将参数值截断为 1 个字符。

float 数据类型需要一个括在括号中的二进制 precision。如果省略了

precisionAdaptive Server 将为平台使用缺省精度。

numeric decimal 数据类型需要 precision scale,用括号括起来并用 逗号分隔。如果省略了 precision scaleAdaptive Server 将使用缺省 的精度 18 和标度 0

default

定义过程参数的缺省值。如果定义了缺省值,则用户无需提供参数值就 可以执行过程。缺省值必须是一个常量。如果过程使用带有关键字 like 的参数名 (请参见示例 2),则缺省值可包括通配符 %_[ ] [^]

缺省值可以为 NULL。过程定义可以指定如果参数值为 NULL 时应采 取的操作 (请参见示例 3)。

output

表示该参数是返回参数。它的值可以返回给调用该过程的 execute 命 令。使用返回参数向调用过程返回信息。

若要从多级嵌套过程返回参数值,则每个过程必须包含带参数名的

output 选项,同时包含调用最高级别过程的 execute output 关键字可以缩写为 out


with recompile

表示每次执行过程时, Adaptive Server 都会创建新计划。当预计过程 的执行不规则时,即需要新计划时,使用该可选子句。 with recompile 子句对扩展存储过程的执行没有任何影响。

with execute as 指定是以所有者还是调用方身份执行过程。以所有者身份执行时,对 照过程所有者的特权检查过程内的所有操作。以调用方身份执行时, 对照过程调用方的特权检查过程内的所有操作。

owner

以过程所有者身份检查运行时权限、执行 DDL 以及解析对象名称。 也支持将 execute as definer 作为替代语法。

caller

以过程调用方身份检查运行时权限、执行 DDL 以及解析对象名称。 也支持将 execute as invoker 作为替代语法。

SQL_statements 指定过程要进行的操作。可以包含任何数量和任何种类的 SQL 语句, create view create default create rule create procedure create trigger use 除外。

create procedure SQL 语句通常包含控制流语言,其中包括以下一项或 多项:declareif...elsewhilebreakcontinuebegin...end goto labelreturnwaitfor /* comment */ 。它们还可引用为过程定义的参 数。

SQL 语句可以引用另一个数据库中的对象,只要是正确限定的即可。

external name

创建扩展存储过程。不能将 number 参数与 as external name 一起使用。

dll_name

指定动态链接库 (DLL) 或共享库 (包含实现扩展存储过程的函数) 的名称。指定 dll_name 时可以不使用扩展名,也可使用平台特定的扩 展名,例如在 Windows NT 上使用 .dll,在 Sun Solaris 上使用 .so。如 果指定了扩展名,请用引号将整个 dll_name 引起来。

示例 示例 1 给定一个表名,过程 showind 会显示该表的名称和该表中任何列 上的任何索引的名称和标识号:

create procedure showind @tabname varchar (30) as

select sysobjects.name, sysindexes.name, indid from sysindexes, sysobjects

where sysobjects.name = @tabname and sysobjects.id = sysindexes.id


下面是执行 showind 的可接受的语法形式:

execute showind titles

execute showind @tabname = "titles"

或者,如果这是文件或批处理中的第一条语句:

showind titles

示例 2 如果用户不提供参数,则此过程将显示有关系统表的信息:

create procedure

showsysind @table varchar (30) = "sys%" as

select sysobjects.name, sysindexes.name, indid from sysindexes, sysobjects

where sysobjects.name like @table and sysobjects.id = sysindexes.id

示例 3 此过程指定当参数为 NULL (即用户未提供参数)时要采取的操 作:

create procedure

showindnew @table varchar (30) = null as

if @table is null

print "Please give a table name" else

select sysobjects.name, sysindexes.name, indid from sysindexes, sysobjects

where sysobjects.name = @table and sysobjects.id = sysindexes.id

示例 4 此过程将两个整数参数相乘,然后在 output 参数 @ result 中返回它 们的乘积:

create procedure mathtutor @mult1 int, @mult2 int,

@result int output as

select @result = @mult1 * @mult2

如果给过程传递三个整数,则执行过程时 select 语句将计算乘积并赋 值,但不会显示返回参数:

mathtutor 5, 6, 32

(return status 0)

示例 5 过程和 execute 语句都包含带一个参数名的 output,因此过程可 以为调用方返回一个值:


declare @guess int select @guess = 32

exec mathtutor 5, 6, @result = @guess output

(1 row affected) (return status = 0)


Return parameters:


@result

- ----------

30

execute 语句中的输出参数 @result 和任何后续参数都必须以如下形式传 递:

@parameter = value

无论返回参数值更改与否,都始终报告该值。

@ result 不必在调用批处理中声明,因为它是要传递到 mathtutor 的 参数的名称。

虽然 @ result 的更改值在 execute 语句中指派的变量 (此例为

@guess )中返回给调用方,但它将在其本身的标题 (@result ) 下显 示。

示例 6 可以在批处理或调用过程中的其它 SQL 语句中使用返回参数。本 例说明如何在 execute 语句后的条件子句中使用 @ guess 的值,方法是在 过程调用时把它用另一个变量名 @ store 存储。如果返回参数用于属于 SQL 批处理的 execute 语句,则在执行批处理中的后续语句前,将输出 带有标题的返回值。

declare @guess int declare @store int select @guess = 32 select @store = @guess

execute mathtutor 5, 6, @result = @guess output select Your_answer = @store, Right_answer = @guess if @guess = @store

print "Right-o" else

print "Wrong, wrong, wrong!"

(1 row affected)

(1 row affected) (return status = 0)


Return parameters:


@result

--- --------

30

Your_answer Right_answer

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

32 30


(1 row affected) Wrong, wrong, wrong!

示例 7 创建名为 xp_echo 的扩展存储过程,过程的输入参数是 @ in,回应 的输出参数是 @ out。过程代码位于名为 xp_echo 的函数中,该函数编译 并链接到一个名为 sqlsrvdll.dll DLL 中:

create procedure xp_echo @in varchar (255),

@out varchar (255) output as external name "sqlsrvdll.dll"

示例 8 使用 execute as owner 子句创建过程。Jane 创建了过程,Bill 只需 execute 权限便可运行该过程。 Jane 创建并拥有 emp_interim 表。如果 Jane 没有 create table 权限,过程将失败:

create procedure p_emp

with execute as owner as select * into emp_interim from jane.employee

grant execute on p_emp to bill

示例 9 使用 execute as caller 子句创建过程。 Jane 创建了过程, Bill 需要 execute 权限来运行该过程。Jane 同时拥有 p_emp jane.employeeBill 需要 jane.employee select 权限。 Bill 创建并拥有 emp_interim 表。 Bill 必须具有 create table 权限:

create procedure p_emp

with execute as caller as select * into emp_interim from jane.employee

grant execute on p_emp to bill

示例 10 使用引用名称未限定对象的 execute as owner 子句创建过程。Jane 创建了过程,Bill 执行过程。Adaptive Server 将搜索 Jane 拥有的名为 t1 的表。如果 jane.t1 不存在,Adaptive Server 将查找 dbo.t1。如果 Adaptive Server t1 解析成 dbo.t1,则必须为 Jane 授予向 t1 插入内容的权限:

create procedure insert p with execute as owner as

insert t1 (c1) values (100) grant execute on insert p to bill


示例 11 使用引用名称未限定对象的 execute as caller 子句创建过程。Jane 创建了过程, Bill 执行过程。 Adaptive Server 将搜索 Bill 拥有的名为 t1 的表。如果 bill.t1 不存在, Adaptive Server 将查找 dbo.t1。如果 Adaptive Server t1 解析成 dbo.t1,则必须为 Bill 授予向 t1 插入内容的权限:

create procedure insert p with execute as caller as

insert t1 (c1) values (100) grant execute on insert p to bill

示例 12 使用在其它具有完全限定名的数据库里调用嵌套过程的 execute as owner 子句创建过程。 Jane 创建了过程, Bill 执行过程。与 Jane 关联的登 录名解析成 otherdb 中的用户 JaneAdaptive Server 检查 otherdb 中的用户 Jane jim.p_child 是否具有 execute 权限。如果 jim.p_child 使用了 execute as owner 来创建,则以 Jim 的身份执行 p_child。如果 jim.p_child 使用了 execute as caller 或没用 execute as 子句来创建,则以 Jane 的身份执行 p_child

create procedure p master with execute as owner

as exec otherdb.jim.p_child grant execute p master to bill

示例 13 使用在其它具有完全限定名的数据库里调用嵌套过程的 execute as caller 子句创建过程。Jane 创建了过程,Bill 执行过程。与 Bill 关联的登录 名解析成 otherdb 中的用户 BillAdaptive Server 检查 otherdb 中的用户 Bill jim.p_child 是否具有 execute 权限。如果 jim.p_child 使用了 execute as owner 来创建,则以 Jim 的身份执行 p_child。如果 jim.p_child 使用了 execute as caller 或没用 execute as 子句来创建,则以 Bill 的身份执行 p_child

create procedure p master with execute as caller

as exec otherdb.jim.p_child grant execute on p master to bill

用法 为了避免看到因设置更改而引起的意外结果,请先将 set rowcount 0 作为初始语句运行,然后再执行 create procedureset 的范围仅限于 create procedure 命令,一旦过程退出便会重置为以前的设置。

创建过程后,可以通过发出 execute 命令和过程名及任何参数来运 行过程。如果过程是批处理中的第一条语句,则可以提供过程名而 不使用关键字 execute

可以用 sp_hidetext 隐藏过程的源文本,源文本存储在 syscomments

中。

如果存储过程批处理成功执行,则 Adaptive Server 将全局变量

@@ error 设为 0


限制

一个存储过程最多可以有 2048 个参数。

过程中局部变量与全局变量的最大数仅受可用内存的限制。

存储过程中的最大文本数是 16MB

不能将 create procedure 语句与其它语句组合在同一批处理中。

虽然过程可以引用其它数据库中的对象,但只能在当前数据库中创 建存储过程。过程中引用的大多数对象在创建过程时必须存在。但 可以包括 drop tablecreate index truncate table 等语句。即使创建过 程时基础对象不存在, create procedure 语句中也可以包括这些语句。

image

可以在过程中创建对象,然后引用它,只要对象在被引用之前创建 即可。

不能在过程中用 alter table 添加一列然后在过程中引用该列。

如果在 create procedure 语句中使用 select *,则过程不会选取任何已 添加到表的新列 (即使用 with recompile 选项来 execute)。必须 drop 该过程并重新进行创建。否则,当在两个表中都添加了新列时,过 程中的 insert into table1 select * from table2 insert...select 语句就会导 致错误结果。

在存储过程内,不能在创建某个对象 (包括临时表)并将其删除之 后又以相同的名字创建新的对象。 Adaptive Server 是在执行而非编 译存储过程时创建在该过程中定义的对象的。


image

警告! 对数据库所做的某些更改 (例如删除和重新创建索引)可 能导致对象 ID 发生更改。对象 ID 发生更改时,存储过程会自动重 新编译,且大小会稍有增加。请为这种增加留出一些空间。

image

扩展存储过程

如果使用 as external name 语法,则 create procedure 将注册一个扩展 存储过程 (ESP)。扩展存储过程执行过程语言函数而不是

Transact-SQL 命令。

• (Windows) ESP 函数不应调用 C 运行时信号例程。否则会导致 XP Server 失败,因为 Open Server™ 不支持 Windows NT 上的信号处理。

若要支持多线程, ESP 函数应该使用 Open Server srv_yield 函数,该 函数挂起并重新安排 XP Server 线程,以允许执行相同优先级或较 高优先级的其它线程。

• DLL 搜索机制与平台有关。在 Windows NT 上, DLL 文件名搜索的 顺序:


a 装载应用程序的目录

b 当前目录

c 系统目录 (SYSTEM32)

d PATH 环境变量中所列目录

如果 DLL 不在前三个目录中,请设置 PATH 使其包含该 DLL 所在 的目录。

UNIX 平台上,该搜索方法随特定平台的不同而不同。如果查找

DLL 或共享库失败,则它将搜索 $SYBASE/lib

不支持绝对路径名。

execute as 存储过程

• set session authorization 语句不能在 execute as owner 存储过程内使用,即 使该语句嵌在使用或没用 execute as 子句定义的嵌套过程内也如此。

• SQLJ 过程不支持 execute as 子句。

使用 execute as caller 创建的同一过程的过程高速缓存中的计划不在 用户之间共享,因为过程中的对象必须解析为执行该过程的用户。 因此,如果多位用户执行该过程,可能会增加过程高速缓存率。当 用户再次执行该过程时,将重用特定用户的计划。

有关 execute as 存储过程的信息,请参见 《安全性管理指南》中的管理 用户权限

系统过程

统管理员可以在 sybsystemprocs 数据库中创建新的系统过程。系统 过程名必须以 “sp_”开头。可以通过指定过程名称从任何数据库 执行这些过程,而不必用 sybsystemprocs 数据库名称限定过程。有 关创建系统过程的详细信息,请参见 《系统管理指南》。

系统过程结果随其执行的上下文的不同而不同。例如,执行 db_name() 系统函数的 sp_foo 会返回从中执行过程的数据库的名称。 通过 pubs2 数据库执行时,将返回值 “pubs2”:

use pubs2 sp_foo

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

pubs2

通过 sybsystemprocs 执行时,将返回值 “sybsystemprocs”:

use sybsystemprocs sp_foo

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

sybsystemprocs


嵌套过程

当一个存储过程调用另一个存储过程时,发生过程嵌套。

如果执行一个调用其它过程的过程,被调用过程可以访问由调用过 程创建的对象。

嵌套级别在被调用过程开始执行时递增,并在被调用过程执行完成 时递减。超过 16 层的最大嵌套值将导致事务失败。

可用过程名或用变量名替换真正的过程名来调用其它过程。

当前嵌套级别存储在 @@ nestlevel 全局变量中。

execute as 过程可与使用或没用 execute as 子句创建的嵌套过程嵌套

过程返回状态

存储过程可以返回一个称为返回状态 的整数值。返回状态要么说明 过程成功执行,要么指定发生的错误的类型。

执行存储过程时,会自动返回相应的状态码。 Adaptive Server 当前 返回以下状态码:

image

代码 含义

0 过程执行时没有发生错误

-1 缺失对象

-2 数据类型错误

-3 进程被选作死锁牺牲品

-4 权限错误

-5 语法错误

-6 杂类用户错误

-7 资源错误,如空间不足

-8 非致命内部问题

-9 达到系统限制

-10 致命内部不一致性

-11 致命内部不一致性

-12 表或索引损坏

-13 数据库损坏

-14 硬件错误


代码 -15 -99 留做将来使用。

用户可以用 return 语句生成一个用户定义的返回状态。此状态可以 是任何整数 (0 -99 的整数除外)。以下示例在书具有有效合同 时返回 1,在所有其它情况下返回 2


create proc checkcontract @titleid tid as

if (select contract from titles where title_id = @titleid) = 1

return 1 else

return 2

checkcontract @titleid = "BU1111" (return status = 1)

checkcontract @titleid = "MC3026" (return status = 2)

如果在执行时发生了多个错误,将返回绝对值最高的代码。用户定 义的返回值比系统定义的值优先级高。

对象标识符

若要更改存储过程的名称,请使用 sp_rename

要更改扩展存储过程的名称,请删除该过程,重命名并重新编译支 持函数,然后重新创建过程。

如果过程引用并非有效标识符的表名、列名或视图名,则必须在 create procedure 命令之前 set quoted_identifier on 并将每个这样的名称 都用双引号引起来。执行过程时并不需要打开 quoted_identifier 选项。

如果重命名了过程所引用的任何对象,则必须删除并重新创建该过 程。

在存储过程中,如果其他用户要使用该存储过程,则同 create table dbcc 一起使用的对象名必须用其所有者名限定。例如,如果用户 “mary”(拥有表 marytab)希望其他用户可以执行她的过程,则当 该表与这些命令一起使用时,她应当在存储过程内限定该表的名 字。这是因为对象名在过程运行时被解析。当另一个用户试图执行 该过程时, Adaptive Server 查找用户 “mary”拥有的名为 marytab 的表,而不是查找执行该存储过程的用户拥有的名为 marytab 的表。

这样,如果没有限定 marytab,且用户 “john”尝试执行该过程,则 Adaptive Server 将查找过程所有者 (此例中为 “mary”)所拥有的 名为 marytab 的表;如果该用户表不存在,则查找数据库所有者所 拥有的表。例如,如果删除了表 mary.marytab,则过程将引用 dbo.marytab

在存储过程中同其它语句 (如 select insert)一起使用的对象名无 需限定,因为在过程编译时该名称就已被解析。


临时表和过程

如果临时表在当前会话中创建,则可以创建引用临时表的过程。过 程退出时,在过程中创建的临时表将消失。请参见 《Transact-SQL 用户指南》。

系统过程 (如 sp_help)可使用临时表,但条件是必须从 tempdb 使 用它们。

在过程中设置选项

可以在存储过程中使用 set 命令。大部分 set 选项在过程执行期间保持有 效,然后返回到它们先前的设置。

然而,如果使用要求用户为对象所有者的 set 选项 (如 identity_insert), 则不是对象所有者的用户将无法执行该存储过程。

获取有关过程的信息

若要获取被过程引用的对象的报告,请使用 sp_depends

若要显示 create procedure 语句的文本 (存储在 syscomments 中), 请以过程名作参数使用 sp_helptext。使用 sp_helptext 时,必须正在 使用过程所驻留的数据库。若要显示系统过程的文本,请从 sybsystemprocs 数据库执行 sp_helptext

若要查看系统扩展存储过程和它们支持的 DLL 的列表,请从

sybsystemprocs 使用 sp_helpextendedproc

标准 符合 ANSI SQL 的级别Transact-SQL 扩展。

权限 创建过程时,不对过程引用的对象 (如表和视图)进行权限检查。因 此,即使不能访问过程的对象,也可以成功创建过程。所有权限检查在 用户执行该过程时进行。

执行过程时,对象上的权限检查取决于过程和所有被引用的对象是否由 同一用户拥有。

如果过程的对象由不同的用户拥有,那么调用者必须得到可以直接 访问这些对象的授权。例如,如果过程执行对用户不能访问的表的 选择,过程的执行就会失败。

如果过程及其对象为同一用户所有,则应用特殊的规则。调用者自 动拥有访问过程的对象的 “隐式权限”,即使调用者不能直接访问 它们。不必授予用户直接访问表和视图的权限,可以给予他们有限 制地访问存储过程的权限。这样,存储过程就可以是一种安全性机 制。例如,过程的调用者可能只能访问表的某些行和列。请参见

《安全性管理指南》中的 “使用存储过程作为安全机制”。

以下介绍了取决于细化权限设置的 create procedure (以及在创建扩展过 程时)的权限检查。


image

细化权限已启用 在启用细化权限的情况下,您必须具有 create procedure 特权。您必须具有

create any procedure 特权才能为其他用户运行 create procedure

细化权限已禁用 在禁用细化权限的情况下,您必须是数据库所有者或具有 create procedure 特 权。


审计 sysaudits event extrainfo 列中的值如下:

image

事件 审计选项 审计的命令或访问权限 extrainfo 中的信息

11 create create procedure 角色 - 当前活动角色

关键字或选项 -

对于 execute as owner,显示过程所有者名称和关键字 execute as owner。对于 execute as caller,显示过程调 用者名称和关键字 execute as caller

先前值 NULL

当前值 NULL

其它信息 NULL

代理信息 - set proxy 有效时的初始登录名


另请参见 命令 begin...end, break, continue, declare, drop procedure, execute, goto label, grant, if...else, return, select, waitfor, while.

系统过程 sp_addextendedprocsp_helpextendedprocsp_helptextsp_hidetextsp_renamesp_help.




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具:ReadASADB。
此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。
恢复Sybase SQL Anywhere的工具在国内应该算首创。

ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

本工具的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------