การสร้างเซิร์ฟเวอร์ที่เชื่อมโยงที่ชี้ไปที่ตัวเอง


14

ฉันพยายามสร้างเซิร์ฟเวอร์ที่เชื่อมโยงกับอินสแตนซ์ SQL Server 2014 servername\instancenameโดยใช้การเรียกต่อไปนี้:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'servername\instancename',
    @srvproduct=N'SQL Server'

ฉันได้รับข้อผิดพลาด:

Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.

นี้ทำงานได้ดีใน SQL Server 2005 และเป็นไปตามMSDN ,

เซิร์ฟเวอร์ที่เชื่อมโยงไม่จำเป็นต้องเป็นอินสแตนซ์อื่นของ SQL Server

ดังนั้นฉันไม่แน่ใจว่ามีอะไรเปลี่ยนแปลงในเวอร์ชันล่าสุดที่ไม่อนุญาตสิ่งนี้ การใช้ UI สร้างข้อความที่คล้ายกัน:

คุณไม่สามารถสร้างเซิร์ฟเวอร์ SQL ภายในเครื่องเป็นเซิร์ฟเวอร์ที่มีการเชื่อมโยง

ฉันเข้าใจว่ามันเป็นเรื่องแปลกที่จะขอ แต่มันก็เพื่อสนับสนุนรหัสดั้งเดิมที่ทำงานในปี 2005 (และเคยเป็นกรณีที่แยกต่างหาก) เอกสารระบุว่าควรใช้งานได้ แต่ไม่สามารถทำได้ มีวิธีที่จะทำให้เรื่องนี้ใช้งานได้ในปี 2557 หรือฉันจะต้องแก้ไขโค้ดพื้นฐานหรือไม่?


1
ที่จริงแล้วไม่ควรสร้างความแตกต่าง คุณสามารถใช้ตัวระบุ 4 ส่วนบนเซิร์ฟเวอร์ท้องถิ่นได้
Kris Gruttemeyer

เหตุใดคุณจึงพยายามสร้างเซิร์ฟเวอร์ที่เชื่อมโยงกับเซิร์ฟเวอร์ภายในเครื่อง ส่วนไหนไม่ทำงาน บางทีนั่นอาจเป็นสิ่งที่คำถามของคุณควรจะเกี่ยวกับ ...
Aaron Bertrand

1
รหัสดั้งเดิมเขียนขึ้นสำหรับอินสแตนซ์ต่างๆที่เชื่อมต่อผ่านเซิร์ฟเวอร์ที่เชื่อมโยง ณ จุดหนึ่งในประวัติศาสตร์ทั้งสองอินสแตนซ์ถูกรวมเข้าเป็นอินสแตนซ์เดียว แต่รหัสและเซิร์ฟเวอร์ที่เชื่อมโยงยังคงไม่เปลี่ยนแปลง เป้าหมายของฉันคือการสนับสนุนรหัสตามที่เป็นเพราะ) ฉันไม่รู้ว่าเกี่ยวข้องกับการเปลี่ยนแปลงมันอย่างไรและ b) ผู้พัฒนาหลักต้องการที่จะสามารถสนับสนุนฐานข้อมูลที่ถูกแจกจ่ายไปยังอินสแตนซ์ที่แยกจากกันในอนาคต
mathewb

3
คุณอาจต้องการพิจารณาคำพ้องความหมาย ถ้าคุณย้ายวัตถุไปยังเซิร์ฟเวอร์อื่นคุณเพียงแค่วางและสร้างคำพ้องความหมายใหม่และไม่ต้องแตะรหัส
Aaron Bertrand

ขอบคุณแอรอน ฉันคิดว่านั่นคือสิ่งที่ฉันกำลังมองหา ฐานข้อมูลเดียวใช้คำพ้องความหมายดังนั้นฉันเพียงแค่ต้องลด / สร้างพวกเขาลบชื่อเซิร์ฟเวอร์จากชื่อสี่ส่วน จากนั้นฉันสามารถกำจัดเซิร์ฟเวอร์ที่ลิงก์ทั้งหมด หากฐานข้อมูลถูกย้ายในภายหลังฉันสามารถเพิ่มชื่อเซิร์ฟเวอร์ที่เชื่อมโยงกลับเข้าไปในคำพ้องความหมาย เข้าใจแล้ว
mathewb

คำตอบ:


20

ปรากฎว่าฉันสามารถทำให้มันทำงานกับพารามิเตอร์ที่แตกต่างกัน

EXEC master.dbo.sp_addlinkedserver
    @server = N'LinkedServerName', 
    @srvproduct=N'', 
    @provider=N'SQLNCLI', 
    @provstr=N'DRIVER={SQL Server};Server=(local)\InstanceName; Initial Catalog=DBNAME;uid=user;pwd=password;'

11

แทนที่จะจัดการกับการอ้างอิงเซิร์ฟเวอร์ที่เชื่อมโยงภายในรหัสของคุณคุณอาจต้องการพิจารณาการลงทุนรหัสครั้งเดียวที่เกี่ยวข้องกับการใช้คำพ้องความหมายในสถานที่ใด ๆ ที่คุณมีเซิร์ฟเวอร์ที่เชื่อมโยงอยู่ในปัจจุบัน

ดังนั้นแทนที่จะ:

SELECT whatever FROM someserver.somedb.dbo.mytable;

คุณมีคำพ้องความหมาย:

CREATE SYNONYM dbo.mytablepointer FOR someserver.somedb.dbo.mytable;

จากนั้นรหัสของคุณคือ:

SELECT whatever FROM dbo.mytablepointer;

จากนั้นหากคุณย้ายวัตถุไปยังเซิร์ฟเวอร์อื่นคุณเพียงแค่วางและสร้างคำพ้องความหมายใหม่และไม่ต้องแตะรหัส:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;

3

เรียกใช้คำสั่งนี้ - คุณจะสามารถใช้เซิร์ฟเวอร์ท้องถิ่นเป็นเซิร์ฟเวอร์ที่เชื่อมโยงได้โดยไม่ต้องเปลี่ยนรหัส

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.