远程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 trigger

说明 创建触发器,它是一种经常用来强制实现完整性约束的存储过程。当用 户试图对指定的表使用指定的数据修改语句时,就会自动执行触发器。

语法 create trigger [owner.]trigger_name on [owner.]table_name

{for {insert , update} | instead of {insert, update, delete}} [as


参数 trigger_name

[if update (column_name)

[{and | or} update (column_name)]...]

SQL_statements

[if update (column_name)

[{and | or} update (column_name)]...

SQL_statements]...]

是触发器的名称,该名称必须符合标识符规则,并且在数据库中是唯 一的。指定所有者的名称,以创建由当前数据库中的其他用户拥有的 另一个同名触发器。 owner 的缺省值是当前用户。如果使用所有者名 限定触发器,则必须以相同的方式显式限定表名。

不能对触发器名使用变量。

table_name 是要在其上创建触发器的表的名称。如果数据库中存在多个同名表, 请指定所有者名称。 owner 的缺省值是当前用户。

for | instead of

for – 用在 insertdelete update 之前,以指示创建触发器的用途。

instead of – 创建并填充触发器中使用的已插入和已删除伪表,以检 查本应由原来的 insertdelete update 查询修改的行。

insert, update, delete

可采用任意组合形式。 delete 不能与 if update 子句一起使用。

SQL_statements

指定触发器状态和触发器动作。触发器状态决定尝试的 insertupdate delete 是否会导致执行触发器动作。SQL 语句通常包括前面带关键 字 if 的子查询。在下面的示例 2 中,跟随关键字 if 的子查询即为触发 器状态。

触发器行为在尝试用户动作 (insertupdate delete)时生效。如果 指定了多个触发器动作,用 begin end 将它们组合在一起。

有关触发器定义中不允许使用的语句列表,请参见 245 页的 “触发 器和事务 。有关可以包括在触发器定义中的 deleted inserted 逻辑表 的信息,请参见 244 页的 “ deleted inserted 逻辑表


if update

测试指定列是否包括在 update 语句的 set 列表中或者是否受 insert 的影 响。 if update 允许指定的触发器动作与指定列的更新建立关联 (请参 见示例 3)。可以指定多列,且可以在一个 create trigger 语句中使用多 个 if update 语句 (请参见示例 5)。

示例 示例 1 如果有人试图在 titles 表中添加或更改数据,则显示消息:

create trigger reminder on titles

for insert, update as

print "Don't forget to print a report for accounting."

示例 2 如果 titles 表中没有相应的 title_id,则禁止向 titleauthor 插入新行:

create trigger t1 on titleauthor for insert as

if (select count (*) from titles, inserted

where titles.title_id = inserted.title_id) = 0 begin

print "Please put the book's title_id in the titles table first."

rollback transaction end

示例 3 如果更改了 publishers 表的 pub_id 列,则在 titles 表中进行相应的更 改:

create trigger t2 on publishers

for update as

if update (pub_id) and @@rowcount = 1 begin

update titles

set titles.pub_id = inserted.pub_id from titles, deleted, inserted

where deleted.pub_id = titles.pub_id

end

示例 4 如果从 titleauthor 中删除了任何行,则从 titles 表中删除相应的标 题。如果书有多个作者, titleauthor 中对它的其它引用也将删除:

create trigger t3 on titleauthor for delete as begin

delete titles



end

from titles, deleted

where deleted.title_id = titles.title_id delete titleauthor

from titleauthor, deleted

where deleted.title_id = titleauthor.title_id print "All references to this title have been deleted from titles and titleauthor."

示例 5 禁止在周末对主键进行更新。禁止更新标题的价格或预付款,除 非该标题的总收入超过了其预付款金额:

create trigger stopupdatetrig on titles

for update as

if update (title_id)

and datename (dw, getdate ()) in ("Saturday", "Sunday") begin

rollback transaction

print "We don't allow changes to" print "primary keys on the weekend!"

end

if update (price) or update (advance) if (select count (*) from inserted

where (inserted.price * inserted.total_sales)

< inserted.advance) > 0 begin

