【问题标题】: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 万次更新,而不是通常认为的单个更新语句。

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

      要进行此练习,您需要:

      1. 通过编写整个配置的脚本来备份您的复制环境。
      2. 从复制中删除表 发布者/订阅者
      3. 在每个 发布者/订阅者。
      4. 在每个本地应用更新 发布者/订阅者。
      5. 将表重新添加到复制中。
      6. 验证交易正在 已复制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-31
        • 1970-01-01
        相关资源
        最近更新 更多