随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从https://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站https://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!
如有Sybase数据库技术问题需要咨询,请联系我!
以下官方手册为ASE 15.7 ESD#2中文版:
- 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
- 新增功能摘要
- 新增功能指南
- ASE 15.7 发行公告
- 配置指南(windows)
- 安装指南(windows)
- 参考手册:构件块
- 参考手册:命令
- 参考手册:过程
- 参考手册:表
- Transact-SQL® 用户指南
- 系统管理指南,卷 1
- 系统管理指南,卷 2
- 性能和调优系列:基础知识
- 性能和调优系列:锁定和并发控制
- 性能和调优系列:监控表
- 性能和调优系列:物理数据库调优
- 性能和调优系列:查询处理和抽象计划
- 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
- 性能和调优系列:利用统计分析改进性能
- 程序员参考 jConnect for JDBC 7.0.7
- Adaptive Server Enterprise 中的 Java
- 组件集成服务用户指南
- Ribo 用户指南
- 内存数据库用户指南
- Sybase Control Center for Adaptive Server® Enterprise
- 安全性管理指南
- 实用程序指南
使用触发器来维护参照完整性
触发器用于维护参照完整性,这可确保数据库中的重要数据 (如给定 数据段的唯一标识符)始终精确无误,并在数据库中的其它数据更改后 仍可使用参照完整性是通过使用主键和外键来实现的。
主键 是指其值可对行进行唯一标识的列或列组合。该值不能为空且必须 有唯一索引。具有主键的表可以与其它表中的外键相连接。主键表可以 看作是具有主 — 明细关系的主表。一个数据库中可以有许多个这样的 主 — 明细组。
可以使用 sp_primarykey 来标记要与 sp_helpjoins 一起使用的主键,从而 将其添加到 syskeys 表中。
例如, title_id 列是 titles 的主键。它唯一地标识了 titles 中的书籍,并与 titleauthor、 salesdetail 和 roysched 中的 title_id 相关联。 titles 表对于 titleauthor、 salesdetail 和 roysched 来说是主表。
外键 是一个列或列组合,与主键相匹配。外键不必是唯一的。它通常与 主键有着多对一的关系。外键值应是主键值的副本。这意味着,如果主 键中某个值存在,则在外键中也不应存在此值。外键的值可以为空;如 果组合外键值有一部分为空,则整个外键的值一定为空。带有外键的表 通常称作主表的明细表或相关表。
可以使用 sp_foreignkey 在数据库中标识外键。这标志外键使用 sp_helpjoins,并使用那些引用了 syskeys 表的其它过程。 titleauthor、 salesdetail 和 roysched 中的 title_id 列都是外键;这些表是明细表。大多数 情况下,由于单个表允许的最大引用数为 200,因此可以使用参照约束 在表与表之间强制实施参照完整性 (约可确保插入特定列中的数据在 另一表中有匹配值)。如果某个表超过该限制或需要特殊的参照完整性, 则应使用参照完整性触发器。
参照完整性触发器可保持外键值与主键值同步。当数据修改影响到键列 时,触发器将使用名为 触发器测试表的临时工作表来比较新列值与相关 的键。在编写触发器时,应基于临时存储在触发器测试表中的数据进行 比较。
Adaptive Server 在触发器语句中使用两种特殊的表:deleted 表和 inserted 表。它们是触发器测试时使用的临时表。编写触发器时,可以使用这些 表来测试数据修改的影响并设置触发器的动作条件。不能直接改变触发 器测试表中的数据,但可以在选择语句中使用这些表来检测 insert、update 或 delete 的影响。
• deleted 表存储执行 delete 和 update 语句期间受到影响的行的副本。 在执行 delete 或 update 语句时,从触发器表中删除的行被传送到 deleted 表中。通常情况下, deleted 表与触发器表没有共用的行。
• inserted 表存储执行 insert 和 update 语句期间受到影响的行的副本。 在执行 insert 或 update 时,新行被同时添加到 inserted 表与触发器表 中。 inserted 表中的行是触发器表中新行的副本。以下触发器片段 使用 inserted 表来测试对 titles 表中 title_id 列的更改:
if (select count(*)
from titles, inserted
where titles.title_id = inserted.title_id) !=
@@rowcount
注释 inserted 和 deleted 表在事务日志中均显示为视图,但它们在
syslogs 中为虚设表。
update 操作实际上是先删除行然后再插入行;旧行先被复制到 deleted 表 中;然后新行被复制到触发器表和 inserted 表中。下面的示例说明了在 执行 insert、 delete 和 update 期间触发器测试表的条件:
设置触发器条件时,应使用适合数据修改操作的触发器测试表。在测试 insert 时引用 deleted 或在测试 delete 时引用 inserted 并不会导致错误;但 这些触发器测试表将不包含任何行。
注释 对于每个查询,给定的触发器只引发一次。如果触发器动作取决 于数据修改所影响的行数,应对多行数据修改操作进行测试 (如检查
@@rowcount),并采取适当操作。
下述触发器示例包含了必要的多行数据修改。用于存储受最近数据修改 操作 “影响的行数”的 @@ rowcount 变量可测试多行 insert、 delete 或 update 操作。如果触发器中有任何其它 select 语句先于对 @@rowcount 的测试,则应使用局部变量来存储该值,以便以后进行检查。所有不返 回值的 Transact-SQL 语句都会将 @@rowcount 重新设置为 0。
插入新的外键行时,应确保该外键与某个主键相匹配。触发器应检查插 入行 (使用 inserted 表)与主键表中的行之间的连接,然后回退与主键 表中的键不匹配的任何外键插入操作。
下面的触发器将 inserted 表中的 title_id 值与 titles 表中的相应值进行比较。 它假定您插入一个外键条目且没有插入空值。如果连接失败,该事务将 被回退。
create trigger forinsertrig1 on salesdetail
for insert as
if (select count(*)
from titles, inserted
where titles.title_id = inserted.title_id) !=
@@rowcount
/* Cancel the insert and print a message.*/ begin
rollback transaction
print "No, the title_id does not exist in titles."
end
/* Otherwise, allow it.*/ else
print "Added!All title_id’s exist in titles."
@@rowcount 指的是添加到 salesdetail 表中的行数。也是向 inserted 表添 加的行数。触发器连接 titles 和 inserted,以确定所有添加到 salesdetail 的 title_id 是否存在于 titles 表中。如果由 select count(*) 查询确定的连接的行 数与 @@rowcount 不同,则表明有一个或多个插入不正确,该事务将被 取消。
对于插入被回退或被接受的情况,触发器分别输出不同的消息。要测试 第一种情况,可尝试使用以下 insert 语句:
insert salesdetail
values ("7066", "234517", "TC9999", 70, 45)
insert salesdetail
values ("7896", "234518", "TC3218", 75, 80)
对 titles 执行 delete 语句时,就会从 titles 表中删除一行或多行,并添加到 deleted 表中。触发器可检查相关表 (titleauthor、 salesdetail 和 roysched) 以查看其中是否有这样的行,即行中含有的 title_id 与从 titles 中删除并且 现存储在 deleted 表中的 title_id 相匹配。如果触发器找到任何这样的行, 便会将其删除。
create trigger delcascadetrig on titles
for delete as
delete titleauthor
from titleauthor, deleted
where titleauthor.title_id = deleted.title_id
/* Remove titleauthor rows that match deleted
** (titles) rows.*/ delete salesdetail
from salesdetail, deleted
where salesdetail.title_id = deleted.title_id
/* Remove salesdetail rows that match deleted
** (titles) rows.*/ delete roysched
from roysched, deleted
where roysched.title_id = deleted.title_id
/* Remove roysched rows that match deleted
** (titles) rows.*/
限制删除的示例
在实际生活中,因保留历史记录的需要 (为了查看下架停售的书在销 售期间的销售量)或由于明细行上的事务尚未完成,您可能希望保留某 些明细行一个编写良好的触发器应考虑以下情况。
防止主键删除 如果在 salesdetail 表中有关于某一主键的明细行,随 pubs2 提供的 deltitle 触发器可以防止删除该主键。以下触发器保留了从 salesdetail 中检索行 的功能:
create trigger deltitle on titles
for delete as
if (select count(*)
from deleted, salesdetail where salesdetail.title_id = deleted.title_id) > 0
begin
rollback transaction
print "You cannot delete a title with sales." end
此触发器通过将从 titles 中删除的一个或多个行与 salesdetail 表连接起来 对这些行进行测试。如果找到连接,该事务将被取消。
同样,如果主表 titles 在 titleauthor 中有相关子项,则下面的限制删除可 防止删除发生。它不计算 deleted 和 titleauthor 中的行数,而是检查 title_id 是否被删除。这种方法的效率更高,这是由性能因素决定的,因为它仅 检查特定的行是否存在,而不是浏览整个表并计算所有行数。
记录发生的错误 下个示例将 raiserror 用在了错误消息 35003 上。raiserror 设置一个系统标 志来记录发生的错误。尝试运行此示例前,请将错误消息 35003 添加到 sysusermessages 系统表中:
sp_addmessage 35003, "restrict_dtrig - delete failed:row exists in titleauthor for this title_id."
触发器是:
create trigger restrict_dtrig on titles
for delete as
if exists (select * from titleauthor, deleted where titleauthor.title_id = deleted.title_id)
begin
end
rollback transaction raiserror 35003 return
要测试此触发器,可使用 delete 语句:
delete titles
where title_id = "PS2091"
下面的示例从主表 titles 向相关表 titleauthor 和 roysched 进行级联更新。
create trigger cascade_utrig on titles
for update as
if update(title_id) begin
update titleauthor
set title_id = inserted.title_id
from titleauthor, deleted, inserted where deleted.title_id =
titleauthor.title_id update roysched
set title_id = inserted.title_id from roysched, deleted, inserted
where deleted.title_id = roysched.title_id update salesdetail
set title_id = inserted.title_id from salesdetail, deleted, inserted where deleted.title_id =
salesdetail.title_id end
要测试此触发器,假定把 Secrets of Silicon Valley 一书从 popular_comp 重新归类为心理学书籍。以下查询在 titleauthor、 roysched 和 titles 中将 title_id PC8888 更新为 PS8888。
update titles
set title_id = "PS8888" where title_id = "PC8888"
限制更新触发器
使用日期函数的限制更 新触发器
主键是它的行和其它表中的外键行的唯一标识符。通常,不应更新主键。 尝试更新主键时应特别慎重。在这种情况下,除非满足指定的条件,否 则会退更新操作以保护参照完整性。
Sybase 建议禁止对主键进行任何编辑更改。例如,可通过撤消对该列的 所有权限来实现这种禁止。但是,若要仅在某些条件下禁止更新,请使 用触发器。
下面的触发器可防止在周末对 titles.title_id 更新。 stopupdatetrig 中的 if update 子句允许您关注特定的列 titles.title_id。如果对该列中的数据进行 修改,则会导致触发器引发。而对其它列中的数据进行更改则不会。当 此触发器检测到违反触发器条件的更新时,它将取更新并输出消息。若 要对它进行测试,请用一周中的另一天代替 “Saturday”或 “Sunday”。
create trigger stopupdatetrig on titles
for update as
/* If an attempt is made to change titles.title_id
** on Saturday or Sunday, cancel the update.*/ if update (title_id)
and datename(dw, getdate()) in ("Saturday", "Sunday")
具有多个动作的限制更 新触发器
begin
rollback transaction
print "We do not allow changes to " print "primary keys on the weekend."
end
可以使用 if update 对多列指定多个触发器动作。下面的示例对 stopupdatetrig 进行了修改,以包含用于对 titles.price 或 titles.advance 的更 新的额外触发器动作。此示例可防止在周末对主键进行更新,而且只要 标题的总收入不超过其预付款的总额,则还防止更新该标题的价格或预 付款。可以使用相同的触发器名,因为在重新创建触发器时,修改后的 触发器会替代旧的触发器。
create trigger stopupdatetrig on titles
for update as
if update (title_id)
and datename(dw, getdate()) in ("Saturday", "Sunday") begin
rollback transaction
print "We do not allow changes to" print "primary keys on the weekend!"
end
if update (price) or update (advance) if exists (select * from inserted
where (inserted.price * inserted.total_sales)
< inserted.advance) begin
rollback transaction
print "We do not allow changes to price or" print "advance for a title until its total" print "revenue exceeds its latest advance."
end
下个示例是在 titles 上创建的,在出现下述情况之一时,可防止 update
操作:
• 用户尝试更改 titles 中的 title_id 主键值
• 在 publishers 中未找到 pub_id 相关键
• 目标列不存在或为空
运用此示例之前,确保 sysusermessages 中存在下述错误消息:
sp_addmessage 35004, "titles_utrg - Update Failed:update of primary keys %1! is not allowed."
sp_addmessage 35005, "titles_utrg - Update Failed:%1! not found in authors."
触发器如下所示:
create trigger title_utrg on titles
for update as begin
declare @num_updated int,
@col1_var varchar(20),
@col2_var varchar(20)
/* Determine how many rows were updated.*/ select @num_updated = @@rowcount
if @num_updated = 0 return
/* Ensure that title_id in titles is not changed.*/ if update(title_id)
begin
rollback transaction
select @col1_var = title_id from inserted raiserror 35004 , @col1_var
return end
/* Make sure dependencies to the publishers table are accounted for.*/ if update(pub_id)
begin
if (select count(*) from inserted, publishers where inserted.pub_id = publishers.pub_id
and inserted.pub_id is not null) != @num_updated begin
rollback transaction
select @col1_var = pub_id from inserted raiserror 35005, @col1_var
return
end end
/* If the column is null, raise error 24004 and rollback the
** trigger.If the column is not null, update the roysched table
** restricting the update.*/ if update(price)
begin
if exists (select count(*) from inserted where price = null)
begin
end else
rollback trigger with
raiserror 24004 "Update failed :Price cannot be null."
begin
update roysched set lorange = 0,
hirange = price * 1000 from inserted
where roysched.title_id = inserted.title_id
end
end end
要测试第一条错误消息 35004 (无法更新主键),请输入:
update titles
set title_id = "BU7777" where title_id = "BU2075"
要测试第二条错误消息 35005 (更新失败,找不到对象),请输入:
update titles
set pub_id = "7777" where pub_id = "0877"
要测试第三条错误消息 24004 (更新失败,对象为空),请输入:
update titles
set price = 10.00
此查询失败,这是因为 titles 中的 price 列为空。如果不为空,它就会更 新 title 为 PC8888 的 price,并对 roysched 表进行必要的重新计算。错误 24004 不在 sysusermessages 中,但在此例中有效。它演示了代码中的 “rollback trigger with raiserror”部分。
外键自身的更改或更新可能会导致错误。外键是主键的副本。切勿将二 者设计为独立的。若要允许对外键进行更新,应创建一个触发器,使其 能检查 master 表的更新,并在更新与主键不匹配时回退更新,以此来保 护数据的完整性。
在下面的示例中,触发器将测试两个可能的失败源:title_id 不在 salesdetail
表中,或者它不在 titles 表中。
此例使用嵌套的 if...else 语句。当 update 语句中的 where 子句与 salesdetail 中的值不匹配时,第一个 if 语句为真,即 inserted 表不包含任何行,且 select 返回空值。如果通过了此测试,下一个 if 语句确定 inserted 表中的 新行是否与 titles 表中的任何 title_id 连接。如果任何行均未连接,则回退 该事务,并输出错误消息。如果连接成功,则输出不同的消息。
create trigger forupdatetrig on salesdetail
for update as
declare @row int
/* Save value of rowcount.*/ select @row = @@rowcount
if update (title_id) begin
if (select distinct inserted.title_id from inserted) is null
begin
rollback transaction
print "No, the old title_id must be in" print "salesdetail."
end else
if (select count(*)
from titles, inserted where titles.title_id = inserted.title_id) != @row
begin
rollback transaction
print "No, the new title_id is not in" print "titles."
end else
print "salesdetail table updated"
end
Sybase SQL Anywhere数据库恢复工具ReadASADB:
之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具: ReadASADB。此工具支持ASA v5.0, v6.0, v7.0, v8.0, v9.0, v10.0, v11.0, v12.0, v16.0, v17.0等版本。
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具。
恢复Sybase SQL Anywhere的工具在国内处于领先水平。
Sybase SQL Anywhere数据库恢复工具ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具
- 适用于所有的SQL Anywhere版本 包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x,17.x
- 适用于所有的UltraLite版本
- 能够恢复出来表结构和数据
- 能够恢复自定义数据类型
- 能够恢复存储过程等对象的语法
- 能够导出到目标数据库
- 能够导出到SQL文件并生成导入脚本
- 支持多种字符集,包括:cp850、cp936、gb18030、utf8等
- 能够恢复未加密或者简单加密类型的数据
- 简单易用
- 限制:不支持AES加密的数据文件
SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍
Sybase SQL Anywhere数据库恢复工具ReadASADB适用场景
各种误操作:
- 误截断表(truncate table)
- 误删除表(drop table)
- 错误的where条件误删数据
- 误删除db或log文件
- 误删除表中的字段
Sybase SQL Anywhere数据库恢复工具ReadASADB的应用场景:
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
7、*** ERROR *** Assertion failed: 201417 (7.0.4.3541) Invalid count or free space offset detected on a table page
8、Internal database error *** ERROR *** Assertion failed: 201425 (8.0.3.5594) Invalid count or free space offset detected on a free list page -- transaction rolled back.
9、Internal database error *** ERROR *** Assertion failed: 100702 (8.0.1.2600) Unable to modify indexes for a row referenced in rollback log -- transaction rolled back
Sybase ASE数据库恢复工具READSYBDEVICE:
一个不依赖数据库管理系统、直接从Sybase数据库设备文件上提取数据的业内领先的恢复工具!能够从损坏的Sybase ASE设备文件(.dat)上提取数据的非常规恢复工具。
Sybase ASE数据库恢复工具READSYBDEVICE的主要功能:
- 被勒索病毒加密数据文件及备份文件情况下的恢复;
- 系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
- 因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
- delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复 等;
- 各种Sybase内部系统表损坏、索引错误的修复;
- master数据库损坏而无法正常运行情况下的恢复;
- Sybase数据库被标记为可疑,不可用等情况的恢复;
- Sybase数据库中数据文件内部出现坏块情况下的恢复;
- Sybase数据库无数据文件但有日志文件的情况下的恢复;
- Sybase数据库只有数据文件无任何日志文件的情况下的恢复;
- Sybase数据文件被误删除情况下的碎片提取恢复;
- 磁盘阵列上的Sybase数据库被误格式化情况下的数据库恢复;
- 数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
- Sybase数据库还原数据库出现失败情况下的恢复;
- Sybase数据库只剩下损坏的备份文件情况下的恢复。
Sybase ASE数据库恢复工具READSYBDEVICE支持的版本:
Sybase ASE 11.0.x,11.5.x,11.9.x,12.0.x,12.5.x,15.0.x,15.5.x,15.7.x,16.0.xSQL Server数据库恢复工具SQLRescue:
一个不依赖数据库管理系统、直接从SQL Server数据库文件上提取数据的业内领先的恢复工具!能够从损坏的SQL Server数据库文件(.mdf)上提取数据的非常规恢复工具。
SQL Server数据库恢复工具SQLRescue的主要功能:
- 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;
- 断电导致数据库文件损坏情况下的恢复;
- 硬盘坏道造成数据库损坏情况下的恢复;
- 数据文件内部存在坏页情况下的恢复;
- 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;
- 并闩锁错误、格式化、误删除后导致软件不能使用的情况;
- 无法读取并闩锁页sysindexes失败情况下的修复;
- 数据文件被误删除情况下的碎片提取恢复;
- 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;
- master数据库损坏而无法正常运行情况下的恢复;
- 数据文件无法附加情况下的数据恢复;
- 数据库被标记为可疑,质疑,不可用等情况的恢复;
- 数据库sysobjects等系统表损坏情况下的恢复;
- 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;
- 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;
- 数据库被误格式化等情况下的数据库恢复;
- 日志收缩造成数据库损坏情况下的恢复;
- 仅剩损坏的备份文件情况下的恢复。
SQL Server数据库恢复工具SQLRescue技术特点:
只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。- 从数据文件中直接恢复数据
- 不能附加时直接恢复数据并生成新的数据库
- 系统表损坏的数据库修复
- 快速修复SQL 823错误、连接中断错误
SQL Server数据库恢复工具SQLRescue支持的版本:
Microsoft SQL Server 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017,2019。+-------------------------------------华丽的分割线-------------------------------------------------------------------------