我在Sql server 2005下运行了一个带有合并复制的数据库。我想将一些FK列更改为“not null”,因为它们应始终具有值。 SQL服务器不会让我这样做,这就是它所说的:
- 无法修改表格。删除默认约束无效 在使用的rowguid列上 合并复制。架构更改 执行内部时失败 复制程序。为纠正 操作,请参阅其他错误消息 伴随此错误消息。该 交易在触发器中结束。该 批次已中止。
我根本不想改变对rowguid列的约束,只是在另一个充当FK的列上。我想设置的其他列不为null,因为没有该信息(即客户,客户名称)记录没有任何意义。
问题: 有没有办法在不关闭复制然后重新打开它的情况下将列更新为“非空”? 这是否是最好的方法 - 我应该使用约束吗?
答案 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万个更新,而不是通常认为的单个更新语句。
亲自动手,改进表现方法.......
要执行此练习,您需要: