sql server触发器在创建sproc时更新另一个数据库

时间:2014-07-17 00:02:38

标签: sql sql-server database triggers

是否有办法在主数据库中创建存储过程时使用新创建的存储过程更新另一个数据库?

例如,我有两个数据库,DB1和DB2。

当我在DB1中创建存储过程时,我想在DB2中自动创建相同的过程吗?是否有触发器可以做到这一点?

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

    AS
    BEGIN
        ...something 

    END

我知道use [DB2]语句可以完成这项工作,但我希望自动完成。任何想法?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

创建过程会发生什么

答案 1 :(得分:0)

除非你想在每个目标数据库上执行两次相同的语句,否则没有简单的解决方案,

我想到的一件事是,您可以设置复制并仅将存储过程发布到您的第二个数据库,在这种情况下将成为订阅者。

以下是您选择要将数据发送到辅助数据库的对象的窗口。

enter image description here