sql >> Base de Datos >  >> RDS >> Sqlserver

Crear un servidor vinculado en SQL Server (ejemplo de T-SQL)

Este artículo proporciona un ejemplo de creación de un servidor vinculado en SQL Server mediante Transact-SQL. El uso de T-SQL le permite crear el servidor vinculado sin depender de una interfaz gráfica de usuario (como SSMS).

Sintaxis

Para crear un servidor vinculado usando T-SQL, use el sp_addlinkedserver procedimiento almacenado del sistema.

La sintaxis oficial es así:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
     [ , [ @provider= ] 'provider_name' ]  
     [ , [ @datasrc= ] 'data_source' ]   
     [ , [ @location= ] 'location' ]   
     [ , [ @provstr= ] 'provider_string' ]   
     [ , [ @catalog= ] 'catalog' ]

La mayoría de los argumentos son opcionales, pero deberá proporcionar el nombre del servidor vinculado.

Probablemente también desee especificar la fuente de datos o la ubicación del servidor vinculado y quizás el nombre de un proveedor. El catalog El argumento le permite especificar una base de datos predeterminada a la que se asigna el servidor vinculado. Consulte la documentación oficial de Microsoft para obtener una explicación de cada uno de estos argumentos.

Ejemplo:crear el servidor vinculado

Para crear un servidor vinculado usando T-SQL, ejecute sp_addlinkedserver procedimiento almacenado al pasar el nombre del servidor vinculado, así como su fuente.

Este es un ejemplo de creación de un servidor vinculado:

EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2,1433',
    @catalog='Music';

En este caso, el nombre del servidor vinculado es "Homer" y especifico la dirección IP del servidor, seguida del puerto TCP (en mi caso, en realidad es un contenedor Docker en la misma máquina). Cambie el nombre del servidor y la dirección/puerto IP según sea necesario. También especifico una base de datos predeterminada llamada "Música".

Este ejemplo usa MSOLEDBSQL como el nombre del proveedor, pero puede usar cualquier nombre de proveedor aplicable en su situación. En mi caso, estoy vinculando a otra instancia de SQL Server.

Tenga en cuenta que MSOLEDBSQL es el proveedor recomendado para SQL Server. Si ha utilizado anteriormente SQLOLEDB o SQLNCLI , ambos ahora están en desuso. Microsoft decidió eliminar la obsolescencia de OLE DB y lanzarlo en 2018.

Si tuviera que vincular a Oracle, podría usar OraOLEDB.Oracle , para MS Access puede usar Microsoft.Jet.OLEDB.4.0 (para acceder a los formatos 2002-2003) o Microsoft.ACE.OLEDB.12.0 (para el formato 2007). La documentación oficial tiene una tabla de parámetros para usar en diferentes escenarios.

Probar el servidor vinculado

Una vez que haya agregado el servidor vinculado, puede usar sp_testlinkedserver para probarlo:

EXEC sp_testlinkedserver Homer;

Resultado (si tiene éxito):

Commands completed successfully.

Si obtiene un error de "Inicio de sesión fallido", es probable que no tenga un inicio de sesión correspondiente en el servidor remoto. Deberá tener un inicio de sesión correspondiente con las mismas credenciales que el del servidor local.

La forma en que funciona es que, cuando agrega por primera vez el servidor vinculado, se crea automáticamente una asignación predeterminada entre todos los inicios de sesión en el servidor local y los inicios de sesión remotos en el servidor vinculado. SQL Server usa las credenciales del inicio de sesión local cuando se conecta al servidor vinculado en nombre del inicio de sesión. Si su inicio de sesión local no tiene un inicio de sesión correspondiente en el servidor remoto, obtendrá un error de "Inicio de sesión fallido".

Agregar un inicio de sesión para el servidor vinculado

Si no desea que el servidor vinculado use su propio inicio de sesión, puede especificar un inicio de sesión diferente para que lo use. Siempre que el servidor remoto tenga un inicio de sesión correspondiente con las mismas credenciales, estará listo para comenzar. Obviamente, deberá asegurarse de que la cuenta remota tenga los permisos adecuados para hacer lo que necesita que haga.

Aquí hay un ejemplo de cómo agregar un inicio de sesión de SQL Server para el servidor vinculado.

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Marge', 
    @rmtpassword=N'BigStrong#Passw0rd';

Ejecute esto en el servidor local después de haber creado el servidor vinculado. Necesitará un inicio de sesión correspondiente con las mismas credenciales en el servidor vinculado real (remoto).

Esto agrega un inicio de sesión llamado "Marge" para el servidor vinculado llamado "Homer". Siempre que el servidor remoto tenga un inicio de sesión con las mismas credenciales, el servidor local podrá iniciar sesión en el servidor vinculado.

Consulte Agregar un inicio de sesión de servidor vinculado en SQL Server para ver un ejemplo de cómo agregar un inicio de sesión correspondiente en el servidor remoto.

Soltar un servidor vinculado

Aquí hay un ejemplo de cómo eliminar el servidor vinculado llamado "Homer" y todos los inicios de sesión asociados.

EXEC sp_dropserver 'Homer', 'droplogins';

Los droplogins El argumento es opcional, pero si no especifica esto al descartar un servidor vinculado que tiene entradas de inicio de sesión de servidor vinculado y remotas asociadas, o está configurado como editor de replicación, se devuelve un mensaje de error.

Consulte Eliminar un servidor vinculado mediante T-SQL para obtener más ejemplos de eliminación de un servidor vinculado.

Ejecutar una consulta distribuida contra el servidor vinculado

Ahora que hemos creado el servidor vinculado, aquí hay un ejemplo de cómo ejecutar una consulta distribuida contra él:

SELECT * 
FROM Homer.Music.dbo.Artists;

La única diferencia entre esto y una consulta local es que debe agregar el nombre del servidor vinculado al FROM cláusula.

Así:

LinkedServer.Database.Schema.Table

Alternativamente, puede usar OPENQUERY() para ejecutar una consulta de transferencia:

SELECT * 
FROM OPENQUERY(
    Homer, 
    'SELECT * FROM Music.dbo.Artists;'
    );