2011-03-15 31 views
10

Las últimas dos veces que hemos reiniciado nuestro servidor sql, nuestro sitio web ha disminuido. El motivo parece ser porque el tempdb se vuelve a crear y el usuario ASPState pierde el permiso para leer/escribir en el tempdb (es un sitio ASP y los datos de la sesión se almacenan en el servidor sql)¿Por qué mi tempdb restablece los permisos cuando se reinicia el servidor?

Esto no fue un problema hasta hace aproximadamente dos semanas. ¿Alguien sabe cómo puedo evitar que el servidor sql restablezca los permisos de tempdb después de un reinicio? ¿O por qué esto solo comenzó a suceder recientemente? Estamos utilizando MS SQL Server 2005.

+0

¿Qué versión (marco) de 'aspnet_regsql.exe' usó para instalarla, así que puedo probar la misma a este final? –

Respuesta

6

En primer lugar, no debe asignar permisos al tempdb directamente. Por las razones obvias que se vuelve a crear en cada reinicio.

Lo que en realidad plantea una pregunta: ¿por qué necesita tener permisos directos a esta base de datos de todos modos?

No necesita ningún permiso además de poder conectarse al servidor SQL para crear tablas temporales. Sin embargo, si está creando tablas reales en tempdb, le sugiero encarecidamente que cambie esto para usar una base de datos dedicada para este propósito.

ACTUALIZACIÓN
Basado en el comentario de Martin todo lo que puedo decir es ¡guau. Nunca hubiera considerado que esto hubiera sido una opción.

Bien, ahora que me he recuperado del shock.

Cree un nuevo trabajo en el servidor sql que se ejecuta según un cronograma. La programación debe establecerse en "Iniciar automáticamente cada vez que se inicie el Agente de SQL Server". El trabajo debe recrear los permisos tempdb necesarios.

En pocas palabras, cuando se reinicia el servidor, el Agente de SQL Server se reiniciará (siempre que el servicio esté configurado de esa manera). Cuando se reinicie, se iniciará este trabajo que luego corregirá sus permisos. Esperaría que el sitio permaneciera inactivo solo unos segundos más de lo necesario para que el servidor SQL se reinicie por completo.

+1

+1 Hay una razón por la que se llama * temp * db, después de todo. –

+1

Este no es el código del OP. Esta es una opción para la instalación de AspState como se describe aquí http://forums.asp.net/p/1250011/2307815.aspx. Almacenar datos transitorios en tempdb puede tener ventajas en términos de reducción de registros. –

+0

+1 Me acabo de dar cuenta de que el hilo que he vinculado menciona que tengo que volver a crear los permisos, así que supongo que esto podría ser "por diseño". Sin embargo, no estoy seguro de por qué solo se hubiera convertido en un problema para el OP. –

0

La base de datos tempdb en el servidor SQL es (de todo lo que he leído, escuchado o experimentado) completamente descartada y recreada cada vez que se inicia el servicio. Por lo tanto, todo lo almacenado o escrito en esa base de datos, incluidos los roles, los usuarios u otras configuraciones correctas de acceso, se borrará. Salvo algunos códigos quisquillosos para configurar/restablecer cada vez que se inicia la instancia, no creo que pueda evitar esto. (No creo nada establecido en la base de datos modelo se copia a tempdb cuando se crea, pero que nunca he pensado en eso ...)

¿Alguno tales ajustes que están escribiendo en bases de datos? ¿Estás seguro de que tu sistema no ha sido cambiado o actualizado recientemente para hacerlo? Posiblemente relevante, ¿con qué frecuencia se detiene y reinicia la instancia de SQL? (No es raro, si no es sabio, que SQL se ejecute durante meses si no es así sin un reinicio ...)

1

La base de datos del modelo se utiliza como plantilla para TempDB. Agregue usuarios y permisos al modelo y el mismo uso y permisos se utilizarán en TempDB. No digo que esta sea la solución óptima para cada caso, pero funcionó para mí en una situación en la que una aplicación necesitaba acceso TempDB específico.

0

Crear un script de inicio en el servidor SQL de la siguiente manera:

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 
2

Sé que esto es una vieja pregunta, pero encontré algo de información nueva sobre el comportamiento tempdb al reiniciar. El tempdb se recrea esencialmente desde el 'modelo' db y esa es la razón por la cual se pierden todos los cambios. Si realiza un cambio para persistir sus cambios, incluso después de reiniciar, realice los mismos cambios en el archivo 'modelo' como lo haría con el 'tempdb'. Eche un vistazo a lo siguiente: Does tempdb Get Recreated From model at Startup?

+0

Niza. Se ajustaba perfectamente a mi caso en el que el servidor SQL estaba completamente dedicado a una sola aplicación con necesidades de permisos inusuales. – chris

Cuestiones relacionadas