巧用SQL的全局临时表防止用户重复登录
巧用SQL的全局临时表防止用户重复登录
文章来自:http://www.cnblogs.com/lindayyh/archive/2010/04/05/1704763.html
在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统?特别是对于银行或是财务部门,更是要限制用户以其工号身份多次登入。
可能会有人说在用户信息表中加一字段判断用户工号登录的状态,登录后写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)
相关文档:
测试机test安装的是windows server2008+sql server 2008,数据库安装成功。可以连接局域网内其他机器的数据库(其他机器的数据库为SQL 2005)。但是网内其他机器访问test时,无法连接,报错。信息为:在建立与服务器的连接时出错。在连接到SQL SERVER 2005时,在默认的设置下SQL SERVER 不允许进行远程连接可能会导致次失败 ......
上周接到一个奇怪的bug,一个曾经运行得很好的存储过程突然产生了错误的结果。
负责维护的兄弟们很负责任的对错误进行了跟踪,并把错误定位一个如下的语句:
SELECT *
into SomeTable
from A join B on A.id=B.id
join C on A.id=C.id
他们发现从SomeTable做查询的 ......
文章来源:IT工程技术网, 全文链接:http://www.systhinker.com/html/81/n-11481.html
1.计算每个人的总成绩并排名
select name,sum(score) as allscore from stuscore group by name order by allscore
2.计算每个人的总成绩并排名
select distinct t1.name,t1.stuid,t2.allscore from stuscore t1,( select st ......
The following tables describe certain SQL
limits. Adhering to the most restrictive case can help the programmer
design application programs that are easily portable.
Table 7. Identifier Length Limits
Description
Limit in Bytes
Longest authorization
name (can only be single-byte characters) ......
我理解的SQL Server 2005镜像配置实际上就是由三个服务器(也可以是同一服务器的三个 SQL 实例)组成的一个保证数据的环境,分别是:主服务器、从服务器、见证服务器。
主服务器:数据存放的地方
从服务器:数据备份的地方(即:主服务器的镜像)
见证服务器:动态调配主/从服务器的第三方服务器
环境介绍
首先介 ......