2014-07-17 40 views
0

有沒有辦法在主數據庫中創建存儲過程時使用新創建的存儲過程更新另一個數據庫?無論何時創建存儲過程,sql服務器觸發器都會更新另一個數據庫

例如,我有兩個數據庫,DB1和DB2。

當我在DB1中創建存儲過程時,我想要自動在DB2中創建相同的過程?有沒有觸發器可以做到這一點?

USE [DB1] 
    CREATE PROCEDURE [dbo].[TestSproc] 
     ..something 

    AS 
    BEGIN 
     ...something 

    END 

我知道一個使用[DB2]語句將完成這項工作,但我希望這個工作能夠自動完成。任何想法?

感謝您的幫助!

+1

是否必須立即發生?你可以通過工作來做到這一點。 – SQLChao

+0

@JChao也許是一個愚蠢的問題,但他們再次說,沒有問題是愚蠢的:)....一份工作要做什麼? –

+0

仔細想想你是否想這樣做。觸發器在原始事務的上下文中運行。如果'DB2'暫時不可用,那麼您是否希望這一事實阻止您在'DB1'中創建對象?通常情況下,答案是否定的,這就是爲什麼通常,建議是觸發器不應該訪問自己數據庫之外的任何東西。 –

回答

0

對於這一點,除非你想每個目標數據庫上執行兩次相同的語句,一旦沒有簡單的解決方案,

是我腦海

的一件事是,你可以設置複製,只發布存儲過程的第二個數據庫在這種情況下將成爲用戶。

以下是您希望將哪些對象發送到輔助數據庫的窗口。

enter image description here

+0

你在哪裏找到發佈嚮導?我無法在我的sql服務器中找到它。不知道這是否是由於權限問題。 –

1

這可能是有點邪惡,但在SQL Server,你可以創建DDL觸發器其火,當你創建/修改/刪除表/程序等以火語法時創建的過程是:

CREATE TRIGGER <proc-name> 
ON DATABASE 
FOR CREATE_PROCEDURE 
AS 

--Your code goes here 

在DDL觸發器中,您可以訪問名爲EVENTDATA的對象。因此,要獲得您所創建的過程的文本:

SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 

現在,所有你需要做的就是保持這種價值並在輔助數據庫執行它。因此,您的查詢就會成爲這樣的事情,雖然我離開了代碼來更新輔助數據庫到你,因爲我不知道這是否是在同一臺服務器上,鏈接服務器等:

CREATE TRIGGER sproc_copy 
ON DATABASE 
FOR CREATE_PROCEDURE 
AS 

DECLARE @procedureDDL AS NVARCHAR(MAX) = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 

--Do something with @procedureDDL 

由於這不是測試過,可能有一些陷阱。例如,如果您使用全名創建過程會發生什麼(CREATE PROC server.database.schema.proc

+0

乾杯戴夫,我知道有一個事件CREATE_PROCEDURE的DDL觸發器,但不知道如何獲得觸發觸發器的實際事件的DDL文本/查詢。將研究這一點。 :) + 1教我新東西:) –

+0

@ M.Ali哈哈我剛好在幾個月前碰到過這個,我仍然認爲這有點邪惡,但寧願使用DDL觸發器進行審計,安全等。 – DavidG

+0

是的,我使用了DDL觸發器來防止意外的表/數據庫丟棄,但是從來沒有用DDL觸發器做過這種事情,只是告訴你需要學習多少東西:) –

相關問題