远程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. 实用程序指南

 


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

使用登录触发器


image

注释 本节中的一些信息摘自 http://www.sypron.nl/logtrig.html 中的文章 "Login Triggers in ASE 12.5" ASE 12.5 中的登录触发器)。版权所有 1998 2002Rob Verschoor/ Sypron B.V.

image


登录触发器在每次用户登录时执行指定的存储过程。登录触发器是普通 的存储过程,只不过它在后台执行。它是成功登录过程的最后一个步 骤,并为登录的用户设置应用程序环境。

只有系统安全员才能向服务器中的用户注册登录触发器。 若要提供安全的环境,系统管理员必须:

1 撤消对 set_appcontext 函数的 select 特权。登录触发器的所有者必须 明确地具有使用 set_appcontext 的权限,即使该所有者具有 sa_role 也需要如此。

2 利用存储过程为每个用户配置登录触发器,然后向用户注册登录触 发器。

3 向用户执行的登录触发器提供执行特权。


创建登录触发器


以存储过程的形式创建登录触发器。不要使用 create trigger 命令。以下 示例需要您先在 pubs2 数据库中创建 lookup 表:

create table lookup ( appname varchar(20), attr varchar(20), value varchar(20), login varchar(20)

)

然后,在 pubs2 数据库中创建一个登录触发器存储过程:

create procedure loginproc as declare @appnamevarchar(20) declare @attr varchar(20) declare @value varchar(20) declare @retvalue int

declare apctx cursor for

select appname, attr, value from pubs2.dbo.lookup where login = suser_name() open apctx

fetch apctx into @appname, @attr, @value


While (@@sqlstatus = 0) begin

select f@retval =

set_appcontext (rtrim (@appname), rtrim(@attr), rtrim(@value))

fetch apctx into @appname, @attr, @value end

go

public 授予执行 loginproc 的权限:

grant execute on loginproc to public

若要将特定用户与登录触发器关联,请在该用户的缺省数据库中运行

alter login


配置登录触发器


您必须启用 sso_role 才能设置、更改或删除登录触发器。登录触发器的 对象 ID 存储在 syslogins.procid 列中。缺省情况下,登录触发器不存在。 必须使用 alter login 对它们进行注册。

在用户的缺省数据库中运行此命令。作为登录触发器注册的存储过程在 用户的缺省数据库中必须可用,原因是 Adaptive Server 将在用户的缺省 数据库中搜索 sysobjects 表,以查找登录触发器对象。

配置登录触发器 下面的示例将存储过程 my_proc (它必须存在于您要配置的数据库中) 配置为 Adaptive Server 登录名 my_login 的登录触发器:

alter login my_login modify login script "my_proc"

同样,必须在用户的缺省数据库中执行该命令。 Adaptive Server 将检查 登录名是否对存储过程具有 execute 权限,但只有在用户实际登录并执 行登录触发器时才会发生。

删除和更改登录触发器 一旦将存储过程配置为登录触发器,就不能删除该存储过程了。必须先 取消对它的配置,要么连登录触发器一起删除,要么将登录触发器更改 为其它存储过程。若要删除登录触发器,请输入:

alter login my_login drop login script

若要将登录触发器更改为其它存储过程,请输入:

alter login my_login modify login script "diff_proc"

显示登录触发器 若要显示当前登录触发器,请使用 sp_displaylogin

sp_displaylogin my_login go


(....)

Default Database:my_db Default Language:

Auto Login Script:my_proc

....


执行登录触发器


登录触发器不同于普通的存储过程,原因在于它们一旦注册之后,便会 在后台执行,而不需要活动的用户连接。在配置了登录触发器之后,只 要用户一登录, Adaptive Server 就会在后台自动执行该登录触发器,并 且执行登录触发器的过程会发生在服务器执行来自客户端应用程序的任 何命令之前。

如果一个登录进行了多个并发连接,登录触发器会在每个会话中独立执 行。同样,多个登录可以将同一个存储过程配置成登录触发器。

后台执行意味着您不能在配置为登录触发器的存储过程中使用存储过程 的某些标准功能。例如,不能向该过程传送或从该过程接收任何没有缺 省值的参数,该过程也不会传递回任何结果值。

