当文章被更改时,DDL 触发器将其从复制中删除

DDL trigger to remove the article from the replication when it is altered

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

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

下面是我为实现相同目的而编写的触发器。

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 服务器 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