【问题标题】:The schema update is terminating because data loss might occur架构更新正在终止,因为可能会发生数据丢失
【发布时间】:2013-02-08 20:51:12
【问题描述】:

我经常遇到这个错误,这通常是由我在Lightswitch 中构建应用程序时犯的一些错误引起的。它通常与关系相关联。在发布应用程序并看到错误之前,我通常会继续前进并做很多事情。到这个时候,很难计算出我做错了什么。有没有办法追溯这个错误以查看我需要在表格中更改什么?

Net SqlClient 数据提供者:消息 50000,级别 16,状态 127,第 6 行 检测到行。由于数据丢失,架构更新正在终止 可能会发生。

谢谢。

【问题讨论】:

    标签: sql-server visual-studio-lightswitch


    【解决方案1】:

    当项目发布失败并出现以下错误时 '模式更新正在终止,因为可能会发生数据丢失'

    右击项目 -> 发布 点击高级, 在常规选项卡中 -> 选中“如果可能发生数据丢失,阻止增量部署”, 在拖放选项卡中 -> 将对象拖放到目标而不是源中 比点击确定发布

    注意:有时当上述方法不起作用时,请尝试:“取消选中”阻止增量部署和发布

    【讨论】:

    • 我在 SqlSchemaCompare 选项卡的堵塞物上找到了这个设置
    【解决方案2】:

    当您(在表设计器中)对实体的属性所做的更改会导致已发布数据库中的实体表被删除并重新创建,并且表中包含数据时,就会发生此错误。这正是 SQL Server 的工作方式,它不受 LightSwitch 的控制。但是,LightSwitch 会谨慎行事,并且不允许进行可能导致任何数据丢失的操作。

    可能触发这种情况的类型有:

    • 重命名属性
    • 将其从需要更改为不需要
    • 更改属性的数据类型
    • & 甚至(如果我没记错的话)改变 position 的 属性列表中的属性

    但是,您可以将属性添加到属性列表的末尾,而不会触发表被删除和重新创建。

    在尝试发布应用程序之前进行太多更改确实不是一个好主意,这正是您建议的原因 - 最终不知道您做了什么。您特别希望在对实体的属性进行任何更改后发布。即使您只是发布到开发计算机上的本地 SQL Server 实例(包括 SQL Express),也要在发布到生产服务器之前“测试”您的更改。

    我解决这个问题的方法(当我过去仍然习惯使用 LS 的内在数据时,ApplicationData - 我现在使用附加的数据源)是手动更改数据库本身中的列,使用类似的东西SSMS(SQL Server 管理工作室)。然后,您可以决定允许(潜在的)数据丢失。尽管您更改了什么,但要非常小心,并确保它与您在 LightSwitch 中对属性所做的更改相同。当然,在对其进行任何更改之前备份数据库。如果您导致数据库与 LightSwitch 不同步,您将遇到重大问题。

    【讨论】:

    • 嗨,Yann,你是说没有办法将错误的根源追溯到导致它的属性?
    • 我不知道,不。这就是为什么我说总是在对属性进行任何更改后立即发布。如果您的数据无关紧要,您可以删除数据库,并在下次发布时重新创建它。如果您的数据很重要,您可能需要根据数据库中的表手动检查 LightSwitch 表。
    • 嗨 Yann,数据很重要。通过对照数据库检查 Lightswitch 表,我不太可能找到问题所在。但是,我可以在如此令人反感的更改之前从备份中恢复数据库。我可以这样做并删除 Lightswitch 中 SQL 发现如此令人反感的新表吗?
    • 嗨 Yann,数据很重要。通过对照数据库检查 Lightswitch 表,我不太可能找到问题所在。但是,我可以在更改之前从备份中恢复数据库。我可以这样做并删除 Lightswitch 中 SQL 发现如此令人反感的新表/属性吗?这些问题太严重了,我想知道为什么 MS 没有从一开始就阻止这些变化的发生。我花了很多时间来解决这个问题,包括每隔几分钟发布一次。不够频繁。谢谢
    • 另外,我可以启动一个新应用程序并将其附加到现有数据库吗?正如您所说,假设 SQL 和 LS 不同步,我正试图找出摆脱这种混乱的最佳方法。从备份中恢复 SQL?如果我恢复 SQL 数据库,我如何确定当前的 LS 应用程序会匹配它?
    【解决方案3】:

    错误消息中有一个提示问题的项目。例如,在上面的错误消息 [Msg 50000, Level 16, State 127, Line 6] 中,第 6 行指的是 .publish.sql 文件中的行号,它是构建的一部分。该文件可以在项目的 /bin/Debug 子目录中找到。由于是文本文件,你可以用任何文本编辑器或VS2012打开文件查看文件,找到出错的行号。

    在我的特定问题中,我删除了一个不再需要的列。在生成的 .publish.sql 文件中,我能够找到检查我正在更改的表中的行的 IF EXISTS 行。由于我知道这个更改不会破坏我关心的数据,所以我只是将 VS2012 中的 IF EXISTS 行注释掉,然后再次执行脚本。改变按计划进行。

    请注意:此建议优先于保护您的数据的安全防护措施。仅在您感觉舒适时才进行此更改。 *

    【讨论】:

    • 我遇到了同样的错误,因为我在现有表中添加了一个具有 NOT NULL 条件的新字段。现有记录是否包含 NULL 并不重要,因为有些进程最终会更新该字段。我评论了代码的“如果存在”部分,但随后我收到了不同的错误消息。 ` --IF EXISTS (select top 1 1 from [dbo].[PROD_WHSE_ACTUAL]) -- RAISERROR (N'Rows were detected. 由于可能发生数据丢失,架构更新正在终止。', 16, 127) WITH NOWAIT ` Next错误消息:`消息 4901,级别 16,状态 1,第 55 行`
    【解决方案4】:

    如果您在 Visual Studio 中比较两个模式。单击数据工具操作菜单中的查看结果。

    在每个错误的上方都会有一条说明导致您的错误的原因。这将为您提供错误详细信息。

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 2021-08-22
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多