这种特殊的执行模式会影响由登录触发器存储过程调用的任何存储过 程,以及登录触发器存储过程本身生成的任何输出。

您还可以将登录触发器存储过程作为正常的存储过程执行,例如在 isql 命令中。该过程将正常地执行和发挥作用,像通常那样显示所有输出和 错误消息。


了解登录触发器输出


将存储过程作为后台任务执行的主要影响是登录触发器的输出不会写入 到客户端应用程序中,而是以一些 (但不是全部)错误消息的形式写 入 Adaptive Server 错误日志文件。

在错误日志中,print raiserror 消息的输出均带有前缀词 background task message background task error。例如,登录触发器中的语句 print Hello! raiserror 123456 Adaptive Server 错误日志中显示为:

(....) background task message:Hello!

(....) background task error 123456:This is test message 123456

但是,并非所有输出都会写入 Adaptive Server 错误日志:

select 语句 (通常发送到客户端连接)的结果集不会出现在任何位 置,甚至也不会出现在 Adaptive Server 错误日志中。该信息将消失。


通常执行以下语句:insert ... select select...into 语句,以及其它一些 通常不将结果集发送到客户端应用程序的 DML 语句和存储过程中 通常允许使用的 DDL 语句。


对其它应用程序使用登录触发器

登录触发器是作为 Adaptive Server 中行级访问控制功能的一部分设计 的。在此环境中,一旦某个会话登录到 Adaptive Server 后,您就可以结 合使用登录触发器与访问规则和应用程序环境的功能,设置行级访问控 制。不过,还可以将登录触发器用于其它目的。

限制并发连接的数目 以下示例限制特定登录可与 Adaptive Server 建立的并发连接的数目。在 需要被限制访问的用户的缺省数据库中执行示例中步骤 1 2 中描述的 每个命令:

1 由系统管理员创建 limit_user_sessions 存储过程:

create procedure limit_user_sessions as

declare @cnt int,

@limit int,

@loginname varchar(32)


select @limit = 2 -- max nr. of concurrent logins


/* determine current #sessions */ select @cnt = count(*)

from master.dbo.sysprocesses where suid = suser_id()


/* check the limit */ if @cnt > @limit begin

select @loginname = suser_name()

print "Aborting login [%1!]:exceeds session limit [%2!]",

@loginname, @limit

/* abort this session */ select syb_quit()

end go


grant exec on limit_user_sessions to public go

2 以系统安全员身份将此存储过程配置为用户 “bob”的登录触发器:



强制执行基于时间的 限制

alter login bob modify login script "limit_user_sessions"

go

3 现在,当用户 “bob”创建 Adaptive Server 的第三个会话时,登录 触发器将调用 syb_quit() 函数终止该会话:

% isql -SASE125 -Ubob -Pbobpassword 1> select 1

2> go

CT-LIBRARY error:

ct_results():network packet layer:internal net library error:Net-Library operation terminated due to disconnect

4 此消息将显示在 Adaptive Server 错误日志文件中:

(...) background task message:Aborting login [ my_login]:exceeds session limit [2]

此示例描述系统管理员如何通过创建登录触发器来对用户会话强制执行 基于时间的限制。在需要被限制访问的用户的缺省数据库中执行步骤 1

4 中描述的每个命令:

1 以系统管理员身份创建此表:

create table access_times ( suid int not null, dayofweek tinyint, shiftstart time,

shiftend time)

2 由系统管理员将以下行插入表 access_times。这些行指示允许用户 “bob”在星期一上午 9 点到下午 5 点登录到 Adaptive Server,并允许 用户 “mark”在星期二上午 9 点到下午 5 点登录到 Adaptive Server

insert into access_times

select suser_id('bob'), 1, '9:00', '17:00' go

insert into access_times

select suser_id('mark'), 2, '9:00', '17:00' go

3 以系统管理员身份创建 limit_access_time 存储过程,该存储过程引用

access_time 表来确定是否应授予登录访问权限:

create procedure limit_access_time as declare @curdate date,

@curdow tinyint,

@curtime time,


@cnt int,

@loginname varchar(32)


