DDL触发器,用于在更改项目时将其从复制中删除



使用SQL Server 2008进行跨国复制。

有时,我的团队人员会在开发过程中更改表,然后再从复制中的订阅中删除表。因此,它会导致环境中的复制失败。为了避免这种情况,计划编写一个DDL触发器,当表被更改时,该触发器将从订阅中删除该表。

下面是我写的实现同样目标的触发器。

CREATE TRIGGER RemoveArticleFromRepliction ON DATABASE
FOR DROP_TABLE
, ALTER_TABLE AS
BEGIN
SET NOCOUNT ON;
DECLARE @EventData XML = EVENTDATA();
DECLARE @TableName VARCHAR(255) = @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)')
DECLARE @CMD VARCHAR(255) = 'IF EXISTS (SELECT 1 FROM SYS.TABLES WHERE NAME = ''' + @TableName + ''') EXEC sp_mck_DropSubscriptionArticle ''' + @TableName + ''''
EXEC @CMD
END

触发器已在SQL server 2008中成功应用。

注:sp_mck_DropSubscriptionArticle是一个自定义过程。从订阅中删除文章的逻辑被添加到其中。

当我执行alter语句时,我得到以下错误

Could not find stored procedure 'IF EXISTS (SELECT 1 FROM SYS.TABLES WHERE NAME = 'NOTE') EXEC sp_mck_DropSubscriptionArticle 'NOTE''.

请帮助我解决这个问题或建议我任何其他方法来解决这个问题

看起来缺少EXEC后面的括号。请尝试以下更改后的代码

CREATE TRIGGER RemoveArticleFromRepliction ON DATABASE
FOR DROP_TABLE
, ALTER_TABLE AS
BEGIN
SET NOCOUNT ON;
DECLARE @EventData XML = EVENTDATA();
DECLARE @TableName VARCHAR(255) = @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)')
DECLARE @CMD VARCHAR(255) = 'IF EXISTS (SELECT 1 FROM SYS.TABLES WHERE NAME = ''' + @TableName + ''') EXEC sp_mck_DropSubscriptionArticle ''' + @TableName + ''''
EXEC (@CMD)
END

最新更新