利用SQLServer的全局临时表防止用户重复登录


在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统? 特别是对于银行或是财务部门,更是要限制用户以其工号身份多次登入。

可能会有人说在用户信息表中加一字段判断用户工号登录的状态,登录后写 1 ,退出时写 0 ,且登录时判断其标志位是否为 1 ,如是则不让该用户工号登录。但是这样那势必会带来新的问题:如发生象断电之类不可预知的现象,系统是非正常退出,无法将标志位置为 0 ,那么下次以该用户工号登录则不可登入,这该怎么办呢?

或许我们可以换一下思路:有什么东西是在 connection 断开后可以被系统自动回收的呢?对了, SQL Server 的临时表具备这个特性!但是我们这里的这种情况不能用局部临时表,因为局部临时表对于每一个 connection 来说都是一个独立的对象,因此只能用全局临时表来达到我们的目的。

好了,情况已经明朗话了,我们可以写一个象下面这样简单的存储过程 :

create procedure gp_findtemptable -- 2001/10/26 21:36 zhuzhichao in nanjing

/* 寻找以操作员工号命名的全局临时表

  • 如无则将 out 参数置为 0 并创建该表 , 如有则将 out 参数置为 1

  • 在 connection 断开连接后 , 全局临时表会被 SQL Server 自动回收

  • 如发生断电之类的意外 , 全局临时表虽然还存在于 tempdb 中 , 但是已经失去活性

  • 用 object_id 函数去判断时会认为其不存在 .

*/

@v_userid varchar(6), -- 操作员工号

@i_out int out -- 输出参数 0: 没有登录 1: 已经登录

as

declare @v_sql varchar(100)

if object_id('tempdb.dbo.##'+@v_userid) is null

begin

set @v_sql = 'create table ##'+@v_userid+'(userid varchar(6))'

exec (@v_sql)

set @i_out = 0

end

else

set @i_out = 1

在这个过程中,我们看到如果以用户工号命名的全局临时表不存在时过程会去创建一张并把 out 参数置为 0 ,如果已经存在则将 out 参数置为 1 。

这样,我们在我们的应用程序中调用该过程时,如果取得的 out 参数为 1 时,我们可以毫不客气地跳出一个 message 告诉用户说 ” 对不起,此工号正被使用! ”

( 测试环境 : 服务器 :winnt server 4.0 SQL Server7.0 工作站 :winnt workstation)

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus