Dela via


sp_addlinkedserver (Transact-SQL)

gäller för:SQL ServerAzure SQL Managed Instance

Skapar en länkad server. En länkad server ger åtkomst till distribuerade, heterogena frågor mot OLE DB-datakällor. När en länkad server har skapats med hjälp av sp_addlinkedserverkan distribuerade frågor köras mot den här servern. Om den länkade servern definieras som en instans av SQL Server kan fjärranslutna procedurer köras.

Not

Microsoft Entra ID tidigare kallades Azure Active Directory (Azure AD).

Transact-SQL syntaxkonventioner

Syntax

sp_addlinkedserver
    [ @server = ] N'server'
    [ , [ @srvproduct = ] N'srvproduct' ]
    [ , [ @provider = ] N'provider' ]
    [ , [ @datasrc = ] N'datasrc' ]
    [ , [ @location = ] N'location' ]
    [ , [ @provstr = ] N'provstr' ]
    [ , [ @catalog = ] N'catalog' ]
    [ , [ @linkedstyle = ] linkedstyle ]
[ ; ]

Argument

[ @server = ] N'server'

Namnet på den länkade server som ska skapas. @server är sysname, utan standard.

[ @srvproduct = ] N'srvproduct"

Produktnamnet för OLE DB-datakällan som ska läggas till som en länkad server. @srvproduct är nvarchar(128), med standardvärdet NULL. Om värdet är SQL Serverbehöver @provider, @datasrc, @location, @provstroch @catalog inte anges.

[ @provider = ] Nprovider"

Den unika programmatiska identifieraren (PROGID) för OLE DB-providern som motsvarar den här datakällan. Den @provider måste vara unik för den angivna OLE DB-providern som är installerad på den aktuella datorn. @provider är nvarchar(128), med standardvärdet NULL.

  • I SQL Server 2019 (15.x) och tidigare versioner används SQLNCLI om @provider utelämnas. Om du använder SQLNCLI omdirigeras SQL Server till den senaste versionen av SQL Server Native Client OLE DB-providern. OLE DB-providern förväntas vara registrerad med angiven PROGID i registret. I stället för SQLNCLIrekommenderar vi MSOLEDBSQL.

  • Från och med SQL Server 2022 (16.x) måste du ange ett providernamn. MSOLEDBSQL rekommenderas. Om du utelämnar @providerkan du uppleva oväntat beteende.

Viktig

Den interna SQL Server-klienten (ofta förkortad SNAC) har tagits bort från SQL Server 2022 (16.x) och SQL Server Management Studio 19 (SSMS). Både SQL Server Native Client OLE DB-providern (SQLNCLI eller SQLNCLI11) och den äldre Microsoft OLE DB-providern för SQL Server (SQLOLEDB) rekommenderas inte för ny utveckling. Växla till den nya Microsoft OLE DB Driver (MSOLEDBSQL) för SQL Server framöver.

[ @datasrc = ] N'datasrc"

Namnet på datakällan enligt ole db-providerns tolkning. @datasrc är nvarchar(4000), med standardvärdet NULL. @datasrc skickas som egenskapen DBPROP_INIT_DATASOURCE för att initiera OLE DB-providern.

[ @location = ] N'plats'

Platsen för databasen som tolkas av OLE DB-providern. @location är nvarchar(4000), med standardvärdet NULL. @location skickas som egenskapen DBPROP_INIT_LOCATION för att initiera OLE DB-providern.

[ @provstr = ] N'provstr"

Den OLE DB-providerspecifika anslutningssträngen som identifierar en unik datakälla. @provstr är nvarchar(4000), med standardvärdet NULL. Argumentet provstr skickas antingen till IDataInitialize eller anges som egenskapen DBPROP_INIT_PROVIDERSTRING för att initiera OLE DB-providern.

