2011-03-15 21 views
10

過去兩次我們重新啓動了我們的sql服務器,我們的網站已經關閉。原因似乎是因爲tempdb正在重新創建,並且ASPState用戶正在失去對tempdb的讀/寫權限(這是一個ASP站點,會話數據存儲在sql server中)爲什麼我的tempdb在服務器重啓時重置權限?

這不是問題直到兩週前。有誰知道我可以如何防止重新啓動後重置tempdb權限的sql服務器?或者爲什麼這只是最近纔開始發生?我們使用MS SQL Server 2005的

+0

你使用了什麼(框架)版本的'aspnet_regsql.exe'來安裝它,所以我可以試試這個結果? – 2011-03-15 22:22:03

回答

6

首先,你不應該直接將權限分配給tempdb的。顯而易見的原因是,每次重新啓動都會重新創建它。

裏面居然提出了一個問題:爲什麼你需要有直接的權限,這個數據庫呢?

你不需要不僅僅是能夠連接到SQL Server,以創建臨時表的任何權限。但是,如果您要在tempdb中創建實際表,那​​麼我強烈建議您將此更改爲使用專用數據庫來實現此目的。

UPDATE
根據馬丁的評論,我只能說是令人叫絕。我甚至從來沒有考慮過這會是一個選擇。

好了,現在我已經從震驚中恢復過來。

創建在按計劃執行SQL Server的一個新的工作。時間表應設置爲「每當SQL Server代理啓動時自動啓動」。該作業應該重新創建必要的tempdb權限。

簡而言之,當服務器重新啓動SQL Server代理將重新啓動(提供的服務被設置這種方式)。當它重新啓動時,它將啓動此作業,然後修復您的權限。我希望這個站點只停留在比SQL服務器完全重啓所花費的時間更多的時間。

+1

+1畢竟,有一個名爲* temp * db的原因。 – 2011-03-15 20:58:24

+1

這不是OP的代碼。這是AspState安裝的一個選項,如http://forums.asp.net/p/1250011/2307815.aspx所述。將暫存數據存儲在tempdb中可減少日誌記錄方面的優勢。 – 2011-03-15 22:14:45

+0

+1剛注意到我鏈接到的線程提到不得不重新創建權限,所以我認爲這可能是「按設計」 - 不知道爲什麼它只會成爲OP的問題。 – 2011-03-15 22:25:10

0

SQL Server中的tempdb數據庫是(從一切我讀過,聽過或有經驗的)完全刪除並重新創建每次服務啓動時間。因此,存儲在或寫入該數據庫的任何內容(包括角色,用戶或其他訪問權限設置)都將被清除。除非一些繁瑣的代碼在實例啓動時設置/重置它們,否則我認爲您無法解決此問題。 (我不認爲在模型數據庫中設置的任何東西在創建時被複制到tempdb,但我從未想過這個......)

是否有任何這樣的設置被寫入到那些數據庫?你確定你的系統最近沒有被更改或更新過嗎?可能有關,SQL實例停止並重新啓動的頻率如何? (這並不罕見 - 如果不是明智的做法 - 對SQL到幾個月如果沒有Y一代不重新啓動運行...)

1

Model數據庫用作TempDB的模板。將用戶和權限添加到模型中,並將在TempDB上使用相同的用戶和權限。我不認爲這是每種情況下的最佳解決方案,但它適用於需要特定TempDB訪問的應用程序。

0

SQL Server上創建一個啓動腳本如下:

use master 
go 
drop proc AddAppTempDBOwner 
go 
create proc AddAppTempDBOwner as 
declare @sql varchar(200) 
select @sql = 'use tempdb' + char(13) 
+ 'exec sp_addrolemember ''db_owner'', ''app''' 
exec (@sql) 
go 
exec sp_procoption 'AddAppTempDBOwner', 'startup', 'true' 
go 
2

我知道這是一個老問題,但發現關於在重新啓動tempdb的行爲的一些新的信息。 tempdb基本上是從'model'db重新創建的,這就是爲什麼所有更改都會丟失的原因。如果您做出更改,即使在重新啓動之後仍然保留更改,請對「模型」db進行與「tempdb」相同的更改。 看看下面的內容:Does tempdb Get Recreated From model at Startup?

+0

好的一個。它完全適合我的情況,即SQL服務器完全適用於具有不尋常權限需求的單個應用程序。 – chris 2017-11-20 08:55:46

相關問題