Tạo một máy chủ được liên kết trỏ đến chính nó


14

Tôi đang cố gắng tạo một máy chủ được liên kết trên phiên bản SQL Server 2014 servername\instancenamebằng cách sử dụng lệnh gọi sau:

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

Tôi nhận được lỗi:

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

Điều này hoạt động tốt trong SQL Server 2005 và theo MSDN ,

Máy chủ được liên kết không phải là một phiên bản khác của SQL Server,

Vì vậy, tôi không chắc những gì đã thay đổi trong (các) phiên bản gần đây không phù hợp với điều này. Sử dụng UI tạo ra một thông báo tương tự:

Bạn không thể tạo Máy chủ SQL cục bộ làm máy chủ được liên kết.

Tôi hiểu rằng đó là một điều kỳ lạ khi yêu cầu, nhưng đó là để hỗ trợ một số mã kế thừa hoạt động vào năm 2005 (và được sử dụng trong các trường hợp riêng biệt). Các tài liệu nói rằng nó nên hoạt động, nhưng nó không. Có cách nào để làm điều này hoạt động vào năm 2014, hoặc tôi sẽ phải sửa đổi mã cơ bản?


1
Nó thực sự không nên làm cho một sự khác biệt. Bạn có thể sử dụng một định danh 4 phần trên một máy chủ cục bộ.
Kris Gruttemeyer

Tại sao bạn cố gắng tạo một máy chủ được liên kết đến máy chủ cục bộ? Phần nào không hoạt động? Có lẽ đó là những gì câu hỏi của bạn nên về ...
Aaron Bertrand

1
Mã kế thừa được viết cho các trường hợp khác nhau kết nối thông qua một máy chủ được liên kết. Tại một số thời điểm trong lịch sử, hai trường hợp đã được hợp nhất thành một trường hợp duy nhất, nhưng mã và máy chủ được liên kết vẫn không thay đổi. Mục tiêu của tôi là hỗ trợ mã như là vì a) Tôi không biết những gì liên quan đến việc thay đổi nó và b) nhà phát triển chính muốn có thể hỗ trợ cơ sở dữ liệu được phân phối cho các trường hợp riêng biệt trong tương lai.
mathewb

3
Bạn có thể muốn xem xét các từ đồng nghĩa. Sau đó, nếu bạn có các đối tượng được chuyển đến các máy chủ khác nhau, bạn chỉ cần thả và tạo lại các từ đồng nghĩa và không phải chạm vào mã.
Aaron Bertrand

Cảm ơn Aaron. Tôi nghĩ đó chính xác là những gì tôi đang tìm kiếm. Cơ sở dữ liệu sử dụng các từ đồng nghĩa, vì vậy tôi chỉ cần thả / tạo chúng để xóa tên máy chủ khỏi tên bốn phần. Sau đó tôi có thể loại bỏ hoàn toàn máy chủ được liên kết. Nếu cơ sở dữ liệu được di chuyển sau này, tôi có thể thêm tên máy chủ được liên kết trở lại vào các từ đồng nghĩa. Hiểu rồi.
mathewb

Câu trả lời:


20

Hóa ra tôi đã có thể làm cho nó hoạt động với các thông số khác nhau.

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

Thay vì xử lý các tham chiếu máy chủ được liên kết bên trong mã của bạn, bạn có thể muốn xem xét đầu tư mã một lần liên quan đến việc sử dụng từ đồng nghĩa ở bất kỳ vị trí nào hiện tại bạn có máy chủ được liên kết.

Vì vậy, thay vì:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Bạn có một từ đồng nghĩa:

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

Sau đó, mã của bạn chỉ đơn giản là:

SELECT whatever FROM dbo.mytablepointer;

Sau đó, nếu bạn có các đối tượng được chuyển đến các máy chủ khác nhau, bạn chỉ cần thả và tạo lại các từ đồng nghĩa và không phải chạm vào mã:

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

3

Chạy lệnh này - bạn sẽ có thể sử dụng máy chủ cục bộ vì máy chủ được liên kết không cần thay đổi mã

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.