När den länkade servern skapas mot SQL Server Native Client OLE DB-providern kan instansen anges med hjälp av nyckelordet SERVER som SERVER=servername\instancename för att ange en specifik instans av SQL Server. servernamn är namnet på den dator där SQL Server körs och instansnamn är namnet på den specifika instans av SQL Server som användaren ska anslutas till.

  • För att få åtkomst till en speglad databas måste en anslutningssträng innehålla databasnamnet. Det här namnet är nödvändigt för att aktivera redundansförsök från dataåtkomstprovidern. Databasen kan anges i parametern @provstr eller @catalog. Du kan också ange ett partnernamn för redundans.

  • Om du kör sp_addlinkedserver från en lokal inloggning eller en inloggning som inte ingår i sysadmin- roll kan du få följande fel:

    Access to the remote server is denied because no login-mapping exists.
    

    Lös problemet genom att lägga till parametern User ID i anslutningssträngen. I följande exempel är myUser användar-ID som skickas till anslutningssträngen:

    EXEC master.dbo.sp_addlinkedserver @server = N'LinkServerName',
        @provider = N'SQLNCLI',
        @srvproduct = 'MS SQL Server',
        @provstr = N'SERVER=serverName\InstanceName;User ID=myUser'
    
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName',
        @locallogin = NULL,
        @useself = N'False',
        @rmtuser = N'myUser',
        @rmtpassword = N'*****'
    

    Mer information finns i Åtkomst till fjärrservern nekas eftersom det inte finns någon inloggningsmappning.

[ @catalog = ] N'katalog"

Katalogen som ska användas när en anslutning görs till OLE DB-providern. @catalog är sysname, med standardvärdet NULL. @catalog skickas som egenskapen DBPROP_INIT_CATALOG för att initiera OLE DB-providern. När den länkade servern definieras mot en instans av SQL Server refererar katalogen till den standarddatabas som den länkade servern mappas till.

[ @linkedstyle = ] linkedstyle

Identifieras endast i informationssyfte. Stöds inte. Framtida kompatibilitet garanteras inte.

Returnera kodvärden

0 (lyckades) eller 1 (fel).

Resultatuppsättning

Ingen.

Anmärkningar

I följande tabell visas hur en länkad server kan konfigureras för datakällor som kan nås via OLE DB. En länkad server kan konfigureras på mer än ett sätt för en viss datakälla. det kan finnas mer än en rad för en datakälla. Den här tabellen visar också de sp_addlinkedserver parametervärden som ska användas för att konfigurera den länkade servern.

Fjärrdatakälla för OLE DB OLE DB-provider @srvproduct @provider @datasrc @location @provstr @catalog
SQL Server SQL Server Native Client OLE DB-provider SQL Server 1 (standard)
SQL Server SQL Server Native Client OLE DB-provider SQLNCLI Nätverksnamn för SQL Server (för standardinstans) Databasnamn (valfritt)
SQL Server SQL Server Native Client OLE DB-provider SQLNCLI servernamn\instansnamn (för specifik instans) Databasnamn (valfritt)
Oracle, version 8 och senare Oracle-provider för OLE DB Någon OraOLEDB.Oracle Alias för Oracle-databasen
Åtkomst/Jet Microsoft OLE DB-provider för Jet Någon Microsoft.Jet.OLEDB.4.0 Fullständig sökväg till Jet-databasfilen
ODBC-datakälla Microsoft OLE DB-provider för ODBC Någon MSDASQL System-DSN för ODBC-datakälla
ODBC-datakälla Microsoft OLE DB-provider för ODBC Någon MSDASQL ODBC-anslutningssträng
Filsystem Microsoft OLE DB-provider för indexeringstjänst Någon MSIDXS Katalognamn för indexeringstjänst
Microsoft Excel-kalkylblad Microsoft OLE DB-provider för Jet Någon Microsoft.Jet.OLEDB.4.0 Fullständig sökväg till Excel-fil Excel 5.0
IBM Db2-databas Microsoft OLE DB-provider för DB2 Någon DB2OLEDB Mer information finns i dokumentationen om Microsoft OLE DB-providern för DB2. Katalognamn för DB2-databas

1 Det här sättet att konfigurera en länkad server tvingar namnet på den länkade servern att vara samma som nätverksnamnet för fjärrinstansen av SQL Server. Använd @datasrc för att ange servern.

2 "Any" anger att produktnamnet kan vara vad som helst.

SQL Server Native Client OLE DB-providern är den provider som används med SQL Server om inget providernamn har angetts eller om SQL Server anges som produktnamn. Även om du anger det äldre providernamnet, SQLOLEDB, ändras det till SQLNCLI när det sparas i katalogen.

