代码之家  ›  专栏  ›  技术社区  ›  Dale

更改列约束空/非空=rowguid复制错误

  •  7
  • Dale  · 技术社区  · 15 年前

    我有一个数据库在带有合并复制的SQL Server 2005下运行。我想将一些FK列更改为“非空”,因为它们应该总是有一个值。但SQL Server不允许我这样做,它是这样说的:

    • 无法修改表。删除默认约束无效 在使用的rowguid列上 合并复制。模式更改 内部执行期间失败 复制过程。用于纠正 操作,请参阅其他错误消息 伴随此错误消息。这个 事务在触发器中结束。这个 批处理已中止。

    我根本不想更改rowguid列上的约束,只想更改另一个充当fk的列上的约束。我希望将其他列设置为非空,因为没有该信息(即,在客户上,客户名称)记录就没有任何意义。

    问题: 是否有一种方法可以将列更新为“非空”,而不关闭复制,然后再次将其打开? 这甚至是实现这一点的最佳方法吗?我应该使用约束吗?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Dale    15 年前

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

    ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
    
        2
  •  3
  •   John Sansom    15 年前

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

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

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

    实际操作,改进性能的方法……

    要执行此练习,您需要:

    1. 通过编写整个配置的脚本来备份复制环境。
    2. 从处的复制中删除表 两个发布者/订阅者
    3. 在每个位置添加列 发布服务器/订阅服务器。
    4. 在每个本地应用更新 发布服务器/订阅服务器。
    5. 将表重新添加到复制中。
    6. 验证正在进行的事务 复制。