rollback transaction

print "We don't allow changes to price or" print "advance for a title until its total" print "revenue exceeds its latest advance." end

示例 6 使用 instead of 触发器更新联合视图:

create table EmployeeWest (


empid int primary key,

empname varchar(30),

empdob datetime,

region char(5)

constraint region_chk check (region='West'))


create table EmployeeEast (

empid int primary key,


empname varchar(30),

empdob datetime,

region char(5)

constraint region_chk check (region='East'))


create view Employees as select * from EmployeeEast union all

select * from EmployeeWest


create trigger EmployeesInsertTrig on Employees instead of insert as

begin


insert into EmployeeEast select * from inserted where region = "East"



end

insert into EmployeeWest select * from inserted where region = "West"


--will insert the data into the EmployeeEast table

insert into Employees values (10, 'Jane Doe', '11/11/1967', 'East')


--will insert the data into the EmployeeWest table

insert into Employees values (11, 'John Smith', '01/12/1977', 'West')


--will insert multiple rows into EmployeeEast and

--EmployeeWest tables.Employee2 table includes employees

--from both East and West.

insert into Employees select * from Employee2

示例 7 使用 instead of 触发器可实现加密列支持,以加密形式在数据库中 存储数据,而不更改应用程序 (用户定义函数 my_encrypt my_decrypt 对数据执行加密和解密操作):

CREATE TABLE Employee_t (id int PRIMARY KEY, name varchar(20), salary binary (64))

--where the id and name columns are stored unencrypted, salary is

--encrypted and id is a primary key.


create view employee_v as select id, name, my_decrypt (salary) from employee_t


CREATE TRIGGER EmployeeInsert ON employee_v

INSTEAD OF INSERT AS


BEGIN

INSERT employee_t SELECT id, name, my_encrypt (salary) FROM inserted

END


CREATE TRIGGER employeeUpdate ON employee_v

INSTEAD OF UPDATE AS

BEGIN

DELETE FROM employee_t WHERE id IN (SELECT id FROM deleted) INSERT employee_t SELECT id, name, my_encrypt (salary) FROM inserted

END


CREATE TRIGGER employeeDelete ON employee_v

INSTEAD OF DELETE AS

BEGIN

DELETE FROM employee_t WHERE id IN (SELECT id FROM deleted)

END

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

每个数据修改语句只将触发器引发一次。包含 while 循环的复杂查询 可能重复 update insert 多次,且每次都会引发触发器。

触发器和参照完整性

触发器通常用于强制实施参照完整性 (有关表或视图的主键和外键 之间关系的完整性规则),以提供级联删除或级联更新 (请分别参 见示例 23 4)。

只有在数据修改语句完成操作,并且 Adaptive Server 完成对所有数 据类型、规则或完整性约束冲突的检查之后,触发器才引发。触发 器和引发它的语句将被当作单个事务,可从触发器中回退。如果检 测到一个严重错误,整个事务将被回退。

您也可以用由 create table 语句定义的约束代替 create trigger 强制实施 参照完整性。有关完整性约束的信息,请参见 create table alter table


deleted inserted 逻辑表

deleted inserted 是逻辑 (概念)表。就结构来说,它们对为之定 义了触发器的表 – 也就是用户试图进行动作的表 – 以及保存可能 会由用户动作更改的行的旧值或新值的表来说是相同的。


image

注释 inserted deleted 表在事务日志中均显示为视图,但它们在

syslogs 中为虚设表。

image


deleted inserted 表可由触发器进行检查,以确定是否执行触发器 动作以及如何执行,但表自身不能由触发器的动作改变。

deleted 表是和 delete update 一起使用的,而 inserted 表是和 insert update 一起使用的。 update 是一个 delete 后跟一个 insert:它首先 影响 deleted 表,然后影响 inserted 表。

触发器限制

只可在当前数据库中创建触发器。如果使用所有者名限定触发器, 则必须以相同的方式显式限定表名。触发器可引用当前数据库之外 的对象。

触发器不可应用到多个表。不过,可在同一 create trigger 语句中为 多个用户操作 (如 insert update)定义相同的触发器动作。一个 表最多可以有三个触发器,分别用于 insertupdate delete

