SQL 服务器快照复制:table 创建时出错

SQL Server snapshot replication: error on table creation

我收到以下错误(来自复制监视器):

The option 'FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME' is only valid when used on a FileTable. Remove the option from the statement. (Source: MSSQLServer, Error number: 33411)

尝试的命令是:

CREATE TABLE [dbo].[WP_CashCenter_StreamLocationLink]( [id] [bigint] NOT NULL, [Stream_id] [int] NOT NULL, [Location_id] [numeric](15, 0) NOT NULL, [UID] [uniqueidentifier] NOT NULL ) WITH ( FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME=[UC_StreamLocation] )

现在,对我来说,这里有两件事不清楚。

  1. Table 已存在于订阅者中,我已为文章设置 @pre_creation_cmd = N'delete'。所以我不希望 table 被删除并重新创建。事实上,table 仍然存在于订阅者端,尽管 create table 命令未能完成。我错过了什么?这个 create table 命令来自哪里,为什么?

  2. 我不明白为什么这个 FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME 选项会出现在创建脚本中。我尝试在 SSMS 中从 table 生成 create table 脚本,事实上,它就在那里。但奇怪的是,我无法以这种方式删除并重新创建 table - 我收到了完全相同的错误消息。

编辑:好的,我想现在我知道为什么 table 仍然存在 - 我在 sql 服务器分析器中注意到 begin tran

如果发布者上的 table 确实未定义为 FileTable,则问题与名为 "Stream_id" 的列有关。我相信 SQL 2012 中存在一个已知问题,如果您有一个名为 "Stream_id" 的列,这是为 FileTable/FileStream 保留的,它会自动添加该约束,不幸的是会破坏复制.此处的解决方法是将列重命名为 "Stream_id" 以外的名称。

另一种解决方法是将架构选项设置为not复制约束(猜测这会起作用)。如果您需要对订阅者进行限制,您可以尝试在事后手动将它们应用到订阅者上(或编写脚本并使用@post_snaphsot_script)。