我正在尝试跨两个数据库动态创建多个触发器,但是在切换数据库时我遇到了 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”不允许将数据库名称指定为对象名称的前缀。
有没有动态的方法来解决这个问题?