7

我有一个数据库运行在Sql server 2005合并复制。我想将一些FK列更改为'非空',因为它们应该始终具有值。 SQL服务器将不会让我做,虽然,这是它说:更改列约束空/非空= rowguid复制错误

  • 无法修改表。在 合并复制使用的rowguid列上放置默认约束 是无效的。在执行内部 复制过程期间,模式更改 失败。要纠正 操作,请参阅伴随此错误消息的其他错误消息 。交易在触发器中结束。 批次已被中止。

我不试图改变限制在ROWGUID列可言,仅在与充当FK另一列。我想设置的其他列不为空,因为如果没有这些信息(即客户名称,客户名称),记录就没有任何意义。

问题: 有没有一种方法来更新列是“NOT NULL”而不关闭复制,然后再次打开它? 这是甚至是做到这一点的最佳方式 - 我应该使用约束吗?

回答

8

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

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

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

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

请注意,以这种方式更改列可能会对复制的性能造成不利影响。取决于您正在改变的表的大小,可能导致大量数据被复制。考虑到尽管你的表修改可以在一个语句中执行,但如果有一百万行受到影响,那么将在订阅服务器上生成100万次更新,而不是像通常所想的那样更新单个语句。

上,提高性能的做法手中.......

要执行这项工作,你需要:

  1. 通过脚本您的整个配置备份复制环境。
  2. 从复制中删除表格 发布者/订阅者
  3. 在每个 发布者/订阅者处添加列。
  4. 在每个 Publisher/Subscriber上本地应用更新。
  5. 将表格添加到复制中。
  6. 验证交易是否为 已复制。
相关问题