【问题标题】:Changing column constraint null/not null = rowguid replication error更改列约束 null/not null = rowguid 复制错误
【发布时间】:2010-12-27 01:54:33
【问题描述】:
我有一个在 Sql server 2005 下使用合并复制运行的数据库。我想将某些 FK 列更改为“非空”,因为它们应该始终具有值。 SQL Server 不会让我这样做,但它是这样说的:
- 无法修改表。删除默认约束无效
在所使用的 rowguid 列上
合并复制。架构更改
在内部执行期间失败
复制过程。用于矫正
操作,查看其他错误消息
伴随此错误消息。这
事务在触发器中结束。这
批次已中止。
我根本没有尝试更改对 rowguid 列的约束,只是在充当 FK 的另一列上。我想将其他列设置为不为空,因为如果没有该信息(即关于客户,客户名称),记录就没有任何意义。
问题:
有没有办法在不关闭复制然后重新打开的情况下将列更新为“非空”?
这甚至是最好的方法吗?我应该改用约束吗?
【问题讨论】:
标签:
sql-server
sql-server-2005
constraints
ssms
merge-replication
【解决方案1】:
显然,SSMS 通过删除表并重新创建它们来对表进行更改。所以只需要使用 T-SQL 语句进行更改。
ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL
【解决方案2】:
您需要在 T-SQL 语句中编写更改脚本,因为 SQL Server Management Studio 会删除并重新创建表,而不是简单地添加额外的列。
您还需要将新列添加到您的出版物中。
请注意,以这种方式更改列可能会损害复制的性能。根据您正在更改的表的大小,可能会导致大量数据被复制。考虑一下,虽然您的表修改可以在单个语句中执行,但如果 100 万行受到影响,那么订阅服务器将生成 100 万次更新,而不是通常认为的单个更新语句。
动手,改进的性能方法.......
要进行此练习,您需要:
- 通过编写整个配置的脚本来备份您的复制环境。
- 从复制中删除表
发布者/订阅者
- 在每个
发布者/订阅者。
- 在每个本地应用更新
发布者/订阅者。
- 将表重新添加到复制中。
- 验证交易正在
已复制。