【问题标题】:DDL trigger to remove the article from the replication when it is altered当文章被更改时,DDL 触发器从复制中删除文章
【发布时间】: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''.

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

【问题讨论】:

    标签: sql-server-2008-r2 ddl database-trigger transactional-replication


    【解决方案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
    

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2014-04-26
    相关资源
    最近更新 更多