如何使用EXEC sp_executesql为不同的数据库创建触发器?

时间:2019-04-10 14:04:57

标签: sql-server tsql triggers

我有一个存储过程,该过程为所选数据库复制表,并且需要为此数据库中的每个表创建触发器,以更新重复项。 我写了一个sql命令,该命令应该为数据库创建一个触发器,但是如果通过EXEC sp_executesql @sqlcommand执行,则返回“目标不在当前数据库中”,则该命令不起作用。

我试图通过从MSQL SMS的“更改触发器”模板(例如USE db,go等)中包含标准代码来修复它并执行它,但是它拒绝再次工作,并返回“ GO附近的语法不正确”和“ CREATE TRIGGER必须是查询批处理中的第一条语句。”

命令现在的样子:

SET @sqlcom = CONCAT(
    '   
    USE [', @table_db_name, ']
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TRIGGER [dbo].[UPD_IN_ST', @table_name ,'] 
    ON [', @table_db_name, '].[dbo].[', @table_db_name, @table_name, '] AFTER UPDATE
    AS
    BEGIN   
        DECLARE @UPDTime DateTime
        SET @UPDTime = getdate()    

        SELECT * INTO tmp FROM DELETED
        SELECT * FROM tmp           

        SELECT * FROM tmp   
        UPDATE ', @table_db_name, '.dbo.ReplicaOf', @table_db_name, @table_name, ' 
            SET DateAndTimeOfUpdate = @UPDTime,
                UpdateType = ''Update''  
            FROM ', @table_db_name, '.dbo.ReplicaOf', @table_db_name, @table_name, ', tmp
                WHERE ', @table_db_name, '.dbo.ReplicaOf', @table_db_name, @table_name, '.id = tmp.id
        DROP TABLE tmp
    END')
    PRINT @sqlcom
    EXEC sp_executesql @sqlcom

其中@table_db_name是带有表的数据库的名称。

我尝试在“创建查询”中使用@sqlcom生成的代码,并且效果很好,MSSQL SMS在给定表中为给定数据库创建了一个触发器。 (@sqlcom中的代码):

USE [test]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TRIGGER [dbo].[UPD_IN_STtestunis] 
    ON [test].[dbo].[unis] AFTER UPDATE
    AS
    BEGIN   
        DECLARE @UPDTime DateTime
        SET @UPDTime = getdate()    

        SELECT * INTO tmp FROM DELETED
        SELECT * FROM tmp           

        SELECT * FROM tmp   
        UPDATE test.dbo.ReplicaOftestunis 
            SET DateAndTimeOfUpdate = @UPDTime,
                UpdateType = 'Update'  
            FROM test.dbo.ReplicaOftestunis, tmp
                WHERE test.dbo.ReplicaOftestunis.id = tmp.id
        DROP TABLE tmp
    END

此触发器按预期工作。 因此,我不明白为什么我尝试使用EXEC sp_executesql @sqlcom创建触发器的原因。

0 个答案:

没有答案