祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 28448|回复: 15

[学习笔记] [原创]对ASE系统存储过程的剖析-sp_who

[复制链接]

[学习笔记] [原创]对ASE系统存储过程的剖析-sp_who

[复制链接]
阿辉

主题

0

回帖

194

积分

超级版主

积分
194
贡献
在线时间
小时
2005-10-12 08:05:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×

昨晚有空,把 sybase 系统过程 sp_who DDL 后分析了一下,全文如下:



-- 以下是 DDL 出来的内容:

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

-- DDL for Stored procedure 'sybsystemprocs.dbo.sp_who'

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

-- 以上是注释


print 'Creating Stored procedure sp_who'

go

-- 上面两句是显示一句话, go 是执行(下同)


use sybsystemprocs

go

-- 选择将要使用的数据库(存储过程建在什么数据库里)


setuser 'dbo'

go

-- 使当前用户充当 'dbo


-- 以下是存储过程的实体

/* Sccsid = "%Z% generic/sproc/%M% %I% %G%" */

/* 4.8 1.1 06/14/90 sproc/src/serveroption */


/*

** Messages for "sp_who" 17nnn

**

** 17231, "No login with the specified name exists."

*/

-- 以上是注释


create procedure sp_who @loginame varchar(30) = NULL as

-- 创建存储过程 sp_who) 的参数 loginame


declare @low int

declare @high int

declare @spidlow int

declare @spidhigh int

declare @len1 int, @len2 int, @len3 int

-- 申明了若干变量


if @@trancount = 0

--@@ 开头的都是系统全局变量

--@@trancount 是用来检查事务嵌套级别的全局变量,批处理中每个 begin transaction 将事务计数加 1

begin

set chained off

-- 用在会话开始和事务结束时使用,指示是否在第一个数据检索或数据修改语句前开始一个事务(是否在 delte fetch insert open select update 前隐式执行一个 begin transaction 命令)

end


set transaction isolation level 1

-- 设置会话所用的事务隔离级别。当设置此选项后,所有当前或将来的事务都将在些隔离级别上运行

--level 1 的意义:允许对数据使用共享读取锁

select @low = @@minsuid, @high = @@maxsuid,

@spidlow = @@minspid, @spidhigh = @@maxspid

-- 给局部变量赋值,四个全局变量的含义:

--@@minsuid :最小服务器用户 ID

--@@maxsuid :最大服务器用户 ID

--@@minspid :最小服务器进程 ID

--@@maxspid :最大服务器进程 ID


if @loginame is not NULL

-- 判断存储过程的参数是否为空

begin

-- 开始一个新的批

select @low = suser_id(@loginame), @high = suser_id(@loginame)

--suser_id: 系统函数,返回服务器用户在 syslogins 表中的 ID


if @low is NULL

-- 如果参数 @loginame 不正确的话, suser_id 应该返回 NULL

begin

if @loginame like "[0-9]%"

-- 判断一下 @loginame 是不是数字开头的字符串

begin

-- 如果是的话把说明参数 @loginame 应该是服务器系统进和 ID

select @spidlow = convert(int, @loginame),

@spidhigh = convert(int, @loginame),

@low = 0, @high = @@maxsuid

-- 把参数 @loginame 转换成 int 型并赋给 @spidlow @spidhigh

end

else

-- 如果不是数据开头的字符串,返回错误代码,并返回

begin

/*

** 17231, "No login with the specified name exists."

*/

raiserror 17231

-- 返回的错误号是 17231

--raiserror 的作用是返回预定义的错误号

return (1)

end

end

end

-- 以上进行的工作是将 @loginame 进行处理,生成下面查询语言的所需的条件值 @low @high @spidlow @spidhigh

共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
阿辉 楼主

主题

0

回帖

194

积分

超级版主

积分
194
贡献
在线时间
小时
2005-10-12 08:05:54 | 显示全部楼层

select @len1 = max(datalength(suser_name(suid))),

@len2 = max(datalength(db_name(dbid))),

@len3 = max(datalength(suser_name(origsuid)))

from master..sysprocesses

where suid >= @low and suid <= @high and

spid >= @spidlow and spid <= @spidhigh

--suser_name() :返回当前服务器用户的名称或已指定服务器用户 ID 的用户

--db_name() :返回已指定 ID 号的数据库的名称

--suser_name() :返回当前服务用户的名称或已指定服务器用户 ID 的用户


--datalength() :返回指定列或字符串的实际长度(以字节表示)

--max() :返回表达式的最大值


-- 以上语句找出 master sysprocesses 表中 suid dbid origsuid 三列的最大实际长度


-- 以下语句是返回结果

-- 两个 select 语句的检索列、 from where order 子句都是一样的,只是检索列的字符串长度不一致!(更好看些,呵呵)

