Làm cách nào để tôi viết SQL di động đề cập đến một máy chủ được liên kết?


9

Tôi đã có một thủ tục được lưu trữ đề cập đến một máy chủ được liên kết. Ở một số nơi trong suốt quy trình tôi đã có một cái gì đó như sau:

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

Quy trình này tồn tại trong môi trường Phát triển, Môi trường thử nghiệm và Môi trường sống.

Vấn đề là mỗi bản sao của thủ tục khác nhau một cách tinh tế vì tên máy chủ khác nhau đối với từng môi trường. Điều này làm cho việc quản lý triển khai các bản cập nhật kịch bản trở nên rắc rối.

Có cách nào để làm cho thủ tục di động để mỗi môi trường có thể chạy các phiên bản giống hệt nhau của nó không?

Nếu không, tôi có thể làm gì để triển khai tập lệnh ít bị lỗi / lỗi không?


3
Là tạo một chế độ xem khác nhau trên mỗi máy chủ là một tùy chọn? Bạn có thể xác định chế độ xem là SELECT <fields> FROM <linked server>nhưng sử dụng cùng tên cho tất cả các máy chủ để duy trì mã
JNK

@JNK đó không phải là một ý tưởng tồi, tuy nhiên có khá nhiều bảng, nhưng ít nhất các khung nhìn sẽ được duy trì đơn giản hơn một thủ tục được lưu trữ với các tham chiếu máy chủ được liên kết được chuyển qua.
Bác sĩ Jones

@jnk, bạn nên làm cho câu trả lời.
HLGEM

Câu trả lời:


14

Tên của máy chủ được liên kết của bạn không phải là tên của máy chủ. Bạn có thể sử dụng một tên chung.

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

Thiết lập máy chủ được liên kết trên mỗi môi trường có cùng tên, nhưng thực tế trỏ chúng vào các máy chủ khác nhau.


0

Tôi thích ý tưởng sử dụng tên máy chủ được liên kết chung. Tuy nhiên, trong nhiều môi trường, điều này có thể không thực hiện được, trong trường hợp này, bạn có thể sử dụng SQl động trong sp.

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
Tôi sẽ lưu ý rằng nếu tôi đang làm điều này trong cuộc sống thực, tôi sẽ sử dụng một khối thử bắt và phát sinh lỗi nếu @linkedservername là null sau khi tuyên bố thiết lập để cảnh báo bạn rằng điều này đã chạy trên máy chủ sai.
HLGEM

1
Nếu bạn thực hiện phương pháp này, tôi nghĩ rằng tôi sẽ bọc câu lệnh CASE trong một hàm vì vậy nếu máy chủ thay đổi, tôi chỉ phải cập nhật chức năng.
Eli

Tốt điểm @Eli
HLGEM
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.