Leer archivo que se encuentra en un servidor remoto desde tarea programada en Sql Server 2008

Leer archivo que se encuentra en un servidor remoto desde tarea programada en Sql Server 2008

Buenos días, espero que estén muy bien.

Por favor necesito que me ayuden con el siguiente tema.

tengo un servidor A que contiene SqlServer 2008 y otro servidor B en Windows que contiene un archivo. Bam (es un archivo que contiene el export de una base de datos Sql).

El servidor A solo tiene Sql Server y en el no se pueden alojar archivos de ningún tipo. El Servidor B no contiene Sql Server sino que solo nos sirve para contener archivos. Bam. Este servidor B pide clave y contraseña para el acceso al mismo.

Lo que se necesita es leer el archivo. Bam que se encuentra en el servidor B mediante una tarea en Sql Server (Agente SQL Server), y poder realizar el import de dicho archivo.

Este trasferencia no se puede realizar mediante archivos. Bat, solo lo podemos hacer dentro de Sql Server; es decir, desde una tarea programa o un stored procedure.

He intentado la conexión al servidor B en una sentencia que crre en la tarea del trabajo programado en SQL Server:

EXEC master.. Xp_cmdshell 'net use \\servidor\ruta_donde_esta_el_archivo passwor_servidor /user:user_servidor'

Al ejecutar la sentencia anterior me da: "error del sistema 1312", no se si estoy realizando mal la consulta o hay otra forma más facil de hacerla.

Luego de realizar la conexión es necesario leer el archivo. Bam

Muchas gracias de antemano, espero que me puedan ayudar con este tema

Saludos,


Comentarios

Hola como estas !, bueno como primer medida, chequea los siguientes puntos:

1) La cuenta con la que impersona el motor y scheduler de SQL Server, posee privilegios para leer en el directorio de origen del archivo .Bam
2) Sin conocer el código, me parece que te conviene trabajar con la ruta UNC (\\Equipo\Shared) en vez de realizar 'net use' para conectarte por drive.
3) Fijate si podes directamente ejecutar un BCP cumpliendo los requisitos de los puntos 1 y 2.

Espero tus comentarios.

Abrazo virtual.

JuanPLG


JuanPLG muchas gracias por responder,

Disculpa que no te haya respondido antes pero he estado intentando los consejos que me diste y otras cosas mas.

Este tema sigo sin resolverlo completamente.

Efectivamente como me comentabas el usuario que arranca los servicios de SQL Server Agent debía de tener los permisos necesarios en el servidor B, pensé que los tenía pero no era así, luego de colocarlos pude ejecutar el comando net use \\servidor\ruta_donde_esta_el_archivo passwor_servidor /user:user_servidor, también puedo manipular el archivo que tengo en el servidor B; es decir, le puedo cambiar el nombre, entre otras cosas.

Ahora bien, necesito realizar un restore de la base de datos en el servidor A con el archivo .bam que se encuentra en el servidor B, con la siguiente sentencia:
RESTORE DATABASE
FROM DISK = '\\servidor\ruta_donde_esta_el_archivo' <-- RUTA EN EL SERVIDOR B
WITH REPLACE
GO
Pero me da el siguiente error: Error al buscar el archivo "D:\MSSQL\Data\Bam_Data.MDF en los directorios, error del sistema operativo: 21(el dispositivo no esta listo).
En mi poca experiencia me parece que el servidor B necesita tener instalado SQL Server para poder hacer el restore de la base de datos, el problema radica en que ese servidor B no puede tener base de datos.

¿Que podría hacer?, ¿puedo ejecutar un restore con ese archivo de otro modo sin que el servidor B tenga SQL Server?.

Estuve viendo sin hacer un restore con la sentencia BCP pero no he conseguido nada.

Gracias de antemano,
Saludos,

Hola como estas !, bueno en base a el error reportado y el procedimiento, te diria que verifiques los siguientes pasos:

1) Para realizar un RESTORE de Base de datos, necesitas partir de un backup realizado a traves del motor de base de datos es decir un previo BACKUP DATABASE para luego sí realizar un RESTORE DATABASE. En tu sentencia puedo observar lo siguiente:

RESTORE DATABASE
FROM DISK = '\\servidor\ruta_donde_esta_el_archivo' <-- RUTA EN EL SERVIDOR B
WITH REPLACE
GO

Faltaría aclarar nombre de base de datos y archivo de backup, ademas de la ruta. Con lo cual quedaría de la siguiente manera:

RESTORE DATABASE [Bam]
FROM DISK = '\\servidor\ruta_donde_esta_el_archivo\[Nombre_de_Archivo_Backup]' --RUTA SERVIDOR B
WITH REPLACE
GO

2) Si el punto anterior da como resultado la no existencia del archivo de backup, entonces, verificar con que procedimiento y herramientas se genero el archivo a importar a la base de datos. Pues de ello depende que procedimiento utilizar para impactar los datos en la base en cuestión.

