Problema con restore

Lo que me pasa es algo raro. Uso el visual studio 2005 con el sql express integrado.
Desde la base de datos "D:\Prueba\APP_DATA\DATOS.MDF" porque ese es el nombre que me pone en propiedades de la BD, hago
backup database [D:\Prueba\APP_DATA\DATOS.MDF] to disk='D:\Prueba\Backup\CopiaSeguridad.bak' WITH INIT
desde la BD master hago
restore database [D:\Prueba\App_Data\Datos.mdf] from disk='D:\Prueba\Backup\CopiaSeguridad.bak'
el conectionstring para conectarme a la BD D:\Prueba\APP_DATA\DATOS.MDF y hacer el backup es
Data Source=.\SQLEXPRESS;pooling=false;AttachDbFilename =|DataDirectory|\Datos.mdf;Integrated Security=True;User Instance=True
el conectionstring para conectarme a la BD master y hacer el restore es
Data Source=PC\SQLEXPRESS;Initial Catalog=master;Integrated Security=True
El problema que tengo es que si hago restore una vez funciona todo, pero como haga otro restore inmediatamente me da este error:
No se puede abrir la base de datos predeterminada del usuario. Error de inicio de sesión.
Lo más raro es que si vuelvo a hacer un restore pues vuelve a funcionar, y si hago otro vuelve a fallar, así en un bucle

5 Respuestas

Respuesta
1
¿El usuario (login) a través del cual ejecutas todo con Seguridad Integrada tiene como database predeterminada la base que estas restaurando?
En caso afirmativo cambiale dicha database predeterminada al login por master u otra.
"¿El usuario (login) a través del cual ejecutas todo con Seguridad Integrada tiene como database predeterminada la base que estas restaurando?"
¿Cómo puedo mirarlo y de ser así como lo cambio?
Gracias por la rapidez. Saludos
Fíjate en el nodo SEGURIDAD-INICIOS DE SESIÓN de tu servidor (management-logins en ingles), la columna Base de Datos Predeterminada del login en cuestión.
Al utilizar el sql express integrado en visual studio 2005 no tengo el nodo seguridad
Proba con:
sp_helplogins 'nombre_login'
Y fíjate el contenido del campo DefDBName
Debido a todos los problemas que me daba el sql server integrado en visual studio 2005 instale el sql express, el problema ahora es: ¿Cómo se pueden cortar todas las conexiones de una BD con sentencias sql para hacer un restore y no de fallo de que se esta usando la BD? La única solución que funcionara fue poniendo pooling=false en la cadena de conexión pero con esto las páginas me van más lentas.
"sp_who" o "sp_who2" listan todos los procesos que corren en el SQL.
Luego "KILL <Id_Proceso>" mata los mismos de a uno hasta lograr, si no entendí mal, lo que te propones: no tener a nadie conectado al motor SQL.
Suerte!
Respuesta
1
No termine de entender del todo la situación.
Te hago un par de preguntas para poder entenderlo mejor:
¿El error te da una vez si y otra vez no?
El error la segunda vez que deseas restaurar la base de datos, te lo da en el momento de conectar a la base de datos master, ¿o de conectarte al archivo attachado al proyecto?
La seguimos,
Leandro
El error me da una vez si y otra no, el error me da después de que me conecto a la BD master y hago restore en cuanto me conecto a D:\Prueba\App_Data\Datos.mdf falla
Ok,
Una alternativa sería antes de hacer el restore fíjate si le podes cambiar la base de datos default al current user, para evitar el mensaje de error
Si esto no funciona intentamos otra cosa,
La seguimos,
Leandro
Y como lo puedo hacer con una sentencia sql porque en la version de sql que trae integrado el visual studio 2005 no hay la columna seguridad para cambiar la BD predeterminada de los users.
Como te va,
buscando por Internet encontré esto que te puede llegar a ayudar, si no es así decime y seguimos buscando:
http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2160534&SiteID=17
Al final instale el sql server 2005 por todos los problemas que me estaba dando el que viene integrado en visual studio. Ahora consigo hacerlo todo bien siempre que use pooling=false en la cadena de conexión de la BD. Hay alguna otra manera para no tener el problema de las conexiones abiertas sin usar pooling=false ya que noto que las páginas se van algo más lentas. Saludos ;)
El problema lo podrías solucionar a partir del código, sin hacer mucho por parte de la base de datos.
Podrías implementar un singleton para conectarte a la base de datos y de esa forma tienes una única conexión abierta con la base de datos
Tengo oído hablar de ese patrón pero no se utilizarlo, me quedo como estoy entonces. ¿Alguna idea más o finalizamos la pregunta? saludos ;)
Las dos alternativas que tienes para implementar conexiones individuales son esas, o a través de la base de datos o a través del código.
Por una cuestión de gusto personal lo hice siempre a través de código.
Te paso, un ejemplo de una conexión a base de datos con Oracle con C# por si te sirve:
protected OracleConnector _conn;
private static DataBaseProvider _instance = new DataBaseProvider();
private static bool _isTest = false;
private DataBaseProvider()
{
OracleConnector connector;
_conn = null;
connector = new OracleConnector(envVariables.ConnectionString, "IFR01", true, false);
_conn = connector;
}
public object ExecuteFunction(string fncName, ArrayList paramsName, ArrayList values)
{
return _conn.ExecuteFunction(fncName, paramsName, ref values);
}
Cualquier cosa consúltame,
Leandro
Respuesta
1
No soy usuario de VB2005 pero suena a que el archivos sigue abierto o la conexión sigue abierta y la quieres "re-abrir" marcando el error (puesto que esta abierta) trata metiendo en el bucle las sentencias para descargar las variables o cerrar la conexión y vuelve a tratar
Debido a todos los problemas que me daba el sql server integrado en visual studio 2005 instale el sql express, el problema ahora es: como se pueden cortar todas las conexiones de una BD con sentencias sql para hacer un restore y no de fallo de que se esta usando la BD
No entendí mucho lo segundo, pero puedes crear un server espejo, así no es necesario cortar las conexiones y ambos servidores tendrían lo mismo hasta que quites el primero.
Hay herramientas de "publicacion" y "replicacion" en las herramientas de SQL Server
Respuesta
1
No he trabajado mucho con la administración de SQL 2005 por el momento. Sin embargo se me ocurre que pudieras especificar el usuario y pwd de la BD en el string de conexión y hacer un par de pruebas.
Respuesta
1
La BD MASTER no debe ser tocada ni menos restaurada.
La instalación del SQLSERVER creará siempre una MASTER para cada instancia.
Realiza el restore de cualquier BD de usuario menos las identificadas como del sistema (MASTER, TEMP, etc.)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas