日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

我是SQL小菜鸟---SQL全局临时表防止用户重复登录

發布時間:2025/3/14 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我是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數據庫的連接斷開以后,臨時表是可以被系統自動收回的,這樣子用戶下次登錄的時候會再次建立一個臨時表并且可以登錄成功!

依據第二種思路我們建立一個存儲過程:

[sql]?view plaincopyprint?
  • 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告訴用戶說”對不起,此工號正被使用!”??
  • ?

    在系統中調用存儲過程來實現用戶登錄的代碼:將與數據庫的連接和執行存儲過程寫在一個函數中,然后在客戶端調用即可!

    ?

    [plain]?view plaincopyprint?
  • 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全局临时表防止用户重复登录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。