2010-12-01 17 views
6

Según this how-to, configuré IIS satisfactoriamente en mi cuadro de configuración XP-SP3 para SQL Server 2008 Express para guardar información de estado de sesión ASP.NET. Solo estoy usando SQL Server porque de lo contrario en cada recompilación, estaba perdiendo el estado de la sesión que era desagradable (tener que volver a iniciar sesión). Pero, estoy frente a un problema molesto en que cada vez que reinicio de SQL no es este error, ya veces uno o dos amigos muy similares:Solución automática para el error tempdb relacionado con 'ASPStateTempSessions'

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

Para corregir el error, acabo de abrir Management Studio y editar las Asignación de usuario para el inicio de sesión/dbo que estoy usando en ASPState db, y vuelva a agregar tempdb a ese usuario con todos los permisos, excepto denegar. Aparentemente, una vez que los permisos correctos están allí, ASP.NET puede crear automáticamente las tablas que usa. Simplemente no puede ejecutar ese sproc CreateTempTables hasta que la seguridad adecuada esté allí.

la pregunta ... ¿Hay una manera de no tener que volver a hacer esto en cada reinicio del servidor SQL Server?

No me importa en este momento mantener los datos temporales en reinicios, pero me gustaría no tener que pasar por este paso manual solo para que mi aplicación web funcione en localhost, que usa variables de estado de sesión en todo. Supongo que uno podría recurrir a algún tipo de procedimiento almacenado dentro de SQL Server para realizar la tarea de esta máquina cuando se inicia el servicio, para no tener que hacerlo manualmente. Aceptaría una respuesta como una solución rápida. Pero, también estoy asumiendo que hay una mejor configuración recomendada o algo así. No veo una respuesta a esto en la guía práctica o en otro lugar aquí en StackOverflow.

Respuesta

11

Ambas respuestas parecen válidas; pero con la mayoría de las cosas Microsoft, su todo en la configuración ...

desinstalar primero la base de datos ASPState utilizando el comando:

aspnet_regsql -ssremove -E -S.

Nota:

-E es para indicar que desea utilizar la conexión de seguridad integrada.

-S informa qué servidor SQL y qué instancia de SQL usar, y el "."(Punto) especifica por defecto instancia local

A continuación, volver a instalar con el comando:.

aspnet_regsql -ssadd -sstype p -E -S

Nota:

El sstype tiene tres opciones, t | p | c ... la primera "t", le dice al instalador que aloje todos los procedimientos almacenados en la base de datos ASPState, y todos los datos en el tempdb. La segunda opción "p" le dice al instalador a persistir datos a la base de datos ASPState. La última opción "c" le permite especificar una base de datos 'personalizada' diferente para conservar los datos de estado de la sesión.

Si reinstala usando el "-sstype p", solo necesita proporcionar datareader/datawriter a la base de datos ASPState para el usuario que realiza la conexión (en la mayoría de los casos, la identidad del grupo de aplicaciones en IIS).

El beneficio adicional de conservar los datos es que el estado de la sesión se conserva incluso después de reiniciar el servicio. El único inconveniente es que debe asegurarse de que el trabajo de limpieza del agente esté podando las sesiones antiguas regularmente (esto lo hace de forma predeterminada, cada minuto).

Importante:

Si está ejecutando un clúster, debe persistir los datos de sesión. Tu única opción es usar sstype 'p' o 'c'.

Espero que esto arroje luz sobre el tema!

+0

No lo he intentado, pero parece mucho menos hackoso que mi respuesta, gracias. Aceptado; No me gustó aceptar mi propia solución, de todos modos. – zanlok

+0

Ubicación de aspnet_regsql: http://msdn.microsoft.com/en-us/library/ms229862.ASPX#findingthecorrectversion (hash broken, desplácese hacia abajo hasta la parte inferior de la página) –

+1

Además ... la respuesta tiene algunos de los guiones reemplazados con guiones y no puedes copiarlos ni pegarlos. –

1

Para el registro, hice find a way to do this.

El problema es que el tempdb se recrea desde el modelo db cada vez que se reinicia el servicio. La esencia de la solución es crear un procedimiento almacenado que haga el trabajo y luego ejecutar ese procedimiento al inicio.

El código fuente (crédito para el siguiente enlace) es como sigue:

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 
1

Bien hecho para encontrar la manera más extraña posible hacer esto.

La respuesta correcta es la siguiente:

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

No he probado esto, pero sin duda marcaría su respuesta como aceptada después de la prueba para verificar. Sin embargo, me gusta la * apariencia * de lo que dices. – zanlok

+1

No se pudo encontrar el procedimiento almacenado 'sp_dboption'. –

+0

sp_dboption se deprecia. Prueba ALTER DATABASE ASPState SET DB_CHAINING ON – DomBat

Cuestiones relacionadas