同时实现同时只允许一个人登录系统 dodo

同时实现同时只允许一个人登录系统?

楼主griefforyou(为你伤心)2002-02-01 18:57:49 在 VB / 基础类 提问

现在有一个软件,要求某台电脑以身份001登录以后,在任何一台电脑上再以001就无法登录?  
   
  现在我是这样处理的:  
   
  用户以001登录时,先查询数据库某表中字段是否为"L",如不是则登录系统,将字段值  
  改为"L"。  
   
  若字段值为其它值则拒决登录。  
   
  用户退出系统时,将表中数据改成"F"。  
   
  这样就可以实现一个用户名同时只能在一台电脑中登录。  
   
  但是问题仍然存在,若系统因某原因非法关闭、或数据库连接断开、数据库服务器断电等  
   
  原因数据库字段值将不能置回"F",导致即使无人以此用户登录也无法进入系统。  
   
  不知道哪位高手知道如何处理?  
  问题点数:100、回复次数:34Top

1 楼Naola2001(摆地摊.Net)回复于 2002-02-01 19:12:02 得分 0

先UP一下,我再想Top

2 楼byasx()回复于 2002-02-01 19:14:40 得分 0

规定个时间值,超过时间不在的话就置回fTop

3 楼xu()回复于 2002-02-01 19:15:18 得分 0

你可以在服务器中用一个程序定时测试网上的用户是否存在。Top

4 楼denis_shen(丹尼斯)回复于 2002-02-01 19:24:46 得分 0

是否可以在服务端程序启动时设置所有用户的字段为“F”。反正你列举的情况都会造成需用户重新登录的。Top

5 楼Naola2001(摆地摊.Net)回复于 2002-02-01 19:27:31 得分 0

每一个用户登录时,你就执行一段代码,检测当前所有连接的用户,重写至数据表中。如果此用户名在表中则不接受登录,如不在表中,则追加此用户到表中,接受登录Top

6 楼kyd(御风而行)回复于 2002-02-01 19:32:25 得分 0

如果是局域网,ip又固定,可以考虑用ip来判断Top

7 楼kyd(御风而行)回复于 2002-02-01 19:36:16 得分 0

如果一个用户登录时,服务端发现该用户已登录,就尝试连接该用户的客户端程序(通过ip或其他标识),如果没有响应就允许登录Top

8 楼ferrytang(欢迎你)回复于 2002-02-01 19:38:43 得分 0

等一会儿我贴上来Top

9 楼hxflx(踪之声)回复于 2002-02-01 20:15:30 得分 0

每个用户都有自已的ID及密码,不可以吗?Top

10 楼hxflx(踪之声)回复于 2002-02-01 20:36:15 得分 0

是Oracle数据库吗?Top

11 楼shanhe(TNT)回复于 2002-02-01 20:53:47 得分 5

增添一个logonTime字段,记录登陆时间;在登陆时,如果发现上次登陆时间超时x分钟就无论检测是否登陆的字段允许登陆。程序运行期间应当时常修改登陆最好登陆时间.Top

12 楼griefforyou(为你伤心)回复于 2002-02-02 09:04:29 得分 0

不好意思,我忘了说了,服务器为SQL   Server数据库,没有什么其它服务端程序。  
   
  To:byasx() (2002-2-1   19:14:40)  
  规定个时间值,超过时间不在的话就置回f      
   
  回复:这是什么意思?说明白一点好吗?  
   
  ---------------------------------------  
  To: xu() (2002-2-1   19:15:19)  
  你可以在服务器中用一个程序定时测试网上的用户是否存在。      
  To: denis_shen(丹尼斯) (2002-2-1   19:24:46)是否可以在服务端程序启动时设置所有用户的字段为“F”。反正你列举的情况都会造成需用户重新登录的。      
  To: kyd(御风而行) (2002-2-1   19:36:17)如果一个用户登录时,服务端发现该用户已登录,就尝试连接该用户的客户端程序(通过ip或其他标识),如果没有响应就允许登录      
   
   
  回复:没有服务器端程序。即使有,那么是要采用TCP/IP来侦听某个端口吗?  
   
  ---------------------------------------  
  To: Naola2001(摆地摊的) (2002-2-1   19:27:31)每一个用户登录时,你就执行一段代码,检测当前所有连接的用户,重写至数据表中。如果此用户名在表中则不接受登录,如不在表中,则追加此用户到表中,接受登录      
   
  回复:如何检测当前所有连接的用户?是不是说有服务端程序?  
   
  Top

13 楼griefforyou(为你伤心)回复于 2002-02-02 11:01:44 得分 0

没人理?Top

14 楼tommychim(阿布洛迪)回复于 2002-02-02 11:18:18 得分 5

