我是SQL小菜鸟---SQL全局临时表防止用户重复登录
先介绍一下什么是sql临时表及使用方法
临时表
SQL Server 支持临时表。临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。
临时表有两种类型:
本地临时表
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表。
全局临时表
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。
--应用本地临时表
declare @sql varchar(100)
set @sql='select ''123'' as a,''abasdf'' as b into #t'
exec(@sql)
select * from #t
go
/*发现不能正确显示临时表的数据
提示:
服务器: 消息 208,级别 16,状态 1,行 5
对象名 '#t' 无效。
*/
--修改为全局临时表
declare @sql varchar(100)
set @sql='select ''123'' as a,''abasdf'' as b into ##t'
exec(@sql)
select * from ##t
drop table ##t
go
/*可以正确显示临时表的数据
分析原因:exec(@sql) 相当于重新建立一个数据库对话,所以对于本地临时表,使用exec(@sql)创建临时表,
在exec外部不能正确访问;而使用全局临时表就ok了
*/
- SQL code
-
exec('select top 10 * into ##temp from syhouse'); exec('select * from ##temp');
为了防止用户的重复登录,在一开始想到的一种方法:
在用户表中添加一个字段,登录后写1,退出后写0.这样子在用户登录进行检查的时候判断这个字段是否为0,如果是0那么就可以登录;但是这样子就又带来了新的问题,如果在用户正在登录的过程中突然断电,那么表中写入的是1,也就是说用户在以后的登录中都不能能够登录系统了。
另外一种方法:在SQL Server中建立全局临时表,如果用户没有登录就建立一个临时表来存放用户,如果已经登录那么就提醒用户此账号已经登录;临时表相比较上面一个方法的好处就在于:当系统与SQL Server数据库的连接断开以后,临时表是可以被系统自动收回的,这样子用户下次登录的时候会再次建立一个临时表并且可以登录成功!
依据第二种思路我们建立一个存储过程:
- create proc PROC_FindTemptable
- /*
- * 寻找以操作员工号命名的全局临时表
- * 如无则将out参数置为0并创建该表,如有则将out参数置为1
- * 在connection断开连接后,全局临时表会被SQL Server自动回收
- * 如发生断电之类的意外,全局临时表虽然还存在于tempdb中,但是已经失去活性
- * 用object_id函数去判断时会认为其不存在.
- */
- @View_userID char(20),--输入参数 操作员账号
- @outResult int out --输出参数( 0:没有登录 1:已经登录)
- as
- declare @View_sql varchar(100)
- --object_id函数判断操作员账号不存在(没有的登录)
- if OBJECT_ID ('tempdb.dbo.##'+@View_userID )is null
- begin
- --创建临时表
- set @View_sql ='create table ##'+@View_userid+'(userid char(20))'
- exec(@View_sql)
- --out参数设置为0(账号没有登录)
- set @outResult =0
- end
- --账号存在
- else
- --out参数为1
- set @outResult =1
- --在这个过程中,我们看到如果以用户工号命名的全局临时表不存在时过程会去创建一张并把out参数置为0,如果已经存在则将out参数置为1。
- --这样,应用程序中调用该过程时,如果取得的out参数为1时,我们可以毫不客气地跳出一个message告诉用户说”对不起,此工号正被使用!”
在系统中调用存储过程来实现用户登录的代码:将与数据库的连接和执行存储过程写在一个函数中,然后在客户端调用即可!
- Public Function ExecuteProcTestID(ByVal strID As String, ByVal strProc As String) As Integer
- Dim myConnection As New SqlConnection(CmdString) '定义连接
- Dim Cmd As New SqlCommand '表示SQL命令语句的执行
- '连接数据库将存储名称和参数传递给cmd
- Cmd.Connection = myConnection
- '指明为存储过程
- Cmd.CommandType = CommandType.StoredProcedure
- Cmd.CommandText = strProc
- Cmd.Parameters.Add("@View_userID", SqlDbType.VarChar, 20).Value = strID
- Cmd.Parameters.Add("@outResult", SqlDbType.VarChar, 20).Direction = ParameterDirection.Output
- Try
- '执行存储过程
- Cmd.ExecuteNonQuery()
- Return Cmd.Parameters(1).Value()
- Catch e As Exception
- Return False
- End Try
- End Function
此贴说明以上方法是行不通的 http://bbs.csdn.net/topics/340244117 呵呵
转载于:https://www.cnblogs.com/xuange/p/3679718.html
我是SQL小菜鸟---SQL全局临时表防止用户重复登录相关推荐
- 巧用SQL server的全局临时表防止用户重复登录
内容摘要:SQL Server的临时表具备这个特性!但是我们这里的这种情况不能用局部临时表,因为局部临时表对于每一个connection来说都是一个独立的对象,因此只能用全局临时表来达到我们的目的. ...
- 巧用SQL的全局临时表防止用户重复登录
在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统?特别是对于银行或是财务部门,更是要限制用户以其工号身份多次登入. 可能会有人说在用户信息表中加一字段判断用户工号登录 ...
- 合作开发收费系统——临时表解决用户重复登录问题
用户重复登录问题,是指同一个用户能够用自己的账户和密码能够同时多次登录.这样的情况在实际使用中是不允许的,就跟QQ.飞信一样,如果你已经登录,等到再次登录的时候,系统就会提醒你" ...
- asp.net mvc 自定义全局过滤器 验证用户是否登录
一般具有用户模块的系统都需要对用户是否登录进行验证,如果用户登录了就可以继续操作,否则退回用户的登录页面 对于这样的需求我们可以通过自定义一个独立的方法来完成验证的操作,但是这样代码的重复率就大大提高 ...
- 【解决SQL Server sa连接服务器失败】用户‘sa‘登录失败。已成功与服务器建立连接,但是在登录过程中发生错误
这个问题网上也有写-但是有点杂乱,因为年代久远,很多经验贴格式也很杂乱,图也裂了() 所以我稍微整理了一下网上的步骤,并加以自己的补充 (1)第一次连接服务器,先填写服务器名称(右键我的电脑可以查看到 ...
- 小菜鸟的BBS系统之用户登录及拦截器(SSM)
文件放置 我的login.jsp放置在WEB-INF的jsp下面,所以在springmvc-config.xml里面配置了视图解释器ViewResolver ①web表现层(login.jsp页面点击 ...
- Oracle全局临时表
Oracle全局临时表 目前所有使用Oracle作为数据库支撑平台的应用,大部分是数据量比较庞大的系统,即表的数据量级一般情况下都是在百万级以上.当然,在Oracle中创建分区是一种不错的选择,但是当 ...
- SQL server用户Sa登录失败的解决方法
最近在学习C#与SQL server结合建立小网站,在学习的过程中遇到的一些问题和知识点供日后参考.也希望能帮到初学者 1. 用户 Sa 登录失败的解决方法 一般练习C#连接SQL数据库会用到以下的例 ...
- SQL Server 表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
最新文章
- Another app is currently holding the yum lock; waitingn
- Raft算法和开源实现
- 用VS2017开发安卓应用
- 巨无霸Win8PE X64服务器维护专用,【13年4月4日】维护版win8pe【32位+64位+纯64位】(支持BIOS+EFI)...
- 解决matlab2018a安装后遇到matlab license manager error -8
- C语言查看文件fp指针位置
- 多头注意力代码解读(非常好的一个版本)
- windows7安装com口驱动_windows7系统u盘插电脑没有反应的解决方法
- H3C IGP与EGP
- Unity3D AssetBundle相关
- ROS:TF,机器人坐标管理神器
- WebView打不开或者显示异常可能原因
- 掌薪阁分享:一个人人可做,汇聚了全网不同层次的网赚项目!
- 计算机程序怎么读英语,编程序是什么意思
- 去中心化和中心化哪个才是未来,Dex.top教你熊市生存指南
- 智能硬件蓝牙配网方案概要
- E. Permutation Game
- 容量因子k计算公式_K因子计算方法
- Discord机器人开发
- HTTP强缓存和协议缓存