Thực hiện thủ tục lưu trữ từ xa bằng máy chủ được liên kết


10

Chúng tôi có 3 phiên bản SQL Server 2012, 2 trong số chúng tôi thì không db_owner. Một số quy trình được lưu trữ của chúng tôi sử dụng DMV và syschế độ xem và quy trình được lưu trữ chỉ hoạt động khi được thực thi cục bộ.

Tôi muốn tập trung thực hiện các thủ tục được lưu trữ này (của chúng tôi) trong trường hợp chính của chúng tôi và từ đó thực hiện các thủ tục được lưu trữ này từ xa. Tôi đã thử sử dụng các công việc của SQL Server Agent, nhưng nó yêu cầu một số cấu hình tôi không thoải mái khi thực hiện và có lẽ sẽ không có quyền truy cập nào.

Có cách nào để thực hiện từ xa một thủ tục được lưu trữ, tốt nhất là sử dụng máy chủ được liên kết không?

Chỉnh sửa: chúng ta có thể sử dụng máy chủ được liên kết openrowset, bất cứ thứ gì có thể chạy bên trong SQL đơn giản. Tôi không muốn sử dụng SSIS, vì làm như vậy sẽ tách một phần của quy trình khỏi SQL đơn giản và yêu cầu nhiều nền tảng để chạy nó.

Câu trả lời:


16

Giả sử thủ tục sống trên máy chủ từ xa: bạn đã thử sử dụng lệnh EXECUTE AT chưa?

DECLARE @RunStoredProcSQL VARCHAR(1000);
SET @RunStoredProcSQL = 'EXEC [Database].[dbo].[StoredProcName]';
--SELECT @RunStoredProcSQL --Debug
EXEC (@RunStoredProcSQL) AT [LinkedServerName];
Print 'Procedure Executed';

Đó là những gì tôi đã sử dụng thành công trong quá khứ. Tôi thường bao quanh khai báo / thực thi trong một lần thử chỉ trong trường hợp, nhưng nó hiện đang hoạt động trên hệ thống của tôi mỗi giờ.


Giải pháp của bạn là hoàn hảo và là giải pháp duy nhất mà tôi đã tìm thấy hoạt động. Tuy nhiên, điều này là vô cùng lộn xộn và Microsoft nên tự xấu hổ vì đã để điều này là cách chính xác để làm điều đó.
Mèo phẳng

1
Hahaha cảm ơn @FlatCat! Thành thật mà nói tôi không đồng ý với bạn. Lý do tôi sử dụng phương pháp này khi lần đầu tiên phát hiện ra nó là vì tôi muốn xóa dữ liệu PII khỏi máy chủ (Express) không có SQL Agent. Tôi cũng không muốn máy chủ lập lịch trình có bất kỳ khả năng hiển thị nào về dữ liệu hoặc thủ tục, vì vậy việc này đã kết thúc.
MguerraTorres

1

Nghe có vẻ như một công việc cho SSIS. Thiết lập gói SSIS và sử dụng Execute SQL Taskđể thực hiện các thủ tục được lưu trữ của bạn. Sau đó, bạn có thể thực thi các gói SSIS thông qua các công việc Đại lý.


Có, tôi muốn không sử dụng SSIS. Chỉ sử dụng SQL đơn giản.
Hikari

1
Bạn sẽ có thể tạo một máy chủ được liên kết với quyền để thực hiện các thủ tục được lưu trữ sau đó. Chỉ cần đảm bảo rằng tài khoản mà bạn tạo, có quyền thực thi trên máy chủ đích.
Arthur D

0

Tôi tìm thấy chủ đề này khi tìm kiếm "thực hiện thủ tục trên máy chủ được liên kết". nhưng yêu cầu của tôi là chạy cùng một quy trình có sẵn trong nhiều máy chủ và tôi đã đưa ra các cách sau có thể giúp bạn hoặc những người dùng khác:

Để trả lời câu hỏi của bạn theo cách đơn giản hơn: sử dụng tên 4 phần để thực hiện truy vấn từ xa: Exec ('linkedservername.DBName.dbo.ProcedureName') ;

Truy vấn sau có thể được sử dụng để thực thi thủ tục tại máy chủ được liên kết (không giới hạn ở một) nhắm mục tiêu đến nhiều máy chủ được liên kết có sẵn trong máy chủ trung tâm (nơi tập lệnh này chạy từ):

 Declare @TargetServers table (LinkedServer nvarchar(50));
 Declare @LinkedServer  varchar(50);

 Insert into @TargetServers 
 select [data_source] from sys.servers where is_linked = 1 and [Provider] = 'SQLNCLI';

 While exists (select * from @TargetServers) 
     begin
         set @LinkedServer = (select top 1 name from sys.servers where is_linked = 1);

         Exec ('['+@LinkedServer + '].DBAClient.dbo.ProcessUnusedIndexInfo') ;
         if @@ERROR = 0
         delete from @TargetServers where LinkedServer = @LinkedServer;
     end
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.