Membuat Server Tertaut yang Mengarahkan ke Sendiri

14

Saya mencoba membuat server tertaut pada SQL Server 2014 servername\instancenamemenggunakan panggilan berikut:

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

Saya mendapatkan kesalahan:

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

Ini berfungsi dengan baik di SQL Server 2005, dan menurut MSDN ,

Server tertaut tidak harus menjadi contoh lain dari SQL Server,

Jadi saya tidak yakin apa yang berubah di versi terbaru yang melarang ini. Menggunakan UI menghasilkan pesan serupa:

Anda tidak dapat membuat SQL Server lokal sebagai server tertaut.

Saya mengerti bahwa ini adalah hal yang aneh untuk diminta, tetapi untuk mendukung beberapa kode warisan yang berfungsi pada tahun 2005 (dan dulunya pada contoh terpisah). Dokumentasi menyatakan bahwa itu harus bekerja, tetapi tidak. Apakah ada cara untuk membuatnya berfungsi pada tahun 2014, atau apakah saya harus memodifikasi kode yang mendasarinya?

mathewb
sumber
1
Sebenarnya seharusnya tidak membuat perbedaan. Anda dapat menggunakan pengidentifikasi 4 bagian di server lokal.
Kris Gruttemeyer
Mengapa Anda mencoba membuat server yang ditautkan ke server lokal? Bagian mana yang tidak berfungsi? Mungkin itu yang apa pertanyaan Anda harus sekitar ...
Aaron Bertrand
1
Kode lama ditulis untuk instance berbeda yang terhubung melalui server tertaut. Pada beberapa titik dalam sejarah, kedua instance digabung menjadi satu instance, tetapi kode dan server yang terhubung tetap tidak berubah. Tujuan saya adalah untuk mendukung kode apa adanya karena a) Saya tidak tahu apa yang terlibat dalam mengubahnya, dan b) pengembang utama ingin dapat mendukung database yang didistribusikan ke contoh yang terpisah di masa depan.
mathewb
3
Anda mungkin ingin mempertimbangkan sinonim. Kemudian jika Anda memiliki objek yang dipindahkan ke server yang berbeda, Anda cukup menjatuhkan dan membuat kembali sinonim dan tidak harus menyentuh kode.
Aaron Bertrand
Terima kasih Aaron. Saya pikir itulah yang saya cari. Database yang satu menggunakan sinonim, jadi saya hanya perlu menghapus / membuat mereka menghapus nama server dari nama empat bagian. Maka saya bisa menghilangkan server yang terhubung sama sekali. Jika database dipindahkan nanti, saya dapat menambahkan nama server yang ditautkan kembali ke sinonim. Mengerti.
mathewb

Jawaban:

20

Ternyata saya bisa membuatnya bekerja dengan parameter yang berbeda.

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;'
mathewb
sumber
11

Alih-alih berurusan dengan referensi server tertaut di dalam kode Anda, Anda mungkin ingin mempertimbangkan investasi kode satu kali yang melibatkan penggunaan sinonim di lokasi mana pun saat ini Anda memiliki server tertaut.

Jadi alih-alih:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Anda memiliki sinonim:

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

Maka kode Anda cukup:

SELECT whatever FROM dbo.mytablepointer;

Kemudian jika Anda memiliki objek yang dipindahkan ke server yang berbeda, Anda cukup menjatuhkan dan membuat kembali sinonim dan tidak harus menyentuh kode:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;
Aaron Bertrand
sumber
3

Jalankan Perintah ini - Anda akan dapat menggunakan server lokal sebagai server Tertaut tanpa memerlukan perubahan kode

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
Ashish Nigam
sumber