利用SQL Server的全局臨時表防止用戶重複登錄(或者全局臨時表的使用和生命週期)

  在我們開發商務軟件的時候,常常會遇到這樣的一個問題:怎樣防止用戶重複登錄我們的系統?特別是對於銀行或是財務部門,更是要限制用戶以其工號身份多次登入。

  可能會有人說在用戶信息表中加一字段判斷用戶工號登錄的狀態,登錄後寫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告訴用戶說”對不起,此工號正被使用!”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章