熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

利用SQL的全局臨時表防止用戶重復登錄

2013-11-15 14:42:44  來源: SQL Server 

  在我們開發商務軟件的時候常常會遇到這樣的一個問題怎樣防止用戶重復登錄我們的系統?特別是對於銀行或是財務部門更是要限制用戶以其工號身份多次登入
  
  可能會有人說在用戶信息表中加一字段判斷用戶工號登錄的狀態登錄後寫退出時寫且登錄時判斷其標志位是否為如是則不讓該用戶工號登錄但是這樣那勢必會帶來新的問題如發生象斷電之類不可預知的現象系統是非正常退出無法將標志位置為那麼下次以該用戶工號登錄則不可登入這該怎麼辦呢?
  
  或許我們可以換一下思路有什麼東西是在connection斷開後可以被系統自動回收的呢?對了SQL Server的臨時表具備這個特性!但是我們這裡的這種情況不能用局部臨時表因為局部臨時表對於每一個connection來說都是一個獨立的對象因此只能用全局臨時表來達到我們的目的
  
  好了情況已經明朗話了我們可以寫一個象下面這樣簡單的存儲過程:
  create procedure gp_findtemptable // : zhuzhichao in nanjing
  
  /* 尋找以操作員工號命名的全局臨時表
  
  * 如無則將out參數置為並創建該表如有則將out參數置為
  
  * 在connection斷開連接後全局臨時表會被SQL Server自動回收
  
  * 如發生斷電之類的意外全局臨時表雖然還存在於tempdb中但是已經失去活性
  
  * 用object_id函數去判斷時會認為其不存在
  */
  @v_userid varchar() 操作員工號
  
  @i_out int out 輸出參數 :沒有登錄 :已經登錄
  
  as
  
  declare @v_sql varchar()
  
  if object_id(tempdbdbo##+@v_userid) is null
  
  begin
  
  set @v_sql = create table ##+@v_userid+(userid varchar())
  
  exec (@v_sql)
  
  set @i_out =
  
  end
  
  else
  
  set @i_out =
  
  在這個過程中我們看到如果以用戶工號命名的全局臨時表不存在時過程會去創建一張並把out參數置為如果已經存在則將out參數置為
  
  這樣我們在我們的應用程序中調用該過程時如果取得的out參數為我們可以毫不客氣地跳出一個message告訴用戶說對不起此工號正被使用!

From:http://tw.wingwit.com/Article/program/SQLServer/201311/22214.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.