问题 为什么我的tempdb在服务器重启时重置权限?


过去两次我们重新启动了我们的sql server,我们的网站已经关闭了。原因似乎是因为tempdb正在重新创建,并且ASPState用户失去了对tempdb的读/写权限(它是一个ASP站点,会话数据存储在sql server中)

直到大约两周前,这不是问题。有谁知道如何阻止sql server重启后重置tempdb权限?或者为什么这最近才开始发生?我们正在使用MS SQL Server 2005。


13114
2018-03-15 17:54


起源

什么(框架)版本 aspnet_regsql.exe 你用它来安装它,所以我可以尝试相同的一个吗? - Martin Smith


答案:


首先,您不应直接为tempdb分配权限。由于显而易见的原因,它在每次重启时都会重新创建。

这实际上提出了一个问题:为什么你还需要拥有对这个数据库的直接权限?

除了能够连接到sql server以创建临时表之外,您不需要任何权限。但是,如果要在tempdb中创建实际表,那​​么我强烈建议您将其更改为使用专用数据库来实现此目的。

UPDATE
根据马丁的评论我可以说是哇。我甚至都不会认为这是一个选择。

好吧,现在我已经从震惊中恢复过来了。

在sql server中创建一个按计划执行的新作业。应将计划设置为“每当SQL Server代理启动时自动启动”。该作业应重新创建必要的tempdb权限。

简而言之,当服务器重新启动时,SQL Server代理将重新启动(前提是服务是这样设置的)。当它重新启动时,它将启动此作业,然后将修复您的权限。我希望该网站能够比SQL服务器完全重启更长时间停留几秒钟。


6
2018-03-15 20:37



+1它的名字有一个原因 温度db,毕竟。 - Ken White
这不是OP的代码。这是AspState安装的一个选项,如此处所述 forums.asp.net/p/1250011/2307815.aspx。在tempdb中存储瞬态数据在减少日志记录方面具有优势。 - Martin Smith
+1刚刚注意到我链接的线程提到必须重新创建权限,所以我认为这可能是“按设计” - 不知道为什么它只会成为OP的问题。 - Martin Smith
@Martin:我猜他们已经安排了一份工作,但是sql代理被关闭了,或者被一个不知道它是什么的DBA删除了,还是一个想要留下离别礼物的前雇员 - NotMe
@Martin这是正确的,数据库用于ASP的会话信息,不久之前由其他人设置 - Rachel


我知道这是一个老问题,但发现了一些关于重启时tempdb行为的新信息。 tempdb基本上是从'model'db重新创建的,这就是为什么对它的所有更改都会丢失的原因。如果进行更改以便在重新启动后保持更改,则对“模型”数据库进行与“tempdb”相同的更改。 看看以下内容: 在启动时是否从模型中重新创建了tempdb?


2
2018-06-10 05:36



好一个。它完全适合我的情况,其中SQL服务器完全专用于具有不寻常权限需求的单个应用程序。 - chris


Model数据库用作TempDB的模板。向模型添加用户和权限,将在TempDB上使用相同的用户和权限。我不是说这是每个案例的最佳解决方案,但在应用程序需要特定的TempDB访问权限的情况下,它对我有用。


1
2018-04-30 13:08





在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 

1
2018-03-31 08:32





每次启动服务时,SQL Server中的tempdb数据库(从我曾读过,听过或经历的所有内容)中完全删除并重新创建。因此,存储在该数据库中或写入该数据库的任何内容(包括角色,用户或其他访问权限设置)都将被清除。除非一些繁琐的代码在实例启动时设置/重置它们,我认为你不能解决这个问题。 (我不 认为 模型数据库中设置的任何东西都会在创建时复制到tempdb,但我从来没有想过......)

是否有任何此类设置被写入该数据库?您确定最近没有更改或更新过您的系统吗?可能相关,SQL实例停止和重新启动的频率是多少? (如果没有重启,如果没有你的话,SQL运行几个月并不常见 - 如果不是明智的话......)


0
2018-03-15 20:23





这是一个创建启动存储过程的脚本,它循环遍历 登录 并创造 用户 在 tempdb中 作为db_owner。此脚本没有harcoded登录。

因此,即使在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

0
2018-04-27 13:32