【发布时间】:2022-04-13 03:54:00
【问题描述】:
我收到错误消息:
自从您开始编辑此记录后,其他用户已对其进行了更改。如果您保存记录,您将覆盖其他用户所做的更改...
我知道这是一个常见问题,我花了数小时研究和测试,但无济于事。几点说明:
- 我的数据库中没有位域
- 所有表都有一个主键,数据类型 = 身份
- 所有表在更新和插入时都有创建/修改时间戳触发器
我相当肯定,当表单(和多个子表单)正在创建身份字段和/或时间戳触发器时,一定会出现问题。具体来说,当我返回编辑旧的“鱼”(如屏幕截图所示)时,我只会在“个人鱼”表上收到此错误。如果我只是浏览表单而不进行任何编辑,它工作正常。但是如果我需要在之前的“鱼”上编辑任何东西——在身份/触发器触发之后——那么它会给我错误。
我已经完成并在每个表单中添加了If Me.Dirty Then Me.Dirty = False End If,用于以下事件:
On Current, On Load, On Click, After Update, Before Update, Before Insert, On Dirty。
我还将DoCmd.RunCommand acCmdSaveRecord 添加到On Deactivate。我承认我不擅长 VBA,所以我在这里做了一些愚蠢的事情。附上代码。我也搞砸了Record Locks = Edited Record。
到目前为止,似乎没有任何效果。如果您认为我遗漏了什么,请告诉我。另外,如果您对我的数据库设计或其他方面有任何随机的 cmets 或建议,我随时欢迎反馈。
谢谢!
更新:
Albert 的回答让我找到了正确的地方。简短的版本是向所有表添加一个 rowversion(又名时间戳)字段。这在其他几篇文章中提到过,但我没有意识到[可怕的]“时间戳”实际上与日期或时间无关。感谢您的帮助!
]3
【问题讨论】:
-
代码和错误信息应该是有问题的格式化文本,而不是图像。
-
“所有表在更新和插入时都有创建/修改时间戳触发器”是什么意思。表上的触发器是巨大的安装珠穆朗玛峰的问题。绝对惊天动地和巨大巨大的巨大问题。更大更糟糕的是,TS 列不是您设置的值,而是服务器端列,应该被 Redmond 的人们称为 rowversion - (时间戳是这种列的世界上最糟糕的名称类型)。这是时间戳类型的内部二进制行版本列,但您确实意识到此类列的时间为零零零零 - 对吧?
-
那个触发器到底是什么?如果它正在对书面记录进行插入或更新,那就有问题了
-
每个表都有一个“created_date”、“created_user”、“modified_date”和“modified_user”触发器,在插入(创建和修改)和更新(修改)时运行。我删除了这些表上的所有触发器,现在它可以工作了。感谢那。但是现在我不得不问 - 我知道触发器是一个非常冒险/有争议的主题 - 在不使用触发器的情况下让那些“创建日期”“修改日期”字段的最佳方法是什么?我可以不使用它们吗?或者我可以将触发器留在原处,但有人将它们从表单/ODBC 连接中删除?再次感谢您的帮助!
标签: sql-server ms-access