mysql sp who_对ASE系统存储过程的剖析-sp_who

昨晚有空,把 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

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

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

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

分析下来,如果你执行一个 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

分享至:

90ed4b13fe016cebd9fe3df2ae3a899b.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链、自动驾驶、人工智能鏖战开始 谁将成为下一个风口?

近年来&#xff0c;区块链、自动驾驶以及人工智能的概念频繁爆红于科技界。有业者称&#xff0c;区块链的颠覆在于人们找到了一个低成本解决信任问题的方案&#xff1b;自动驾驶的出现方便了人们的交通出行&#xff1b;人工智能则为我们打开了新的世界。不论是区块链、自动驾驶…

JWT 介绍 - Step by Step

翻译自 Mohamad Lawand 2021年3月11日的文章 《Intro to JWT - Step by Step》 [1]在本文中&#xff0c;我将向您介绍 JWT[2]。我们今天要讲的内容包含&#xff1a;JWT 是什么我们应该在什么时候使用它JWT 与 Session Id 比较JWT 结构JWT 签名JWT 是什么JWT (JSON Web Token) 是…

Helpdesk 流程

最近Fox的公司部署了新的Helpdesk系统。为了让用户从原来打电话和发邮件寻求IT员工帮助的方式转变为使用Helpdesk系统提交tickets&#xff0c;需要制定和规范Helpdesk流程&#xff0c;小小推动下ITIL进程。 HelpDesk系统与AD集成。公司用户可以使用域用户名和密码登陆Helpdesk系…

vscode 快速调到定义处_vim技巧:在程序代码中快速跳转,在文件内跳转到变量定义处...

本篇文章介绍 vim 的一些使用技巧&#xff1a;在程序代码中快速跳转在文件内跳转到变量定义处在程序代码中快速跳转在 vim 中查看代码文件时&#xff0c;可以使用下面命令在程序代码中快速跳转&#xff0c;提高效率。%跳转到光标所在括号的另一个配对括号上&#xff0c;适用于小…

震撼!英伟达用深度学习做图像修复,毫无ps痕迹

在计算机视觉研究领域&#xff0c;NVIDIA常常让人眼前一亮。比如“用Progressive Growing的方式训练 GAN&#xff0c;生成超逼真高清图像”&#xff0c;“用条件 GAN 进行 2048x1024 分辨率的图像合成和处理”的pix2pixHD项目&#xff0c;或者脑洞大开的让晴天下大雨、小猫变狮…

程序员过关斩将--重复的请求并不好过滤

为什么要做重复请求的过滤呢&#xff1f;不过滤不行吗&#xff1f;过滤重复请求很难吗&#xff1f;加一个请求ID不就好了吗&#xff1f;每个技术难点的话题&#xff0c;肯定是由一个产品需求引发的&#xff0c;俗话说&#xff1a;如果没有产品经理&#xff0c;程序员将不需要听…

.NET团队送给.NET开发人员的云原生学习资源

企业正在迅速采用云的功能来满足用户需求&#xff0c;提高应用程序的可伸缩性和可用性。要完全拥抱云并优化节约成本&#xff0c;就需要在设计应用程序时考虑到云的环境&#xff0c;也就是要用云原生的应用开发方法。这意味着不仅要更改应用程序的构建方式&#xff0c;还要更改…

深夜,学妹说她想做Python数据分析师

大家好&#xff0c;我是大鹏&#xff0c;目前是一名数据分析师。上周末晚上&#xff0c;我的学妹突然约我出来喝咖啡。想起学妹在学校就一直说想转行&#xff0c;最近在网上捣鼓自学数据分析软件有一小段时间了。我想她不是为了叙旧。果然来到咖啡店&#xff0c;她一屁股坐下来…

在真实工作中的编程是怎么样的,与学校里有什么不同?

学校里每门编程语言课程都是上一点上不完的&#xff0c;实验课写的代码最长一两百行。 而在真实的工作环境中&#xff0c;程序员写代码是怎么样的&#xff1f;每天要啪啪啪手敲成千上万行代码嘛&#xff1f;和在学校学习时写代码有什么异同呢&#xff1f;/*说说我的经验*/刚进公…

聊一聊Docker与时区

前言 当我们把应用部署到容器里面之后&#xff0c;基本都会要和时间/时区打交道&#xff01;&#xff01;大部分的应用&#xff0c;多多少少都会有获取当前时间的操作&#xff0c;试想一下应用拿到的时间不对&#xff0c;那么业务极有可能会乱套&#xff0c;造成严重的损失。时…

