use*_*250 4 sql-server-2008 sql-server transactional-replication
我有一个在多个位置复制的数据库。它被设置为事务复制。但是,现在我需要向表中添加更多列。添加更多存储过程等。因此,如果我在发布者中进行更改,它会跨订阅者复制还是会对复制产生负面影响?
建议会很有帮助。
您应该能够按照本文所述进行 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)
将sync_method 更改为“native”。
@replicate_ddl=0
Run Code Online (Sandbox Code Playgroud)默认情况下,@replicate_ddl 设置为 0 “false”,这意味着不会复制任何架构更改。
使用 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' 中,因为它不满足这些条件。