自动修复与'ASPStateTempSessions'相关的tempdb错误

时间:2010-12-01 02:13:25

标签: asp.net iis sql-server-express

根据this how-to,我已在SQL Server 2008 Express的XP-SP3开发框上成功配置了IIS,以保存ASP.NET会话状态信息。我只是在使用SQL Server,因为否则在每次重新编译时,我都会丢失令人讨厌的会话状态(必须重新登录)。但是,我面临一个恼人的问题,因为每次重新启动SQL时都会出现此错误,有时还有一两个非常相似的朋友:

The SELECT permission was denied on the object 'ASPStateTempSessions',
database 'tempdb', schema 'dbo'.

要修复错误,我只需打开Management Studio并编辑我在ASPState数据库上使用的登录/ dbo的用户​​映射,然后向该用户重新添加tempdb,但拒绝拒绝权限。显然,一旦有了正确的权限,ASP.NET就能够自动创建它使用的表。它只是无法运行CreateTempTables sproc,直到有正确的安全性。

问题...... 有没有办法在每次重启SQL Server时都不必重新执行此操作?

我现在并不关心在重新启动时保持临时数据,但我想不必经过这个手动步骤只是为了让我的web应用程序在localhost上运行,localhost使用会话状态变量。我想可以在SQL Server中使用某种存储过程来在服务启动时完成该机器的任务,而不必手动完成。我接受这样的答案作为快速解决方案。但是,我也假设有更好的推荐配置或其他东西。没有在方法指南或StackOverflow上的其他地方看到答案。

3 个答案:

答案 0 :(得分:13)

这两个答案似乎都有效;但对于微软的大多数事情,它都在设置......

首先使用以下命令卸载ASPState数据库:

  

aspnet_regsql -ssremove -E -S。

注意:

-E表示您要使用集成安全连接。

-S通知要使用的SQL服务器和SQL实例,以及“。” (点)指定默认本地实例

然后使用以下命令重新安装:

  

aspnet_regsql -ssadd -sstype p -E -S。

注意:

sstype有三个选项,t | p | c ...第一个“t”,告诉安装程序托管ASPState数据库中的所有存储过程,以及tempdb中的所有数据。第二个选项“p”告诉安装程序将数据持久保存到ASPState数据库。最后一个选项“c”允许您指定一个不同的“自定义”数据库来保存会话状态数据。

如果使用“-sstype p”重新安装,则只需要为正在建立连接的用户(在大多数情况下,IIS中的应用程序池的标识)提供datareader / datawriter到ASPState数据库。

持久化数据的额外好处是即使在重新启动服务后会话状态也会保留。唯一的缺点是您需要确保代理清理作业定期修剪旧会话(默认情况下,每分钟执行一次)。

重要提示:

如果您正在运行群集,则必须保留会话数据。你唯一的选择是使用sstype'p'或'c'。

希望这能够揭示这个问题!

答案 1 :(得分:1)

为了记录,我做了find a way to do this

问题是每次服务重新启动时都会从模型db重新创建tempdb。解决方案的要点是创建一个执行该作业的存储过程,然后在启动时运行该过程。

源代码(上面链接的信用)如下:

use master
go

-- remove an old version
drop proc AddAppTempDBOwner
go

-- the sp
create proc AddAppTempDBOwner as
declare @sql varchar(200)
select @sql = 'use tempdb' + char(13) + 'exec sp_addrolemember ''db_owner'', ''app'''
exec (@sql)
go

-- add it to the startup
exec sp_procoption 'AddAppTempDBOwner', 'startup', 'true'
go

答案 2 :(得分:1)

为找到最奇怪的方法做得很好。

正确答案如下:

use master
go  
EXEC sp_configure 'Cross DB Ownership Chaining', '1'    
go    
RECONFIGURE    
go    
EXEC sp_dboption 'ASPState', 'db chaining', 'true'    
go