一般是这样的,应该设置一个DBA,该用户在任何时候可以登陆(当然密码要由该用户自己好好保管),即便在登陆状态为‘L’的时候也可以强行登陆。该DBA可以对其他一般用户进行释放。也就是说当其他用户非正常退出(状态为‘L’)时,和DBA联系,由DBA把状态改回到未登陆的状态Top

15 楼wts(天胜)回复于 2002-02-02 11:44:19 得分 0

是否可以在表中增加一个登陆时间的字段,然后由客户端定期(如一个小时)修改这个字段,并且在服务器端定期检测,如果超过一个小时没有改写的话,就将“L”改写为“F”。如果要再方便一些的话,也可以是增加两个字段,一个是登陆时间,一个是刷新时间,那么定期改写的就是这个刷新时间了。服务器定期的检测就是检查这两个时间的差值了!  
  供参考!Top

16 楼Frank_Xu()回复于 2002-02-02 12:26:35 得分 0

是用什麼做數據庫?Top

17 楼griefforyou(为你伤心)回复于 2002-02-02 15:23:20 得分 0

To:回复人: wts(天胜)   
  回复:我不打算再写一个服务端程序。  
  ----------------------------------  
  To:回复人: Frank_Xu()  
  是用什麼做數據庫?      
  回复:SqlServer。不知道数据库中是否有类似触发器之类的东西可以检查客户是否断开连接?  
   
  To: tommychim(阿布洛迪)   
  一般是这样的,应该设置一个DBA,该用户在任何时候可以登陆(当然密码要由该用户自己好好保管),即便在登陆状态为‘L’的时候也可以强行登陆。该DBA可以对其他一般用户进行释放。也就是说当其他用户非正常退出(状态为‘L’)时,和DBA联系,由DBA把状态改回到未登陆的状态      
   
  回复:你的方法当然是可以的,但是这个DBA如果只有一个,正好他不在?怎么办?  
   
  Top

18 楼gujianxin(木头象)回复于 2002-02-02 16:39:04 得分 5

好象不用写到数据库中吧!  
   
  登陆时检测是否有用此名登陆的用户,如有,检测是否保持连接,否则,记录登陆IP,端口,允许登陆,总之,可以定义一个已登陆用户的结构  
   
  type   AcceptUser  
      ip   as   string  
      port   as   integer     'or   string  
      AcceptTime   as   Date  
      UserName   as   string  
  end   type  
   
  Top

19 楼Frank_Xu()回复于 2002-02-02 17:15:13 得分 70

采用存儲過程:  
  CREATE   PROCEDURE     ProcOperatorIsExist  
    (@v_userid   VarChar(30),@i_out   Int   OutPut)  
  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  
   
   
  @v_userid   為當前登錄用戶.   登錄時判斷返回值@i_out,為0則允許登錄.為則提示當前該用戶  
  已在操作中退出.  
   
  原理:建立全局表,當用戶不管是什麼原因斷開連接(如斷電,斷機或用戶退出,連接超時等情況)時,全局表會自動刪除.  
  Top

20 楼Frank_Xu()回复于 2002-02-02 17:16:55 得分 0

@v_userid   為當前登錄用戶.   登錄時判斷返回值@i_out,為0則允許登錄.為1則提示當前該用戶  
  已在操作中退出.  
   
  Top

21 楼Frank_Xu()回复于 2002-02-02 17:25:54 得分 0

在系統中如果提供更換操作員功能,則在調用更換操作員表單前,代碼刪除該表.  
  Drop   Table   ##@更換前用戶名  
   
  可下載我的繁體會計系統(已正常運行半年多了),里面就SQL運用來說,已達到代碼建庫建表及切換,同一帳套同一用戶名不管任何情況下都不會出現重復登錄.允許多帳套多個用戶自由切換.  
  主頁http://xufb.top263.netTop

22 楼griefforyou(为你伤心)回复于 2002-02-02 18:01:01 得分 0

To: gujianxin(木头象) (2002-2-2   16:39:05)   好象不用写到数据库中吧!  
   
  登陆时检测是否有用此名登陆的用户,如有,检测是否保持连接,否则,记录登陆IP,端口,允许登陆,总之,可以定义一个已登陆用户的结构  
   
  type   AcceptUser  
      ip   as   string  
      port   as   integer     'or   string  
      AcceptTime   as   Date  
      UserName   as   string  
  end   type  
   
  回复:如何检测是否有用此名登陆的用户?请告之  
   
  ---------------------------------------------  
  TO;Frank_Xu()  
   
  回复:全局表是什么东西?你说的我都不懂,有点高深哟。。。  
  我看看你的程序吧。Top

23 楼Frank_Xu()回复于 2002-02-02 18:05:15 得分 0

