【问题标题】:sql server trigger to update another database whenever a sproc is created每当创建 sproc 时,sql server 触发器都会更新另一个数据库
【发布时间】:2014-07-17 00:02:37
【问题描述】:

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

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

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

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

    AS
    BEGIN
        ...something 

    END

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

感谢您的帮助!

【问题讨论】:

  • 必须立即发生吗?你可以通过工作做到这一点。
  • @JChao 可能是一个愚蠢的问题,但他们再次说没有问题是愚蠢的 :).... 一份工作做什么?
  • 仔细考虑是否要这样做。触发器在原始事务的上下文中运行。如果DB2 暂时不可用,您是否希望该事实阻止您在DB1 中创建对象?通常,这个问题的答案是否定的,这就是为什么通常建议触发器不应该访问它们自己的数据库之外的任何东西。

标签: sql sql-server database triggers


【解决方案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) 创建过程会发生什么

【讨论】:

  • 干杯戴夫,我知道有一个带有事件 CREATE_PROCEDURE 的 DDL 触发器,但不知道如何获取触发触发器的实际事件的 DDL 文本/查询。将对此进行调查。 :) + 1 教我一些新东西 :)
  • @M.Ali 哈哈我几个月前碰巧遇到了这个,但我仍然认为它有点邪恶,并且更喜欢使用 DDL 触发器进行审计、安全等。
  • 是的,我使用 DDL 触发器来防止意外的表/数据库丢失,但从来没有用 DDL 触发器做过这种事情,只是告诉你有多少要学习:)
【解决方案2】:

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

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

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

【讨论】:

  • 在哪里可以找到发布向导?我在我的 sql server 中找不到它。不确定这是否是由于权限问题。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2011-02-10
相关资源
最近更新 更多