Stored-Procedures

在本地使用 DDL 執行遠端儲存過程

  • September 26, 2018

抱歉,如果我的問題是多餘的,我在 Stack Exchange 和網際網路上搜尋了幾個小時,但對我的問題沒有明確的答案。

數據庫:SQL Server 2017 + Azure

目標是建構 BI 基礎架構

我有多個(20 多個)數據庫伺服器(客戶端),它們在雲(Azure)中都有一個通用數據庫。當這些客戶端在同一個數據庫版本上時,所有這些客戶端應該完全相同。為了讓更新時的生活更輕鬆(幾乎每週一次,調整),我希望我的 20 多個數據庫能夠自動更新。

我想到了以下解決方案:

  • 我在 Azure DB 中創建了一個具有最新客戶端 DB 版本(例如 v1.2)檢查的表
  • 如果我有更新腳本,我會將其作為儲存過程放在 Azure DB 上。查看
  • 我在客戶端上安排了一項任務,該任務每天檢查一次最新的客戶端數據庫版本並比較是否需要更新。查看
  • 如果是 -> 執行“更新”:這是 Azure DB 上的儲存過程,必須在客戶端 DB 上執行。不好了

在這裡我遇到了麻煩,執行駐留在 Azure DB 上的儲存過程顯然是在 Azure DB 上執行儲存過程。我不知道如何在客戶端數據庫上執行 Azure DB 的儲存過程。

動機:我認為這樣做很聰明,所以我只需要更改儲存過程的內容,所有客戶端都會在與 Azure DB 建立連接時自行更新。

另外,這是解決這個問題的正確方法嗎?任何幫助深表感謝!

如果您需要更多資訊,請告訴我。

如果不進行調整,我無法訪問 Azure 來驗證這一切是否正常,但您可以嘗試以下方法。

以下是有關創建與 Azure 的連結伺服器的一些資訊,可能會對您有所幫助 - 我尚未測試該部分 - https://stackoverflow.com/a/41145784

在 Azure 上,創建包含要在每台客戶端電腦上執行的命令的儲存過程。我的範例只是創建一個TestUpdateTable並插入目前時間戳。我相信您的儲存過程會涉及更多。

drop procedure if exists [dbo].[UpdateClient];
go
create PROC [dbo].[UpdateClient]
AS
begin transaction
drop table if exists dbo.TestUpdateTable;
create table dbo.TestUpdateTable (TextCol varchar(max));
insert into dbo.TestUpdateTable(TextCol) 
   select convert(varchar(30),sysdatetime());
commit

在以下範例中,我使用連結伺服器連接到我呼叫的伺服器SqlCompare。我還引用了SCUTILITY在該連結伺服器上呼叫的數據庫。這是我放置中央儲存過程的地方。這模擬了 Azure 中的情況。

在每台客戶端電腦上,執行以下動態 TSQL

Declare @cmd nvarchar(max)

DROP PROCEDURE IF EXISTS dbo.UpdateClient;

SET @cmd = (
       SELECT *
       FROM openquery(SqlCompare, 'exec(''use scutility;select object_definition(object_id(''''dbo.UpdateClient''''))'')')
       )

PRINT @cmd

EXEC (@cmd)
GO

目的是首先刪除現有的本地客戶端UpdateClient儲存過程。然後通過使用檢索 Azure 儲存過程的文本定義object_definition並將結果放入變數 ( @cmd)。發布將在每個客戶端本地EXEC (@cmd)創建遠端儲存過程。

UpdateClient現在,在客戶端機器上本地執行儲存過程。

EXEC dbo.UpdateClient

儲存過程的執行UpdateClient剛剛創建了表並TestUpdateTable用目前時間戳填充了它。同樣,您的儲存過程將涉及更多。

現在,您可以select * from TestUpdateTable在客戶端機器上發出問題,您應該會得到結果

引用自:https://dba.stackexchange.com/questions/218522