-- 两个 select 语句都是从 master sysprocesses 表中检索出符合条件的指定列, 红色的地方是两个 select 不一致的地方

if (@len1 > 8 or @len2 > 6 or @len3 > 8)

begin

select fid,

spid,

status,

loginame=suser_name(suid),

origname=isnull(suser_name(origsuid), suser_name(suid)),

hostname,

blk_spid=convert(char(5),blocked),

dbname=db_name(dbid),

cmd,

block_xloid

from master..sysprocesses

where suid >= @low and suid <= @high

and spid >= @spidlow and spid <= @spidhigh

order by fid,spid,dbname

end

else

begin

select fid,

spid,

status,

loginame= convert(char(12), suser_name(suid) ) ,

origname= convert(char(12), isnull(suser_name(origsuid), suser_name(suid)) ) ,

hostname,

blk_spid=convert(char(5),blocked),

dbname=convert(char(10),db_name(dbid)),

cmd,

block_xloid

from master..sysprocesses

where suid >= @low and suid <= @high

and spid >= @spidlow and spid <= @spidhigh

order by fid,spid,dbname

end


return (0)

-- 返回

go


Grant Execute on dbo.sp_who to public

-- public 组授予执行 sp_who 的权限

go

setuser

-- 如果在执行 setuser 命令时没有指定用户名,则将重新建立数据库所有者的初始标识

go


-- 我们可以看到,该存储过程的基本思路是先对传入的参数进行处理,生成查询用的条件参数,进而得出查询结果。

-- 对于该存储过程为了最终显示效果而加入的一段代码的作法,是值得我们学习的。

共享共进共赢Sharing And Win-win Results
阿辉 楼主

主题

0

回帖

194

积分

超级版主

积分
194
贡献
在线时间
小时
2005-10-12 09:25:30 | 显示全部楼层

分析下来,如果你执行一个 sp_who '1sgfadf'

就会发生:

Syntax error during explicit conversion of VARCHAR value '1sgfadf' to a INT field.

的错误

呵呵,都是下面这段语句惹的祸:

if @loginame like "[0-9]%"

-- 判断一下 @loginame 是不是数字开头的字符串

begin

-- 如果是的话把说明参数 @loginame 应该是服务器系统进和 ID

select @spidlow = convert(int, @loginame),

@spidhigh = convert(int, @loginame),

@low = 0, @high = @@maxsuid

-- 把参数 @loginame 转换成 int 型并赋给 @spidlow @spidhigh

end

共享共进共赢Sharing And Win-win Results
tramplai

主题

0

回帖

69

积分

超级版主

积分
69
贡献
在线时间
小时
2005-10-21 11:08:15 | 显示全部楼层

阿辉真厉害

我以前也埋头看了三个月的时间(sybase的系统procedure)

共享共进共赢Sharing And Win-win Results
loading

主题

0

回帖

53

积分

注册会员

积分
53
贡献
在线时间
小时
2005-10-24 15:29:48 | 显示全部楼层
厉害啊  
共享共进共赢Sharing And Win-win Results
lx_ccc

主题

0

回帖

1

积分

新手上路

积分
1
贡献
在线时间
小时
2005-10-25 12:15:47 | 显示全部楼层
77777777777777777777777
共享共进共赢Sharing And Win-win Results
tzg

主题

0

回帖

1

积分

新手上路

积分
1
贡献
在线时间
小时
2005-11-9 09:42:21 | 显示全部楼层

楼主真厉害,

我是新人.

以后还请多多指教.

共享共进共赢Sharing And Win-win Results
codo

主题

0

回帖

20

积分

注册会员

积分
20
贡献
在线时间
小时
2005-11-11 12:02:26 | 显示全部楼层
楼主有没有分析过sp_helpdb?我每次都要通过sp_helpdb dbname然后把free kbytes加起来看看够不够大(200M左右),如果低于该值,要不删表里的数据,要不再加设备。
共享共进共赢Sharing And Win-win Results
codo

主题

0

回帖

20

积分

注册会员

积分
20
贡献
在线时间
小时
2005-11-14 13:46:25 | 显示全部楼层
顶一下
共享共进共赢Sharing And Win-win Results
lityai

主题

0

回帖

15

积分

新手上路

积分
15
贡献
在线时间
小时
2005-11-17 16:05:02 | 显示全部楼层
顶过!~
共享共进共赢Sharing And Win-win Results
秋离

主题

0

回帖

286

积分

注册会员

积分
286
贡献
在线时间
小时
2005-12-16 21:47:50 | 显示全部楼层
共享共进共赢Sharing And Win-win Results
shequnli

主题

0

回帖

2

积分

新手上路

积分
2
贡献
在线时间
小时
2007-4-26 14:53:44 | 显示全部楼层

厉害啊,能分析下sp_configure吗?

谢谢

共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-11-14 14:47 , Processed in 0.136247 second(s), 9 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表