表或列中进行相同操作的新的触发器 (insertupdate delete)会覆 盖前一个触发器。在覆盖前一个触发器之前不会显示任何警告消息。

不能在特定于会话的临时表上创建触发器。

不能在视图上创建触发器。

不能在系统表上创建触发器。

不能使用从已插入或已删除表的 textunitext image 列中选择的触 发器。

• Sybase 建议使用不提供向用户返回结果的 select 语句的触发器,因 为允许对触发器表进行修改的特殊处理必须写入到每个用于这些返 回结果的应用程序中。

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

触发器和性能

就性能而言,触发器的开销通常很小。运行触发器所需的时间大多 用于引用内存或数据库设备中的其它表。


经常被触发器引用的 deleted inserted 表始终在内存中而不是在数 据库设备上,因为它们是逻辑表。触发器所引用的其它表的位置将 决定操作所需的时间。

在触发器内设置选项

可以在触发器内使用 set 命令。您所调用的 set 选项在触发器执行期间保持 有效,然后会恢复其原来的设置。特别要指出的是, self_recursion 选项可 在触发器内部使用,这样触发器本身进行的数据修改可再次引发触发器。

删除触发器

如果重命名触发器所引用的任一对象,必须删除并重新创建此触发 器。可以使用 sp_rename 来重命名触发器。

删除表时,所有与它关联的触发器也都会被删除。

不会导致引发触发器的动作

truncate table 命令不会被 delete 触发器捕获。虽然 truncate table 语句 实际上与不带 where 子句的 delete 相似 (删除所有行),但它不记 录对数据行的更改,因此不能引发触发器。

因为缺省情况下,表的所有者具有 truncate table 命令的权限,并且 不能移交,因此只有表所有者需要关注用 truncate table 语句无意中 回避了 delete 触发器的问题。

无论是有记录还是无记录, writetext 命令都不会引发触发器。

触发器和事务

定义触发器时,在它应用的表上指定的动作以及触发器自身始终隐 式地是事务的一部分。检测到错误后,触发器常用于回退整个事 务,或者它们也可用于回退特定数据修改的影响:

当触发器包含 rollback transaction 命令时,回退会中止整个批处 理,且不执行批处理中的任何后续语句。

当触发器包含 rollback trigger 时,回退仅影响导致触发器引发的 数据修改。rollback trigger 命令可包含一条 raiserror 语句。执行批 处理中的后续语句。

由于触发器将作为事务的一部分被执行,所以在触发器中不允许使 用以下语句和系统过程:

所有 create 命令,包括 create database create default create index create procedure create rule create table create trigger create view

所有 drop 命令

alter database alter table


truncate table

grant revoke

update statistics

sp_configure

load database load transaction

disk init, disk refit, disk reinit, disk remirror, disk remirror, disk unmirror

select into

如果期望的结果 (例如摘要值)取决于数据修改所影响的行数,可 使用 @@rowcount 测试多行数据修改 (基于 select 语句的 insertdelete update),并采取适当措施。任何不返回行的 Transact-SQL 语句 (如 if 语句)都会将 @@rowcount 设置为 0,因此应在开始使 用触发器时进行 @@rowcount 测试。

插入和更新触发器

执行 insert update 命令时, Adaptive Server 同时向触发器表和 inserted 表插入行。 inserted 表中的行始终是触发器表中一行或多行 的重复值。

update insert 触发器可以用 if update 命令来确定 update insert 是 否更改了特定的列。只要在选择列表或在 values 子句中为列赋值, 对于 insert 语句来说,if update ( column_name ) 即为 true。显式 NULL 或缺省值为列赋值,从而激活触发器。但隐式 NULL 则不能如此。

例如,如果创建如下的表或触发器:

create table junk (aaa int null,

bbb int not null)

create trigger trigtest on junk for insert as

if update (aaa)

print "aaa updated" if update (bbb)

print "bbb updated"

将值插入到一列或两列会同时引发 aaa 列和 bbb 列的触发器:

insert junk (aaa, bbb) values (1, 2)

aaa updated bbb updated

aaa 列插入显式 NULL 也会引发触发器:


insert junk values (NULL, 2) aaa updated

bbb updated

如果 aaa 列具有缺省值,也会引发触发器。

不过,如果 aaa 列没有缺省值,且没有显式地插入值, Adaptive Server 会生成隐式 NULL,且不会引发触发器:

insert junk (bbb) values (2)

bbb updated

delete 语句的 if update 值决不会为 true

嵌套触发器和触发器递归

缺省情况下 Adaptive Server 允许嵌套触发器。若要阻止触发器嵌套, 请使用 sp_configure allow nested triggers 选项设置为 0 (关闭):

sp_configure "allow nested triggers", 0

触发器可嵌套 16 层。如果一个触发器更改还具有另一个触发器的 表,则第二个触发器也会引发,并且可以接着调用第三个触发器, 依此类推。如果链中的任何触发器引发了无限循环,就会超出此嵌 套级别,触发器将中止,回退包含此触发器查询的事务。


image

注释 因为触发器是放置在事务中的,所以如果在一组嵌套触发器的 任一层出现故障,都会取消整个事务:回退所有数据修改。为触发器 提供消息和其它错误处理和调试辅助程序,来决定故障出现在哪里。

image

全局变量 @@nestlevel 包含当前执行的嵌套级别。每当存储过程

(或触发器)调用另一个存储过程 (或触发器)时,嵌套级别就会 增加 1。创建高速缓存的语句时,嵌套级别也会增加一级。如果超 过了最大值 16,事务中止。

如果触发器调用一个所执行的操作会使触发器再次引发的存储过 程,则只有在启用嵌套触发器后,该触发器才会被再次激活。除非 触发器内有限制递归次数的条件,否则将导致嵌套级别溢出。

例如,如果更新触发器调用一个执行更新操作的存储过程,则在 allow nested triggers 关闭时,只执行一次触发器和存储过程。如果 allow nested triggers 是打开的,且触发器或过程中的条件没有限制更新的数 目,则过程或触发器循环会一直继续,直到超过最大嵌套值 16 级。


缺省情况下,不管 allow nested triggers 配置参数的设置如何,触发器 都不调用其本身来响应对触发器内同一个表的第二次数据修改。 set 选项 ( self_recursion ) 使得触发器能够因触发器内的数据修改而再次 引发。例如,如果表的一个列上的更新触发器会更新另一列,则当 禁用 self_recursion 时,更新触发器仅引发一次,但如果

self_recursion 打开,则更新触发器可引发多达 16 次。为了能够进行 自递归,还必须启用 allow nested triggers 配置参数。

instead of for 触发器

您可以交错嵌套 instead of for 触发器。例如,对具有 instead of update 触发器的视图执行 update 语句会导致该触发器执行。如果触 发器包含的 SQL 语句可更新其中已定义 for 触发器的表,则会引发 该触发器。 for 触发器可能包含可更新另一个视图的 SQL 语句,该 视图具有随后执行的 instead of 触发器,依此类推。

instead of for 触发器具有不同的递归行为。 for 触发器支持递归, 而 instead of 触发器不支持递归。如果 instead of 触发器引用引发了该 触发器的同一视图,则不会递归调用该触发器。相反,触发语句会 直接应用于该视图;换句话说,就是将该语句解析为对该视图底层 的基表的修改。在这种情况下,视图定义必须满足可更新视图的所 有限制。如果该视图不可更新,则会产生错误。

例如,如果将触发器定义为某个视图的 instead of update 触发器,则 在 instead of 触发器中对该视图执行 update 语句不会导致该触发器再 次执行。该触发器会对视图执行 update 语句,就好像视图不具有 instead of 触发器一样。必须将 update 更改的列解析为单个基表。

instead of 的限制:

如果触发器引用的表名、列名或视图名不是有效的标识符,则必须 在执行 create trigger 命令之前,将 quoted_identifier 设置为 on,并用 双引号引起每个这样的名称。触发器引发时, quoted_identifier 选项 无需处于 on 状态,带括号的标识符同样有效。

