7

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

  • 无法修改表。删除合并复制使用的 rowguid 列上的默认约束是无效的。执行内部复制过程期间架构更改失败。有关纠正措施,请参阅此错误消息随附的其他错误消息。事务在触发器中结束。该批次已中止。

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

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

4

2 回答 2

9

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

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
于 2009-12-16T03:34:59.387 回答
3

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

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

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

动手,改进的性能方法.......

要执行此练习,您需要:

  1. 通过编写整个配置的脚本来备份您的复制环境。
  2. 从发布者/订阅者的复制中删除表
  3. 在每个发布者/订阅者处添加列。
  4. 在每个发布者/订阅者本地应用更新。
  5. 将表重新添加到复制中。
  6. 验证正在复制事务。
于 2009-12-16T07:27:49.787 回答