SQL Server快照复制:表创建时出错

时间:2015-08-04 14:44:04

标签: sql-server tsql replication

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

  

选项'FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME'仅在FileTable上使用时有效。从语句中删除选项。 (来源:MSSQLServer,错误号: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. 表已经存在于订阅者身上,我为该文章设置了@pre_creation_cmd = N'delete'。所以我不希望删除并重新创建表。实际上,虽然create table命令无法完成,但表仍然存在于订阅者端。我错过了什么?这个create table命令来自哪里以及为什么?

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

  3. 编辑:好的,我想现在我知道为什么桌子还在那里 - 我在sql server profiler中注意到begin tran

1 个答案:

答案 0 :(得分:2)

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

另一种解决方法是将架构选项设置为而不是复制约束(猜测这将起作用)。如果您需要对订阅者进行约束,则可以尝试在事件发生后手动将其应用于sbuscriber(或者将其编写并使用@post_snaphsot_script)。