Parametrarna @datasrc, @location, @provstroch @catalog identifierar databasen eller databaserna som den länkade servern pekar på. Om någon av dessa parametrar är NULLanges inte motsvarande OLE DB-initieringsegenskap.

När du anger filnamn som ska peka på OLE DB-datakällor i en klustrad miljö använder du UNC (Universal Naming Convention Name) eller en delad enhet för att ange platsen.

Den lagrade proceduren sp_addlinkedserver kan inte köras i en användardefinierad transaktion.

Viktig

Azure SQL Managed Instance stöder för närvarande endast SQL Server, SQL Database och andra SQL-hanterade instanser som fjärrdatakällor.

Viktig

När en länkad server skapas med hjälp av sp_addlinkedserverläggs en standardmappning till för alla lokala inloggningar. För icke-SQL Server-leverantörer kan SQL Server-autentiserade inloggningar få åtkomst till providern under SQL Server-tjänstkontot. Administratörer bör överväga att använda sp_droplinkedsrvlogin <linkedserver_name>, NULL för att ta bort den globala mappningen.

Behörigheter

sp_addlinkedserver-instruktionen kräver behörigheten ALTER ANY LINKED SERVER. (Dialogrutan SQL Server Management Studio ny länkad server implementeras på ett sätt som kräver medlemskap i sysadmin fast serverroll.)

Exempel

A. Använda Microsoft SQL Server OLE DB-providern

I följande exempel skapas en länkad server med namnet SEATTLESales. Produktnamnet är SQL Serveroch inget providernamn används.

USE master;
GO
EXEC sp_addlinkedserver
   N'SEATTLESales',
   N'SQL Server';
GO

I följande exempel skapas en länkad server S1_instance1 på en instans av SQL Server med hjälp av SQL Server OLE DB-drivrutinen.

EXEC sp_addlinkedserver
   @server=N'S1_instance1',
   @srvproduct=N'',
   @provider=N'MSOLEDBSQL',
   @datasrc=N'S1\instance1';

I följande exempel skapas en länkad server S1_instance1 på en instans av SQL Server med hjälp av SQL Server Native Client OLE DB-providern.

Viktig

SQL Server Native Client OLE DB-providern (SQLNCLI) är fortfarande inaktuell och vi rekommenderar inte att du använder den för nytt utvecklingsarbete. Använd i stället den nya Microsoft OLE DB-drivrutin för SQL Server (MSOLEDBSQL) som kommer att uppdateras med de senaste serverfunktionerna.

EXEC sp_addlinkedserver
   @server=N'S1_instance1',
   @srvproduct=N'',
   @provider=N'SQLNCLI',
   @datasrc=N'S1\instance1';

B. Använda Microsoft OLE DB-providern för Microsoft Access

Microsoft.Jet.OLEDB.4.0-providern ansluter till Microsoft Access-databaser som använder formatet 2002-2003. I följande exempel skapas en länkad server med namnet SEATTLE Mktg.

Not

Det här exemplet förutsätter att både Microsoft Access och exempeldatabasen Northwind är installerade och att Northwind-databasen finns i C:\Msoffice\Access\Samples på samma server som SQL Server-instansen.

EXEC sp_addlinkedserver
   @server = N'SEATTLE Mktg',
   @provider = N'Microsoft.Jet.OLEDB.4.0',
   @srvproduct = N'OLE DB Provider for Jet',
   @datasrc = N'C:\MSOffice\Access\Samples\Northwind.mdb';
GO

C. Använd Microsoft OLE DB-providern för ODBC med parametern datasrc

I följande exempel skapas en länkad server med namnet SEATTLE Payroll som använder Microsoft OLE DB-providern för ODBC (MSDASQL) och parametern @datasrc.

Not

Det angivna ODBC-datakällnamnet måste definieras som System DSN på servern innan du använder den länkade servern.

EXEC sp_addlinkedserver
   @server = N'SEATTLE Payroll',
   @srvproduct = N'',
   @provider = N'MSDASQL',
   @datasrc = N'LocalServer';
GO

D. Använda Microsoft OLE DB-providern för Excel-kalkylbladet

Om du vill skapa en länkad serverdefinition med hjälp av Microsoft OLE DB-providern för Jet för att få åtkomst till ett Excel-kalkylblad i formatet 1997–2003 skapar du först ett namngivet intervall i Excel genom att ange kolumnerna och raderna i Excel-kalkylbladet som ska väljas. Namnet på intervallet kan sedan refereras till som ett tabellnamn i en distribuerad fråga.