百度竟然不是中国的

2019独角兽企业重金招聘Python工程师标准>>> 身份之谜—百度是中国公司吗&#xff1f; 虽然&#xff0c;Baidu在美国上市使用了“中国的Google”这么一个概念&#xff0c;说真的&#xff0c;我知道的Baidu和Google最大的共同点也许就是他们都是美资公司。Baidu公司…

tortoisegit图标消失_安装TortoiseGit 状态图标不能正常显示

如果你安装 TortoiseSVN 之后&#xff0c;功能使用正常&#xff0c;但是文件夹或文件左上角就是不显示图标&#xff0c;那么你可能1. 64bit 系统上装了 32bit 的 TortoiseSVN解决方法是&#xff0c;再安装 64bit 的 TortoiseSVN&#xff0c;两者可并行运行2. Windows Explorer …

好用的验证框架FluentValidation(上)

把数据错误扼杀在早期&#xff0c;那就是在数据的入口处&#xff0c;一般数据都是打包成一个实体的方式进传递&#xff0c;FluentValidation就以实体类为单位进行属性验证的集合。Install-Package FluentValidation下面看一个例子吧。实体类&#xff1a;public class Person {p…

10G 职场晋升/IT干货/生活技能/理财秘籍 【全套】学习资料免费送!

你的同龄人正在抛弃你&#xff0c;大学毕业后五年&#xff0c;你就会发现&#xff0c;同龄人之间的差距已经是云泥之别。当年一起追剧&#xff0c;一起逃课&#xff0c;一起吹牛的同学&#xff0c;有人已经年薪百万&#xff0c;有人还在抢两块钱的红包。有人去过许多国家&#…

iNeuOS工业互联平台,发布消息管理、子用户权限管理、元件移动事件、联动控制、油表饼状图和建筑类设备驱动,v3.4版本...

目 录1. 概述... 22. 平台演示... 23. 消息管理... 24. 子用户权限管理... 35. 元件移动事件... 36. 联动控制... 47. 增加油表和饼图... 58. 增加住建部DL/T645和智能液位计协议驱动1. 概述发布iNeuOS 3.4版本&#xff0c;主…

程序猿看段子,越看越心碎!

程序员整天面对代码&#xff0c;压力一定很大吧~小编表示应该时不时也给你们来点段子&#xff0c;增加一下生活的乐趣&#xff0c;让你们看到希望的曙光...今天整理的10个段子&#xff0c;你们绝对喜欢。看看就知道啦&#xff01;【一直有人问我&#xff0c;程序员应该看什么书…

mysql写入监控_zabbix 自定义key 监控mysql增删查改

vim /etc/zabbix/zabbix_agentd.d/mysql.conf##zabbix_agentd.d在这个文件夹下的.conf,都会被agent读取&#xff0c;我们这里新建的一个配置文件方便使用&#xff0c;这样就不需要去动主配置文件了UserParameterecho[*],echo "$1"#要传递参数要带[*]&#xff0c;且ke…

自制H3C交换机CONSOLE线

单位有一台H3C S3600交换机&#xff0c;手痒痒的想进入玩一下。 从网上查得&#xff0c;连接CONSOLE接口用的是串口&#xff0c;只不过用RJ45水晶头插入而已。 山高路远&#xff0c;囊中羞涩&#xff0c;刚好手头上有一个文曲星的连接线&#xff0c;串口的。 凭自己半桶水的电子…

5月份Github上最热门的数据科学和机器学习项目

GitHub最近以数十亿美元的交易被微软收购。GitHub一直是开发人员之间协作的终极平台&#xff0c;我们已经看到数据科学和机器学习社区同样非常需要它&#xff0c;因此&#xff0c;我们希望GitHub能在微软的保护下继续发展下去。在本月排行中&#xff0c;上榜的项目有英特尔开源…

Blazor 中如何下载文件到浏览器

Blazor 中如何下载文件到浏览器目录一、前言二、方法一&#xff08;导航跳转&#xff09;三、方法二&#xff08;下载后传出&#xff09;(一) 使用 RestSharp 下载(二) 使用 BlazorDownloadFile 传出独立观察员 2021 年 3 月 28 日一、前言最近想给之前文章《下载中转加速器 VP…