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

时间:2009-12-16 02:15:24

标签: sql-server sql-server-2005 constraints ssms merge-replication

我在Sql server 2005下运行了一个带有合并复制的数据库。我想将一些FK列更改为“not null”,因为它们应始终具有值。 SQL服务器不会让我这样做,这就是它所说的:

  
      
  • 无法修改表格。删除默认约束无效   在使用的rowguid列上   合并复制。架构更改   执行内部时失败   复制程序。为纠正   操作,请参阅其他错误消息   伴随此错误消息。该   交易在触发器中结束。该   批次已中止。
  •   

我根本不想改变对rowguid列的约束,只是在另一个充当FK的列上。我想设置的其他列不为null,因为没有该信息(即客户,客户名称)记录没有任何意义。

问题: 有没有办法在不关闭复制然后重新打开它的情况下将列更新为“非空”? 这是否是最好的方法 - 我应该使用约束吗?

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

您需要在T-SQL语句中编写更改脚本,因为SQL Server Management Studio将删除并重新创建表,而不是简单地添加其他列。

您还需要将新列添加到出版物中。

请注意,以这种方式更改列可能会对Replication的性能产生不利影响。根据您要更改的表的大小,可能会导致大量数据被复制。考虑到虽然您的表修改可以在单个语句中执行,但如果100万行受到影响,那么将在订阅服务器上生成100万个更新,而不是通常认为的单个更新语句。

亲自动手,改进表现方法.......

要执行此练习,您需要:

  1. 通过编写整个配置脚本来备份复制环境。
  2. 从复制中删除表 两个出版商/订阅者
  3. 在每个列添加列 发布/订阅。
  4. 在每个地方应用更新 发布/订阅。
  5. 将表格添加回复制。
  6. 验证交易正在进行 复制。