事务复制更改表和添加存储过程

use*_*250 4 sql-server-2008 sql-server transactional-replication

我有一个在多个位置复制的数据库。它被设置为事务复制。但是,现在我需要向表中添加更多列。添加更多存储过程等。因此,如果我在发布者中进行更改,它会跨订阅者复制还是会对复制产生负面影响?

建议会很有帮助。

Kin*_*hah 7

您应该能够按照本文所述进行 DDL 更改。

对发布数据库进行架构更改

确保您不使用 SSMS。仅使用 T-SQL。

如何:复制架构更改(复制 Transact-SQL 编程) 为@property 指定replicate_ddl 值,为@value 指定值1。

EXEC sp_changepublication 
@publication = N'publication_name', 
@property = N'replicate_ddl', 
@value = 0;
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想避免重新初始化订阅,以下是您需要注意的事项。

@sync_method=N'character'
Run Code Online (Sandbox Code Playgroud)
  1. 编写复制脚本并查找 sp_addpublication --- @sync_method=N'character'
  2. 如果 sync_method 是“character”并且您向发布添加一列,它将生成一条消息并要求重新初始化订阅。
  3. 将sync_method 更改为“native”。

    @replicate_ddl=0
    
    Run Code Online (Sandbox Code Playgroud)
  4. 默认情况下,@replicate_ddl 设置为 0 “false”,这意味着不会复制任何架构更改。

  5. 将值更改为 1 “True”将允许对发布者所做的更改传播给订阅者(如下图所示)。

使用 T-sql:

EXEC sp_changepublication @publication='kin_test_Trepl'
    ,@property='sync_method'
    ,@value='native'
-- sync_method = native ==> this will not reinitialize subscribers
-- sync_menthod = character ==> this will generate below message:
--DDL replication is forcing reinitialization because either publication'kin_test_Trepl' uses character mode bcp, or timestamp/identity column is being replicated as base type only for article 'numbers'.
--Reinitialized subscription(s).
GO

EXEC sp_changepublication @publication='kin_test_Trepl'
    ,@property='replicate_ddl'
    ,@value=1
-- 1 = allow ddl changes to be replicated to subscribers
-- 0 = DO NOT propogate ddl changes to subscribers
GO
Run Code Online (Sandbox Code Playgroud)

然后我们可以将列添加到复制的表中,如下所示:

e.g: ALTER TABLE numbers ADD comment varchar(200)
Run Code Online (Sandbox Code Playgroud)

请注意,该列可以为。如果它不为空,则会产生以下错误:

消息 4901,级别 16,状态 1,第 1 行 ALTER TABLE 只允许添加可以包含空值或指定 DEFAULT 定义的列,或者添加的列是标识或时间戳列,或者如果前面没有列条件满足表必须为空以允许添加此列。列 'comment' 不能添加到非空表 'numbers' 中,因为它不满足这些条件。