EXEC sp_addlinkedserver 'ExcelSource',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:\MyData\DistExcl.xls',
   NULL,
   'Excel 5.0';
GO

Om du vill komma åt data från ett Excel-kalkylblad associerar du ett cellområde med ett namn. Följande fråga kan användas för att komma åt det angivna namngivna intervallet SalesData som en tabell med hjälp av den länkade server som konfigurerades tidigare.

SELECT *
   FROM ExcelSource...SalesData;
GO

Om SQL Server körs under ett domänkonto som har åtkomst till en fjärrresurs kan en UNC-sökväg användas i stället för en mappad enhet.

EXEC sp_addlinkedserver 'ExcelShare',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   '\\MyServer\MyShare\Spreadsheets\DistExcl.xls',
   NULL,
   'Excel 5.0';

E. Använda Microsoft OLE DB-providern för Jet för att komma åt en textfil

I följande exempel skapas en länkad server för direkt åtkomst till textfiler, utan att länka filerna som tabeller i en Access-.mdb-fil. Providern är Microsoft.Jet.OLEDB.4.0 och providersträngen är Text.

Datakällan är den fullständiga sökvägen till katalogen som innehåller textfilerna. En schema.ini fil, som beskriver strukturen för textfilerna, måste finnas i samma katalog som textfilerna. Mer information om hur du skapar en schema.ini-fil finns i Jet Database Engine-dokumentationen.

Skapa först en länkad server.

EXEC sp_addlinkedserver txtsrv, N'Jet 4.0',
   N'Microsoft.Jet.OLEDB.4.0',
   N'c:\data\distqry',
   NULL,
   N'Text';

Konfigurera inloggningsmappningar.

EXEC sp_addlinkedsrvlogin txtsrv, FALSE, Admin, NULL;

Visa en lista över tabellerna på den länkade servern.

EXEC sp_tables_ex txtsrv;

Fråga en av tabellerna, i det här fallet file1#txt, med hjälp av ett namn i fyra delar.

