发布脚本编写后,SQL Server在某些表上合并复制和垂直分区

问题描述 投票:0回答:1

我们有一个数据库,该数据库在添加/删除文章,出版物中复制文章的列方面进行了更改。现在,当我们编写该出版物的脚本时,有几行代码告诉我们有关垂直分区的问题,如下所示:

exec sp_addmergearticle @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @source_owner = N'dbo', @source_object = N'Customer_DELETE_LOG', @type = N'table', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @schema_option = 0x000000000C034FD1, @identityrangemanagementoption = N'none', @destination_owner = N'dbo', @force_reinit_subscription = 1, @column_tracking = N'false', @subset_filterclause = N'', @vertical_partition = N'true', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 0, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'true', @partition_options = 0
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'LOG_DATE', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'LOG_USER', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'COLUMN_NAME', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'ROW_ID', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'ROW_DELETED_VALUE', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'STATEMENT', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'PROCESSED', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'BATCH_ID', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'SERVER_NAME', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'APP_NAME', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'rowguid', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
GO

请注意,这里@vertical_partition = N'true',并且还请注意,我们从来没有至少有意进行任何垂直分区。

现在真正的问题是,当表中有一些计算列,而这些计算列位于表/文章脚本(包括垂直分区)的开头时,处理将跳过这些列!因为这些列是在其引用的列之前添加到复制项目的,因此它们将破坏该sp_mergearticlecolumn语句。避免这种情况(不检查400中的每个语句)是将@vertical_partition = N'true'替换为@vertical_partition = N'false',然后运行整个程序。这将起作用。但是,当您尝试将整个脚本编写成脚本时,这些垂直分区语句将再次出现!为什么?

再说一次:

  1. 垂直分区实际上意味着什么,为什么SQL Server将其添加到复制脚本?
  2. 如何检查表是否垂直分区?

谢谢Dejan

UPDATE

我正在对此进行更深入的研究,并开始自己查看表格并注意到以下内容:

某些表缺少某些索引,例如1,2,3,5->,其中索引4的列可能在某个时间点被删除。会导致这个吗?是否可以使发布脚本过程认为这是一个分区表?如果是这样,则Microsoft开发人员无法正确完成此操作。

sql-server database-replication merge-replication
1个回答
1
投票

“垂直分区实际上意味着什么”

表文章的垂直分区意味着只发布表的特定列,而不发布表的所有列。

SQL Server为什么将其添加到复制脚本中

[最有可能从商品/表格中取消选择/删除的列。您是否可以检查文章属性,是否有未选择/未发布的列?

在脚本方面,您可以通过创建具有@vertical_partition = N'false'的文章,然后通过@operation = N'drop'一列来实现此目的

--no vertical partitioning, all columns of the table are published
exec sp_addmergearticle @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @source_owner = N'dbo', @source_object = N'Customer_DELETE_LOG', @type = N'table', 
@description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @schema_option = 0x000000000C034FD1, @identityrangemanagementoption = N'none', @destination_owner = N'dbo', @force_reinit_subscription = 1, @column_tracking = N'false', @subset_filterclause = N'', 
@vertical_partition = N'false', @verify_resolver_signature = 1, @allow_interactive_resolver = N'false', @fast_multicol_updateproc = N'true', @check_permissions = 0, @subscriber_upload_options = 0, @delete_tracking = N'true', @compensate_for_errors = N'false', @stream_blob_columns = N'true', @partition_options = 0;

--drop/deselect one column from the article
exec sp_mergearticlecolumn @publication = N'secspe_pub', @article = N'Customer_DELETE_LOG', @column = N'LOG_USER', @operation = N'drop', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1;
GO

--if you script the publication anew, it will have article @vertical_partition = N'true' and all columns @operation = N'add' except for the LOG_USER column (which is excluded from publication and does not appear in the script at all)
© www.soinside.com 2019 - 2024. All rights reserved.