Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 服务器重新启动时,为什么我的tempdb会重置权限?_Asp.net_Sql Server 2005_Permissions_Session State_Tempdb - Fatal编程技术网

Asp.net 服务器重新启动时,为什么我的tempdb会重置权限?

Asp.net 服务器重新启动时,为什么我的tempdb会重置权限?,asp.net,sql-server-2005,permissions,session-state,tempdb,Asp.net,Sql Server 2005,Permissions,Session State,Tempdb,在过去两次我们重新启动sql server时,我们的网站已经关闭。原因似乎是tempdb正在重新创建,而ASPState用户正在失去对tempdb的读/写权限(它是一个ASP站点,会话数据存储在sql server中) 直到大约两周前,这还不是一个问题。有人知道如何防止sql server在重新启动后重置tempdb权限吗?或者为什么这只是最近才开始发生?我们使用的是MS SQL Server 2005。每次启动服务时,SQL Server中的tempdb数据库都会被完全删除(从我所读过、听到过

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


直到大约两周前,这还不是一个问题。有人知道如何防止sql server在重新启动后重置tempdb权限吗?或者为什么这只是最近才开始发生?我们使用的是MS SQL Server 2005。

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


是否将任何此类设置写入该数据库?您确定您的系统最近没有为此进行更改或更新吗?可能相关的是,SQL实例多长时间停止并重新启动一次?(如果不是明智的话,SQL运行数月(如果不是不重新启动的话)并不少见…

首先,您不应该直接向tempdb分配权限。原因很明显,每次重新启动时都会重新创建它

这实际上提出了一个问题:无论如何,为什么您需要对此数据库拥有直接权限

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

更新
根据马丁的评论,我只能说哇。我从来没有想过这会是一个选择

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

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


简而言之,当服务器重新启动时,SQL server代理将重新启动(前提是服务设置为这种方式)。当它重新启动时,它将启动此作业,然后修复您的权限。我希望站点保持关闭的时间只比SQL server完全重新启动所需的时间多几秒钟。

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

在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 

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

下面是一个创建启动存储过程的脚本,它在登录上循环,并在tempdb中创建用户作为db\u所有者。此脚本没有硬编码登录

因此,即使在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
使用[master]
去
如果存在(选择*
来自sysobjects
其中id=object\u id(N'AddUsersToTempDb')
和OBJECTPROPERTY(id,N'IsProcedure')=1)
开始
删除过程AddUsersToTempDb
结束
去
创建过程AddUsersToTempDb
作为
声明@loginname为NVARCHAR(100);
声明的登录\u游标
选择登录名
来自master..syslogins
打开登录光标;
从Login_游标获取下一步到@loginname;
而@@FETCH\u STATUS=0
开始
IF(@loginname'sa'和(不象“\\%”那样的@loginname)和(不象“%\%”那样的@loginname)
开始
打印@loginname
如果存在(从[tempdb].sys.database\u主体中选择*,其中类型\u desc='SQL\u USER'和name=@loginname)
打印“-用户已存在”
其他的
开始
打印“-正在创建用户”
声明@Sql VARCHAR(最大值)
SET@Sql=
“使用Tempdb”+char(13)+
为登录名“++@loginname+char(13)”创建用户“++@loginname+”+
“EXEC sp_addrolember db_owner”,+@loginname
EXEC(@Sql)
结束
结束
从Login_游标获取下一步到@loginname;
结束;
关闭登录光标;
取消分配登录光标;
去
EXEC sp_procoption“AddUsersToTempDb”、“startup”、“true”
去

这不是OP的代码。这是AspState安装的一个选项,如下所述。在tempdb中存储临时数据在减少日志记录方面具有优势。+1刚刚注意到我链接的线程提到必须重新创建权限,所以我认为这可能是“出于设计”-不确定为什么这只会成为OP的问题。@Martin:我猜他们已经安排了一个作业,但是sql代理要么被关闭,要么被不知道它是什么的DBA删除,要么被一位想离开的前雇员删除gift@Martin这是正确的,该数据库用于ASP的会话信息,是由其他人在一段时间前设置的(框架)
aspnet\u regsql.exe的版本
您是否使用它来安装,以便我可以在这一端尝试相同的版本?很好。它确实非常适合我的情况,在我的情况下,SQL server完全专用于一个具有异常权限需求的应用程序。