首页 > 数据库 >巧用SQL的全局临时表防止用户重复登录

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

时间:2022-12-05 10:32:11浏览次数:48  
标签:登录 临时 用户 SQL 工号 out 全局 巧用


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

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

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

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

create procedure gp_findtemptable -- 2010/04/07
/* 寻找以操作员工号命名的全局临时表
* 如无则将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告诉用户说”对不起,此工号正被使用!”

标签:登录,临时,用户,SQL,工号,out,全局,巧用
From: https://blog.51cto.com/u_11295556/5911484

相关文章

  • 批处理执行SQL备份
    建立mybackup.bat,输入以下内容直接运行该脚本,即可开始自动备份数据库也可把该脚本加入windows任务计划里执行-------------------------------------------------------......
  • (转)mysqldump意外原因
    mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份失败的情况。以下是我们经常遇到......
  • 在sqlserver2008中收缩日志文件
    —先备份数据库(含日志文件)usemyhisgobackupdatabasemyhistodisk=’d:\myhis_rzbak’go—设为简单恢复模式use[master]goalterdatabasemyhissetr......
  • (转)Linux Oracle下sqlplus无法使用命令退格删除和历史记录的解决方法(使用rlwrap)...
    一、SecureCRT终端里的解决方法:(不完美)在SecureCRT终端里,如果要在sqlplus下使用Backspace来删除字符,有两种临时方法。第一种是使用stty命令重新定义^......
  • sql server 2005中对CLR的允许设置
    在sqlserver2005中,可以允许用vs.net2005来编写存储过程了,这比T-SQL有很大好处,但要注意的是,当要使用SQLSERVER2005这个功能时,在安全性方面会......
  • mysql 5.6中关于innodb_stats_on_metadata
    在mysql5.6中,innodb_stats_on_metadata默认是关闭了这个会对INFORMATION_SCHEMA中的一些表进行查询操作,以方便索引统计信息,如果读要求高的建议关闭,见......
  • MySQL库表管理
    一、常用的数据类型:类型含义tinyint(n)1个字节,范围(-128~127)smallint(n)2个字节,范围(-32768~32767)mediumint(n)3个字节,范围(-8388608~8388607)int(n)......
  • 关于sqlservice 2019的安装
    目录一、安装SQLServer。下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads二、安装SSMS。 下载地址:https://learn.microsoft.com/zh-cn/sql/......
  • MySQL最简安装 - 开发人员用
    搭建开发用的单机、单实例mysql数据库,基于mysql5.7.39。一、规划1目录规划mysql配置文件-/etc/my.cnfmysql软件目录-/opt/zbt/mysql5.7.39mysql数据目录-/opt/......
  • mysql报错This function has none of DETERMINISTIC. NO SOL or READS SOL DATA...
    是因为存储过程/存储函数在创建时与开启慢查询日志冲突了解决冲突:临时解决:开启log_bin_trust_function_creatorsshowvariableslike'%log_bin_trust_function_cr......