在MS-Access中,有任何方法可以绕过/覆盖/轻松地临时禁用INSERT SQL语句的数据验证

时间:2018-10-26 01:17:47

标签: sql ms-access

我们有许多表,其中包含许多具有数据验证功能的字段。当发生数据验证错误时,运行SQL插入语句将导入的数据追加到这些表时,它们将失败,并显示非常有用的错误消息:“无法添加27条记录来违反验证规则。”

跟踪这些违规非常耗时,因此我想知道是否有一种方法可以执行以下任何一项操作:

1)查找以编程方式导致验证错误的记录和字段

2)在导入过程中覆盖数据验证,以便人们以后可以浏览表格以查找突出显示的问题

3)禁用然后重新启用具有相同效果的验证(不循环遍历所有列,在保存设置时禁用数据验证,然后在插入循环之后再次对每个列重新启用)。

4)我没有想到的其他建议是因为这里已经过了晚上10:00。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

否,Access不允许禁用或覆盖验证规则。

单独的导入表是最好的选择,它将简化可能性#1和#2。

  • 将目标表结构复制到新表。您可以通过导航面板中的复制(Ctrl + C)和粘贴(Ctrl + V)来完成此操作。
  • 通过删除所有验证规则和约束来更改复制的表定义。
    • 要特别注意目标表的主键。
      • 如果主键是“自动编号”列,请继续并将此列保留在导入表中作为主键。请注意,该值将是一个任意的临时数字,仅用于导入行标识。最终,目标表将被分配一个新的唯一值。
      • 如果主键由有意义的数据列组成,我建议删除主键和唯一约束。而是添加一个仅用于导入的自动编号主键列。
      • 如果没有主键,则可能要考虑添加一个并检查适当的表规范化。像以前一样,至少如上所述添加一个AutoNumber主键。

定义导入过程。可以通过代码/宏将其中某些或全部自动化。

  • 清除现有数据的导入表。
  • 将外部数据导入到导入表中。
  • 将行从导入表复制到永久表。
    • 最简单的方法可能是SQL INSERT INTO语句。在Access Query设计器中,追加查询与INSERT INTO语句相同。
    • 替代方法是使用VBA通过RecordSet对象遍历行。
  • 运行一个或多个比较查询以检测并报告复制操作失败的行。
    • 这假定数据具有一个或多个唯一字段,这些字段可用于彼此区分行,无论是对于导入的数据还是永久表中的现有数据。
      • 如果数据没有标识字段,则唯一可行的选择可能是遍历VBA代码中的RecordSet对象,因为RecordSet可用于选择和操作各个行。但是SQL语句可对整个数据集进行操作,并且依赖于唯一值来区分数据行。
      • 除了验证导入数据的问题外,如果没有单独的身份,人们可能还应该质疑数据行的一般用途和/或有效性。
  • 对于复制操作失败的任何导入行,请执行以下一项或多项操作,以递归方式改进该过程并构建一组可以自动化的验证(查询和/或代码)。
    • 手动检查数据并尝试确定故障原因。
    • 写一个验证查询或一组验证查询,以标识不满足验证规则或永久表约束的导入行。
    • 可能会编写其他查询,这些查询将数据“按摩”到永久表中,或者报告要手动修复或进一步研究的不良数据。