Espero tus comentarios.

Un abrazo virtual.

JuanPLG


Hola JuanPL,

Cuando te realicé la pregunta anterior me equivoque en la sitaxis. La tarea programada que esta ejecuantado el restore de la base de datos es como tú dices; es decir,

RESTORE DATABASE [Bam]
FROM DISK = '\\servidor\ruta_donde_esta_el_archivo\[Nombre_de_Archivo_Backup]' --RUTA SERVIDOR B
WITH REPLACE
GO

Esta sentencia me funciona perfectamente en mi disco local, pero no en el servidor B. Cuando lo ejecuto me da el siguiente error:

"Error al buscar el archivo "D:\MSSQL\Data\Bam_Data.MDF en los directorios, error del sistema operativo: 21(el dispositivo no esta listo)".

Por eso es que pensaba si es que el servidor B necesita tener instalado SQL Server, espero que no sea así, o es que tengo que hacer este restore de otra forma.

Gracias,
Saludos.

Hola ramorjo !, bueno, si mal no entiendo lo que necesitas es:

Restore de una base de datos en el servidor A el cual posee un motor SQL Server, obteniendo el archivo de backup desde una ruta 'UNC' que apunta a un server B el cual no tiene instalado un motor SQL Server.

Si este es el caso no necesitas un SQL Server instalado en el server B.

Depura el problema de la siguiente manera:

1) Chequear que la ruta exista en el server A (D:\MSSQL\Data\)

2) Parado desde el Query Analyzer en el Server A ejecutar la siguiente sentencia:

RESTORE VERIFYONLY FROM DISK ='\\SERVERB\SHARED\Nombre_archivo_backup.bak'

El resultado debe ser:

"Backup set is vaild."

Si te arroja error 21 es que hay problemas en los permisos de sharing al archivo de destino. La cuenta de SQL Server que levanta tanto el motor (mssqlserver) como el scheduler(sqlserveragent) debe ser una cuenta de dominio con privilegios en el server B donde se encuentra el archivo para hacer un restore.

un abrazo virtual.

JuanPLG


Hola,

Tenías razón en todo, ya puedo generar el restore de la base de datos, todos los problemas que tenía era con respecto a los acceso del servidor A al servidor B.

Muchísimas gracias por todo, realmente me ayudaste mucho.

Tengo una última pregunta. ¿La única forma de que esto funcione es que La cuenta de SQL Server que levanta tanto el motor (mssqlserver) como el scheduler(sqlserveragent) debe ser una cuenta de dominio con privilegios en el server B?, lo pregunto porque el servidor A pertenece a una gerencia de una empresa y el servidor B pertenece a otra gerencia, y sabrás que entre gerencias de una misma empresa se tiene mucho recelo con las claves y los usuarios.

Claro esta me imagino que tengo que pedirle a la gerencia del servidor A el usuario y password que controla al mssqlserver y al sqlserveragent de SQL Server para que tenga acceso al servidor B y se pueda ejecutar todo correctamente.

Muchas gracias,

Un abrazo virtual.

No conozco el modelo de AD que tienen implementado, pero por lo general se resuelve con una trust relationship entre dominios con los mínimos derechos y permisos de la cuenta que levanta el mssqlserver y accede al otro server (server B) que puede estar o no en el mismo dominio.

Un abrazo virtual.

JuanPLG


Hola JuanPLG,

Bueno voy a averiguar más de ese tema que me comentas,

Muchísimas gracias por toda tu ayuda.

Saludos,

Hola JuanPLG

Coye tú dirás que soy bastante fastidioso, ¿pero será que tu sabes de esto?. Esta pregunta esta relacionada con todo el tema que estoy tratando con SQL Server y los dos servidores,

Tengo creado un trabajo en SQL Server 2008, este trabajo esta creado bajo el Agente de SQL Server. En uno de los pasos de este trabajo ejecuto algunas sentencias del sistema operativo (CmdExec), pero dentro de ese paso necesito consultar una tabla de mi base de datos; es decir, necesito ejecutar una sentencia T-SQL, pero no sé combinar las dos tipos de consultas.

He hecho trabajos en el Agente de SQL Server donde el tipo de sentencia es T-SQL y desde allí puedes invocar sentencia del Sistema operativo por medio de la sentencia "EXEC master..xp_cmdshell", lo contario no es posible?.

Saludos,

Hola Ramorjo como estas !, lo contrario puede hacerse. Necesitas generar un archivo del tipo cmd, con variables para guardar los resultados e invocar la consulta al SQL Server, utilizando la herramienta sqlcmd.
Pon especial atención a los seteos de entorno de la herramienta sqlcmd, pues puedes llamar script (*.sql) o bien directamente ejecutar el query (-Q"Select * from mitabla").

Saludos,

JuanPLG