-- setup variables for current day-of-week, time select @curdate = current_date()

select @curdow = datepart(cdw,@curdate) select @curtime = current_time()

select @cnt = 0


-- determine if current user is allowed access select @cnt = count(*)

from access_times

where suid = suser_id() and dayofweek = @curdow

and @curtime between shiftstart and shiftend


if @cnt = 0 begin

select @loginname = suser_name()

print "Aborting login [%1!]:login attempt past normal working hours", @loginname


-- abort this session return -4

end go


grant exec on limit_access_time to public go

4 以系统安全员身份将 limit_access_time 存储过程配置为用户 “bob” 和 “mark”的登录触发器:

alter login bob login script "limit_access_time"

go

alter login mark login script "limit_access_time"

go

5 在星期一,用户 “bob”可以成功创建一个会话:

isql -Ubob -Ppassword 1> select 1

2> go

-----------

1

(1 row affected)


但是,用户 “mark”无权访问 Adpative Server

isql -Umark -Ppassword 1> select 1

2> go

CT-LIBRARY error:

ct_results():network packet layer:internal net library error:Net-Library operation terminated due to disconnect

6 将在错误日志中记录以下消息:

(...) server back-ground task message:Aborting login [mark]:login attempt past normal working hours

上述示例显示了如何限制特定登录名的并发连接的数目,以及如何限制 该登录名在特定的时间进行访问,但它有一个缺点:客户端应用程序无 法方便地检测到会话被终止的原因。若要向用户显示一条消息 (例如 “现在用户太多 — 请稍后重试”),请使用其它方法。

您可以在存储过程中故意引发一个错误以中止登录触发器存储过程,而 不是调用内置函数 syb_quit(),该函数将使服务器仅终止当前会话。

例如,用零作除数可以中止登录触发器存储过程、终止会话并导致出现 消息。


登录触发器限制


以下操作受到限制。

不能创建 #temp 表在会话中稍后使用。过程一旦完成,就将自动删 除 #temp 表并恢复初始会话设置,就像在任何其它存储过程中一 样。

不要对 sa 登录名使用登录触发器;失败的登录触发器会将您锁定在

Adaptive Server 之外。

不要对任何执行时间超过几秒的操作或执行过程中可能存在问题的 操作使用登录触发器。


发布和信息


如果不能访问 Adaptive Server 错误日志,请不要使用登录触发器。 始终检查 Adaptive Server 错误日志中是否有错误消息。


对于 Adaptive Server 15.0.2 版及更高版本,当服务器启动时,在登 录触发器中设置或取消设置的任何可导出选项将在登录过程中生 效。

若要禁用此行为,请在登录触发器内执行 set export_options off

Adaptive Server 15.0.112.5.4 版及早期版本要求您使用跟踪标志

4073 启动 Adaptive Server 来启用登录触发器选项。

客户端应用程序 (如 isql)不知道登录触发器的存在或执行;它会 在成功登录后立即显示命令提示符,虽然 Adaptive Server 在登录触 发器成功执行前不会执行任何命令。即使登录触发器终止了用户连 接,也会显示该 isql 提示符。

登录到 Adaptive Server 的用户必须具有 execute 权限才能使用登录触 发器存储过程。如果未授予 execute 权限,则 Adaptive Server 错误日 志中会显示一条错误消息并且用户连接将立即关闭 (虽然 isql 仍显 示命令提示符)。

Adaptive Server 错误日志显示类似于以下内容的消息:

EXECUTE permission denied on object my_proc, database my_db, owner dbo

登录触发器存储过程不可以包含没有指定缺省值的参数。如果存储 过程中出现不带缺省值的参数,则登录触发器将失败,并且 Adaptive Server 错误日志中出现类似于以下内容的错误:

Procedure my_proc expects parameter @param1, which was not supplied...


禁用对登录触发器的执行特权

数据库所有者或管理员可以禁用对登录触发器的 execute 特权,或者对 登录触发器进行编码,以便只允许特定时间内的访问。例如,您可能要 禁止常规用户在数据库所有者或管理员更新表时使用数据库。


image

注释 如果登录触发器返回负数,则登录失败。

image




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