更改列约束为null/not null = rowguid复制错误

7
我有一个运行在 Sql server 2005 上的数据库,使用合并复制。我想将一些 FK 列更改为“非空”,因为它们应该始终具有值。但是 SQL server 不允许我这样做,它说:
无法修改表格。删除 rowguid 列上的默认约束条件(由合并复制使用)是无效的。架构更改在执行内部复制过程中失败。有关纠正措施,请参见随此错误消息一起出现的其他错误消息。事务在触发器中结束。批处理已中止。
我根本没有尝试更改 rowguid 列上的约束条件,只是想更改另一列作为 FK 的列。我希望将其他列设置为“非空”,因为如果没有该信息记录就毫无意义(例如客户的客户名称)。
问题: 是否有方法可以更新列为“非空”,而不必关闭然后再次打开复制? 这是否是最好的方法 - 应该使用约束条件吗?
2个回答

9

显然,SSMS通过删除并重新创建表来进行更改。因此,只需要使用T-SQL语句进行更改即可。

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 

3

您需要以T-SQL语句为脚本,进行表的更改,因为SQL Server Management Studio会尝试删除并重新创建表格,而不仅是简单地添加附加列。

您还需要将新列添加到发布项中。

请注意,以这种方式更改列可能对复制的性能有害。取决于您要更改的表格大小,可能导致大量数据被复制。请考虑一下,尽管可以在单个语句中执行表格修改,但如果影响了100万行,则会在订阅服务器上生成100万个更新,而不是像通常认为的那样只生成一个更新语句。

以下是实用性更强、性能更佳的方法......

执行此操作,您需要:

  1. 通过脚本撰写整个配置来备份复制环境。
  2. 从发布者/订阅者中删除表格。
  3. 在每个发布者/订阅者中添加该列。
  4. 在每个发布者/订阅者上应用更新。
  5. 将表格重新添加到复制中。
  6. 验证正在复制事务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接