当文章被更改时,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 触发器从复制中删除文章的主要内容,如果未能解决你的问题,请参考以下文章