將 Session 放入 SQLServer 保存

        SQLServer 模式就是,把Session 存放在 SQL Server 數據庫裏(注意不是 Oracle ,動動腳趾都能猜到原因啦),下面開始說明一下設置的具體步驟:

1、   啓動相關的數據庫服務(如圖)
運行SQL Server 服務管理器 → 啓動 SQL Server (最好設爲開機自動運行) → 啓動 SQL Server Agent 服務(最好設爲開機自動運行)
注意事項:
       a)、注意啓動順序,也可通過下列方式設置: 右鍵點擊“我的電腦”→ 管理 → 服務與應用程序 → 服務 → 找到“MSSQLSERVER”與“SQLSERVERAGENT” → 啓動並設置啓動類型爲“自動”
b)SQL Server Agent在此處的作用是清除數據庫中已過期的 Session

2、   建立存放 SessionDataBase
運行“SQL 查詢分析器”→ 使用“sa”或是擁有“master”的 db_owner 權限的用戶登錄數據庫 → 打開查詢文件 C:/WINNT/Microsoft.NET/Framework/v1.1.4322/InstallSqlState.sql (存放在 Windows 系統目錄的 .Net 安裝目錄下可找到) → 直接運行該 sql 腳本 → 刷新數據庫即可看到名爲 ASPStateDataBase

3、   建立連接數據庫 ASPState 的用戶,併爲此用戶授權(此步驟可跳過)
進行此步的原因是:一是不想在 Web.config 中出現 sa 的密碼;二是 tempdb 在數據庫啓動後僅保留 sa 一個帳號的使用權限,其餘帳號的權限統統被清除,但保存 Session又需要用到此 DataBase

A)、運行 SQL Server 的企業管理器 → 展開數據庫的安全性 → 右擊“登錄” → 新建“登錄” → 輸入“名稱” → 選擇 “SQL Server 身份驗證” → 輸入“密碼” → 指定“數據庫” → 點擊“數據庫訪問” → 勾選 “ASPState” → 選中“db_owner”角色 → 點擊“確定” → 再一次輸入“密碼” → 點擊“確定” 後即可建立 ASPState 的用戶(此處建立名爲“SessionStateUser”,密碼爲“123456”的測試用戶)

B)、運行 SQL Server 的企業管理器 → 展開“管理” → 展開“SQL Server 代理” → 右擊“作業” → 點擊“新建作業” → 輸入 “名稱”(此例爲 GrantSessionUser ) → 點擊標籤 “步驟” → 新建 → 輸入 “步驟名”(此例爲 Grant01) → 選擇數據庫“tempdb” → 編寫 SQL 腳本“exec sp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner' ”→ 確定 → 點擊標籤 “調度” → 新建 → 輸入 “名稱”(此例爲 Start01 )→ 選擇類型“SQL Server 代理啓動時自動啓動” → 確定 → 最後點擊“確定”新增完畢


C)、也可運行以下腳本一次性搞定以上 AB 兩個步驟

       --新建數據庫帳號 SessionStateUser ,默認登錄 ASPState
EXEC sp_addlogin 'SessionStateUser', '123456', 'ASPState'

use ASPState         --切換 DataBase

       --SessionStateUser 授予 db_owner 的權限
exec sp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner'

use master             --切換 DataBase

BEGIN TRANSACTION  

     DECLARE @JobID BINARY(16)
     DECLARE @ReturnCode INT  
     SELECT @ReturnCode = 0    

     -- 若沒有,則添加作業的分類
     IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1
         EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'

     -- 新建作業
     EXECUTE @ReturnCode = msdb.dbo.sp_add_job   --調用存儲過程 sp_add_job
             @job_id = @JobID OUTPUT,           --將返回的 JobID,賦值給變量
             @job_name = N'GrantSessionUser',   --作業名稱
             @owner_login_name = NULL,           --默認爲當前用戶所有
             @description = null,
             @category_name = N'[Uncategorized (Local)]',         --作業分類歸屬
             @enabled = 1,                     --是否啓用
             @notify_level_email = 0,
             @notify_level_page = 0,
             @notify_level_netsend = 0,
             @notify_level_eventlog = 0,
             @delete_level= 0

     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback --出錯則回滾

     -- 新建步驟
     EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep --調用存儲過程 sp_add_jobstep
             @job_id = @JobID,                   --傳入剛剛新建的 JobID
             @step_id = 1,
             @step_name = N'Grant01',         --步驟名稱
             @command = N'exec sp_adduser ''SessionStateUser'', ''SessionUser'' ,''db_owner''',
             --需要執行的 SQL 腳本(注意用兩個連續的單引號表示 SQL 中的單引號)

             @database_name = N'tempdb', --執行上述 SQL 所用的 DataBase
             @server = N'',
             @database_user_name = N'',
             @subsystem = N'TSQL',     --執行類型爲“Transact-SQL 腳本”
             @cmdexec_success_code = 0,
             @flags = 0,
             @retry_attempts = 0,
             @retry_interval = 1,
             @output_file_name = N'',
             @on_success_step_id = 0,
             @on_success_action = 1,
             @on_fail_step_id = 0,
             @on_fail_action = 2

     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

     -- 新建調度
     EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule
             @job_id = @JobID,
             @name = N'Start01',   --調度名稱
             @enabled = 1,
             @freq_type = 64               --64”表示 當 SQLServerAgent 服務啓動時運行

     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

     -- 將新建的作業添加到本地數據庫
     EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'
     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

     COMMIT TRANSACTION        
     GOTO   EndSave            
QuitWithRollback:
     IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:


4、   設置 Web.config 內容
打開 Web.config → 找到<sessionState> 節點內容 → 修改爲以下內容即可:
<sessionState mode="SQLServer"   sqlConnectionString ="data source=192.168.0.2; user id= SessionStateUser; password=123456" timeout="20" />
注意事項:
       a)sqlConnectionString 中不能出現 initial catalog 選項
b)SQL Server Agent在此處的作用是清除數據庫中已過期的 Session
c)、你若跳過了第三步,則user id 需要用sa 進行登錄
d)、若sqlConnectionString 爲 “data source=127.0.0.1;Trusted_Connection=yes”,則使用本地計算機ASPNETWindows 2000 系統帳戶)或 Network ServiceWindows 2003 系統帳戶)的身份登錄數據庫。要是數據庫不允許上述用戶登錄,則報錯;同樣,即使上述帳戶能成功登錄,也要分配其 tempdb 的權限,理由是 Session 是保存在 tempdb 中的,若沒有該 DataBase 的存取權限是行不滴。
發佈了13 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章