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

Posted

技术标签:

【中文标题】当文章被更改时,DDL 触发器从复制中删除文章【英文标题】:DDL trigger to remove the article from the replication when it is altered 【发布时间】:2019-01-13 02:05:08 【问题描述】:

使用 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''.

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

【问题讨论】:

【参考方案1】:

您似乎缺少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

【讨论】:

感谢您的帮助!

以上是关于当文章被更改时,DDL 触发器从复制中删除文章的主要内容,如果未能解决你的问题,请参考以下文章

记录一篇触发器的文章

SQLServer之删除触发器

Oracle数据库中有关触发器问题

将任何员工删除到员工表中时如何构建触发器以复制行

js on绑定事件

当元素被禁用时触发 onmouseover 事件