结合使用 set cursor rows 命令和客户端游标 (可通过 Open Client 调 用或 Embedded SQL™ 声明这些游标),可以防止 positioned delete update 引发 instead of 触发器。 positioned update 语句是一个包含 where current of < cursorname > 子句的 SQL update 语句,该语句只更新 游标 < cursorname > 当前所定位的行。

• searched delete update 语句中不允许出现连接,否则会引发 instead of 触发器。

在游标上使用连接定义的 positioned delete update 不会引发 instead of 触发器。


positioned delete (或 positioned update)是一个包含 where current of

<cursorname> 子句的 SQL delete (或 update)语句,该语句仅删除

(更新)游标 <cursorname> 当前所定位的行。

对于可引发 instead of 触发器的 positioned delete update 语句,在声 明游标时, instead of 触发器必须存在。

获取有关触发器的信息

触发器的执行计划存储在 sysprocedures 中。

每个触发器都分配有一个标识号,此标识号是作为新行与表 (在 deltrig 列它所应用的表)的对象 ID 存储在 sysobjects 中的,标识号 还作为触发器所应用的表的 sysobjects 行的 deltrig 列、 instrig 列和 updtrig 列的条目存储。

若要显示触发器的文本 (存储在 syscomments 中),请使用

sp_helptext

如果系统安全员已经用 sp_configure 重置了 allow select on syscomments.text column 参数(这是在已评估的配置中运行 Adaptive Server 所必需的操作),那么只有触发器的创建者或系统管理员才 能通过 sp_helptext 查看触发器的文本。

若要获取触发器的报告,请使用 sp_help

若要获取被触发器引用的表或视图的报告,请使用 sp_depends

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

权限 触发器创建时对象的权限 – 创建触发器时, Adaptive Server 不对对象

(如触发器引用的表或视图)进行权限检查。因此,即使不能访问触发 器的对象,也可以成功创建触发器。引发触发器时会检查所有权限。

触发器执行时的对象权限 – 执行触发器时,其对象的权限检查取决于 触发器及其对象是否由同一用户所有。

如果触发器及其对象不为同一用户所拥有,必须已经授予引起触发 器引发的用户直接访问对象的权限。例如,如果触发器执行对用户 不能访问的表的选择,触发器的执行就会失败。另外,引起触发器 引发的数据修改也会回退。

如果触发器及其对象为同一用户所有,则应用特殊的规则。用户自 动拥有访问触发器的对象的隐式权限,即使用户不能直接访问它 们。请参见 《系统管理指南》中有关细隐式权限规则的详细说明。

instead of 触发器和 for 触发器的权限 – instead of 触发器具有与 for 触发 器相同的权限要求:若要创建具有 instead of 触发器的视图,必须授予用 户对视图 (而非基础表)执行 insert/update/delete 的权限。


下文说明了基于您的细化权限设置的 create trigger 的权限检查。

image

细化权限已启用 在启用细化权限的情况下,您必须是表所有者,并且不能撤消 create trigger 特 权。您必须具有 create any trigger 特权才能对另一个用户表运行 create trigger

细化权限已禁用 在禁用细化权限的情况下:

只有系统安全员才能授予或撤消创建触发器的权限。数据库所有者具有在任 何用户表中创建触发器的隐式权限。用户只能在其拥有的表中创建触发器。

系统安全员可以撤消用户创建触发器的权限。撤消创建触发器的权限只影响 系统安全员从中发出 revoke 命令的数据库。当系统安全员向被撤消权限的用 户显式授予 create trigger 权限时,该用户运行 create trigger 命令的权限即得到 恢复。


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

image

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

12 创建 create trigger 角色 – 当前活动角色

关键字或选项 NULL

先前值 NULL

当前值 NULL

其它信息 NULL

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


另请参见 命令 alter table, create procedure, drop trigger, rollback trigger, set.

系统过程 sp_commonkey, sp_configure, sp_depends, sp_foreignkey, sp_help, sp_helptext, sp_primarykey, sp_rename, sp_spaceused.




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从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等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------