(上面所說,應為臨時表)  
  SQL   SERVER的臨時表由SQL自動維護,與用戶無關.  
  如果不明白,看看SQL   SERVER的相關書籍或說明.  
  臨時表以#開始,全局表以##開始.Top

24 楼wjying(葡萄)回复于 2002-02-02 18:21:21 得分 0

其实用wts(天胜)的办法不用做服务器端的应用程序  
  你在登陆的时候判断一下。  
  如果登陆的状态是"L",  
  则看一下最后刷新时间和当前时间的差是否大于某一个值  
  如果是则认为该用户上次登陆的时候非法退出  
  允许他登陆Top

25 楼griefforyou(为你伤心)回复于 2002-02-02 18:33:21 得分 0

To:回复人: Frank_Xu()  
  (上面所說,應為臨時表)  
  SQL   SERVER的臨時表由SQL自動維護,與用戶無關.  
  如果不明白,看看SQL   SERVER的相關書籍或說明.  
  臨時表以#開始,全局表以##開始.      
   
  回复:你的软件我已经安装,不过是乱码,好难看。我建好了数据库,但是运行时要求输入  
   
  服务器名:  
  用户名:  
  密码:  
   
  我的SQL   Server没有密码,程序老是提示密码不能为空,进不去怎么办?  
  Top

26 楼griefforyou(为你伤心)回复于 2002-02-02 18:53:21 得分 0

退出程序之后,如果再启动,为什么老是说已经启动?  
   
  查看任务中程序并没有结束,为什么?  
   
  有什么办法让我能看你的繁体字?Top

27 楼wts(天胜)回复于 2002-02-02 22:03:50 得分 5

可是写一个服务器端程序并不是说要独立的写一个程序啊,而是说sql   server   本身的功能啊!Top

28 楼wts(天胜)回复于 2002-02-02 22:04:47 得分 0

你要做的不过是要sql   server   定期执行一个功能而已啊!Top

29 楼cqhydz(混点分加个角)回复于 2002-02-02 22:49:38 得分 0

看看Top

30 楼CALM(不迷不悟)回复于 2002-02-03 02:03:28 得分 0

使用全局表最简单了Top

31 楼Frank_Xu()回复于 2002-02-03 08:39:01 得分 0

To:griefforyou(为你伤心)   
  程序在一台機上只能運行一個實例.  
  你不用在SQL   Server端建立任何庫或表,這些都是代碼建立的.  
   
  你只需提供局域網內的SQL   SERVER名及用戶和密碼即可.  
  如果你的SQL   用戶登錄為空,請先更改密碼(不能為空)再運行.  
   
  一般來說,SQL   SERVER是可以允許密碼為空,但最好加上用戶的密碼,確保SQL   SERVER的安全.  
  如果SQL連接正確,就會將SQL   SERVER名及UID及PWD加密保存在注冊表中.Top

32 楼Frank_Xu()回复于 2002-02-03 08:46:07 得分 0

如果使用SQL   SERVER做數據庫,並且要限制同一用戶不能重復登錄系統,采用SQL   SERVER   存儲過程(SQL   代碼見上)是最經典且最不會出現人為錯誤的方法.  
  臨時表由SQL   SERVER自身維護,在任何情況,一個連接所建立的臨時來在與SQL   SERVER斷開連接時,SQL   SERVER都會將該連接所建立的臨時表刪除.Top

33 楼Frank_Xu()回复于 2002-02-03 09:02:24 得分 0

SQL   SERVER分永久表和臨時表.  
  臨時表分局部臨時表(以#開頭)和全局臨時表(以##開頭).在用戶退出或系統修復時被自動刪除.  
  局部臨時表只能由創建它的用戶使用,在用戶斷開連接時被自動刪除.  
  全局臨時表對系統當前所有連接用戶都是可用的,在使用它的最後一個會話結束後被自動刪除.Top

34 楼zhengyingen(小笨)回复于 2002-02-03 09:11:23 得分 10

使用临时表会自动随连接的断开而删除特性  
  当每个用户登陆时,以他的登陆号创建一个临时表  
  在进入系统前检查这个临时表是否存在来决定是否允许用户登陆  
  dim   con   as   new   adodb.connection  
  dim   rst   as   new   adodb.recordset  
  dim   logid   as   string    
  logid   ='001'  
  con.open   "yourserver"  
  rst.activeconnection=con  
  rst.open   "select   *   from   tempdb.dbo.sysobjects   where   name   ='##"   &   logid   &   "'"  
  if   rst.eof   then   '用户没有登陆  
          '在服务器上注册用户  
          con.execute   "select   "   &   logid   &   "   as   logid   into   tempdb.dbo.#"   &   logid  
          '登陆成功  
  else  
          msgbox   "用户已经登陆"  
  end   if

原文地址:https://www.cnblogs.com/zgqys1980/p/1281800.html