Asp.net

為什麼我的 tempdb 在伺服器重新啟動時會重置權限?

  • April 27, 2018

過去兩次我們重新啟動了我們的 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

引用自:https://stackoverflow.com/questions/5315897