Asp.net
為什麼我的 tempdb 在伺服器重新啟動時會重置權限?
過去兩次我們重新啟動了我們的 sql server,我們的網站已經關閉。原因似乎是因為 tempdb 正在重新創建,並且 ASPState 使用者正在失去對 tempdb 的讀/寫權限(它是一個 ASP 站點,會話數據儲存在 sql server 中)
直到大約兩週前,這還不是問題。有誰知道如何防止 sql server 在重新啟動後重置 tempdb 權限?或者為什麼這只是最近才開始發生?我們使用的是 MS SQL Server 2005。
我知道這是一個老問題,但發現了一些關於重新啟動時 tempdb 行為的新資訊。tempdb 本質上是從“模型”數據庫重新創建的,這就是對它的所有更改都失去的原因。如果您進行更改以保留更改,即使在重新啟動後也對“模型”數據庫進行與“臨時數據庫”相同的更改。請看以下內容:tempdb 在啟動時是否從模型中重新創建?
這是一個創建啟動儲存過程的腳本,該過程循環登錄並在tempdb中創建使用者作為 db_owner。此腳本沒有硬編碼登錄。
因此,即使在 SQL 機器重新啟動後,所有 SQL 登錄都將擁有訪問tempdb的權限。
USE [master] GO IF EXISTS ( SELECT * FROM sysobjects WHERE id = object_id(N'AddUsersToTempDb') and OBJECTPROPERTY(id, N'IsProcedure') = 1 ) BEGIN DROP PROCEDURE AddUsersToTempDb END GO CREATE PROCEDURE AddUsersToTempDb AS DECLARE @loginname as NVARCHAR(100); DECLARE Login_Cursor CURSOR FOR SELECT loginname FROM master..syslogins OPEN Login_Cursor; FETCH NEXT FROM Login_Cursor INTO @loginname; WHILE @@FETCH_STATUS = 0 BEGIN IF (@loginname <> 'sa' AND (NOT @loginname LIKE '##%') AND (NOT @loginname LIKE '%\%')) BEGIN PRINT @loginname IF EXISTS(SELECT * FROM [tempdb].sys.database_principals WHERE type_desc = 'SQL_USER' AND name = @loginname) PRINT ' - user already exists' ELSE BEGIN PRINT ' - creating user' DECLARE @Sql VARCHAR(MAX) SET @Sql = 'USE Tempdb' + char(13) + 'CREATE USER ' + @loginname + ' FOR LOGIN ' + @loginname + char(13) + 'EXEC sp_addrolemember db_owner, ' + @loginname EXEC (@Sql) END END FETCH NEXT FROM Login_Cursor INTO @loginname; END; CLOSE Login_Cursor; DEALLOCATE Login_Cursor; GO EXEC sp_procoption 'AddUsersToTempDb', 'startup', 'true' GO