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上的其他地方看到这个问题的答案.
解决方法
首先使用以下命令卸载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’.
希望这能够揭示这个问题!