• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-6-21 12:06 | 作者:   | 来源:   | 查看: 16次 | 进入软件测试论坛讨论

领测软件测试网

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

  可能会有人说在用户信息表中加一字段判断用户工号登录的状态,登录后写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告诉用户说”对不起,此工号正被使用!”

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网