1

我正在尝试跨两个数据库动态创建多个触发器,但是在切换数据库时我遇到了 Create Trigger 语句的问题

SET @SQL = 'SELECT Name FROM ' + @DB + '.sys.triggers WHERE Name = ' + '''' 
           + @Table + '_DELTATrigger' + ''''
EXEC(@SQL)

IF @@RowCount > 0   
BEGIN
  SET @SQL = 'USE ' + @DB + '; DROP TRIGGER [dbo].[' + @Table + '_DELTATrigger]'
  EXEC(@SQL)
END

SET @SQL = 'CREATE TRIGGER [dbo].[' + @Table + '_DELTATrigger] 
                ON [dbo].[' + @Table + '] 
                AFTER INSERT, UPDATE 
                AS 
                BEGIN 
                  SET NOCOUNT ON 
                  UPDATE [' + @Table + '] 
                  SET [Delta] = 1 
                  FROM inserted 
                  WHERE inserted.[ID] = [' + @Table + '].[ID] 
                END;'               
EXEC (@SQL)

如果我运行此语句,我会收到以下问题

错误 8197,级别 16,状态 4,过程 tblBuild_DataPlate_DELTATrigger,第 1 行
消息:对象“dbo.tblBuild_DataPlate”不存在或对于此操作无效。

更改动态创建触发器以包含 USE 语句不起作用,因为创建触发器必须是第一个语句

SET @SQL = 'USE ' + @DB + '; CREATE TRIGGER [dbo].[' + @Table + '_DELTATrigger]
            ON [dbo].[' + @Table + '] 
            AFTER INSERT, UPDATE 
            AS 
            BEGIN 
              SET NOCOUNT ON 
              UPDATE [' + @Table + '] 
              SET [Delta] = 1 
              FROM inserted 
              WHERE inserted.[ID] = [' + @Table + '].[ID] 
            END;'               
EXEC (@SQL)

Error 111, Level 15, State 1, Procedure -, 
Line 1, Message: 'CREATE TRIGGER' must be the first 
statement in a query batch.

在这种情况下,您无法使用数据库完全限定对象,因为您收到以下错误

错误 166,级别 15,状态 1,过程 -,第 1 行,
消息:“CREATE/ALTER TRIGGER”不允许将数据库名称指定为对象名称的前缀。

有没有动态的方法来解决这个问题?

4

1 回答 1

3

下面的代码将sp_executesql在选定的数据库 (@DB) 上运行,因此,您可以在正确的位置创建触发器:

SET @SQL = 'EXEC ' + @DB + '..sp_executesql N''
CREATE TRIGGER [dbo].[' + @Table + '_DELTATrigger] 
                            ON [dbo].[' + @Table + '] 
                            AFTER INSERT, UPDATE 
                        AS 
                        BEGIN 
                            SET NOCOUNT ON 

                        END;'''               
            EXEC (@SQL)
于 2012-11-29T09:28:57.593 回答