SELECT * FROM txtsrv...[file1#txt];

F. Använda Microsoft OLE DB-providern för DB2

I följande exempel skapas en länkad server med namnet DB2 som använder Microsoft OLE DB-providern för DB2.

EXEC sp_addlinkedserver @server = N'DB2',
    @srvproduct = N'Microsoft OLE DB Provider for DB2',
    @catalog = N'DB2',
    @provider = N'DB2OLEDB',
    @provstr = N'Initial Catalog=pubs;
       Data Source=DB2;
       HostCCSID=1252;
       Network Address=XYZ;
       Network Port=50000;
       Package Collection=admin;
       Default Schema=admin;';

G. Lägga till en Azure SQL-databas som en länkad server för användning med distribuerade frågor i molndatabaser och lokala databaser

Du kan lägga till en Azure SQL-databas som en länkad server och sedan använda den med distribuerade frågor som sträcker sig över de lokala databaserna och molndatabaserna. Detta är en komponent för databashybridlösningar som sträcker sig över lokala företagsnätverk och Azure-molnet.

SQL Server Box-produkten innehåller den distribuerade frågefunktionen, som gör att du kan skriva frågor för att kombinera data från lokala datakällor och data från fjärranslutna källor (inklusive data från datakällor som inte är SQL Server) som definieras som länkade servrar. Varje Azure SQL-databas (förutom den logiska serverns master databas) kan läggas till som en enskild länkad server och sedan användas direkt i dina databasprogram som andra databaser.

Fördelarna med att använda Azure SQL Database är hanterbarhet, hög tillgänglighet, skalbarhet, arbete med en välbekant utvecklingsmodell och en relationsdatamodell. Kraven för databasprogrammet avgör hur det skulle använda Azure SQL Database i molnet. Du kan flytta alla dina data samtidigt till Azure SQL Database eller gradvis flytta en del av dina data samtidigt som du behåller återstående data lokalt. För ett sådant hybriddatabasprogram kan Azure SQL Database nu läggas till som länkade servrar och databasprogrammet kan utfärda distribuerade frågor för att kombinera data från Azure SQL Database och lokala datakällor.

Här är ett exempel som förklarar hur du ansluter till en Azure SQL-databas med hjälp av distribuerade frågor.

Lägg först till en Azure SQL-databas som länkad server med hjälp av den interna SQL Server-klienten.

EXEC sp_addlinkedserver
    @server = 'LinkedServerName',
    @srvproduct = '',
    @provider = 'sqlncli',
    @datasrc = 'ServerName.database.windows.net',
    @location = '',
    @provstr = '',
    @catalog = 'DatabaseName';

Lägg till autentiseringsuppgifter och alternativ på den länkade servern. Ersätt <password> med ett giltigt lösenord.

EXEC sp_addlinkedsrvlogin
  @rmtsrvname = 'LinkedServerName',
  @useself = 'false',
  @rmtuser = 'LoginName',
  @rmtpassword = '<password>';

EXEC sp_serveroption 'LinkedServerName', 'rpc out', true;

Använd nu den länkade servern för att köra frågor med hjälp av namn i fyra delar, även för att skapa en ny tabell och infoga data.

EXEC ('CREATE TABLE SchemaName.TableName(col1 int not null CONSTRAINT PK_col1 PRIMARY KEY CLUSTERED (col1) )') at LinkedServerName;
EXEC ('INSERT INTO SchemaName.TableName VALUES(1),(2),(3)') at LinkedServerName;

Fråga data med hjälp av namn i fyra delar:

SELECT * FROM LinkedServerName.DatabaseName.SchemaName.TableName;

H. Skapa en länkad Azure SQL Managed Instance-server med hanterad identitetsautentisering

Not

Microsoft Entra ID tidigare kallades Azure Active Directory (Azure AD).

Om du vill skapa en länkad server med hanterad identitetsautentisering kör du följande T-SQL och ersätter <managed_instance> med din egen SQL-hanterade instans. Autentiseringsmetoden använder ActiveDirectoryMSI i parametern @provstr. Överväg att använda @locallogin = NULL för att tillåta alla lokala inloggningar.

EXEC master.dbo.sp_addlinkedserver
    @server = N'MyLinkedServer',
    @srvproduct = N'',
    @provider = N'MSOLEDBSQL',
    @provstr = N'Server=<mi_name>.<dns_zone>.database.windows.net,1433;Authentication=ActiveDirectoryMSI;';

EXEC master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname = N'MyLinkedServer',
    @useself = N'False',
    @locallogin = N'user1@contoso.com';

För att aktivera autentisering med hanterade identiteter måste en hanterad identitet som tilldelats Azure SQL Managed Instance läggas till som en inloggning till den fjärrhanterade instansen. Både systemtilldelade och användartilldelade hanterade identiteter stöds.

Om en primär identitet anges används den, annars används den systemtilldelade hanterade identiteten. Om den hanterade identiteten återskapas med samma namn måste inloggningen på fjärrinstansen också återskapas, eftersom det nya hanterade identitetsprogrammets ID och SQL Managed Instance-tjänstens huvudnamn SID inte längre matchar. Om du vill verifiera att dessa två värden matchar konverterar du SID till program-ID med följande fråga.

SELECT convert(uniqueidentifier, sid) as MSEntraApplicationID
FROM sys.server_principals
WHERE name = '<managed_instance_name>';

Jag. Skapa en länkad SQL Managed Instance-server med Direkt Microsoft Entra-autentisering

Om du vill skapa en länkad server med direktautentisering kör du följande T-SQL och ersätter <managed_instance> med din egen SQL-hanterade instansserver:

EXEC master.dbo.sp_addlinkedserver
    @server = N'MyLinkedServer',
    @srvproduct = N'',
    @provider = N'MSOLEDBSQL',
    @datasrc = N'<mi_name>.<dns_zone>.database.windows.net,1433';

Med direktautentisering överförs säkerhetskontexten för den lokala inloggningen till fjärrinstansen. Direktautentisering kräver att Microsoft Entra-huvudnamnet läggs till som en inloggning på både den lokala och fjärranslutna Azure SQL Managed Instance. Båda hanterade instanserna måste finnas i en serverförtroendegrupp. När kraven uppfylls kan användaren logga in på en lokal instans och köra frågor mot fjärrinstansen via det länkade serverobjektet.