這可能是有點邪惡,但在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
)
是否必須立即發生?你可以通過工作來做到這一點。 – SQLChao
@JChao也許是一個愚蠢的問題,但他們再次說,沒有問題是愚蠢的:)....一份工作要做什麼? –
仔細想想你是否想這樣做。觸發器在原始事務的上下文中運行。如果'DB2'暫時不可用,那麼您是否希望這一事實阻止您在'DB1'中創建對象?通常情況下,答案是否定的,這就是爲什麼通常,建議是觸發器不應該訪問自己數據庫之外的任何東西。 –