【问题标题】:MS Access trigger?MS Access 触发器?
【发布时间】:2011-08-03 03:59:12
【问题描述】:

我在 MS Access 中有两个名为 [Insert_Record] 和 [Delete_Record] 的表。两张表都有相同的字段,但一张表有记录,而另一张表没有记录。

问题:我希望,每当我从表 [Insert_Record] 中删除任何记录时,整条记录都应自动插入到另一个表中,即:[Delete Record]。

我怎样才能做到这一点?

【问题讨论】:

标签: ms-access triggers


【解决方案1】:

Access 2010 引入了类似于触发器的事件驱动Data Macros。问题中描述的过程可以通过 [Insert_Record] 表上的 After Delete 数据宏轻松完成:

【讨论】:

    【解决方案2】:

    据我了解,Access 没有触发器。

    您可能做的最好的事情就是将这种逻辑放入编辑表格的表单中。换句话说,在表单级别处理删除的事件并将插入逻辑放在那里。

    如果您需要触发器,则需要使用支持它们的适当 RDMS(MySQL、MS SQL、Oracle 等)。

    编辑:另一种方法(可能对您有用也可能不适用)是添加一个布尔列“IsDeleted”。这样,您可以只在逻辑上删除一条记录,而不是将其移动到另一个表中。这种方法的缺点是删除的记录保留在主表中,如果有大量删除,可能会导致性能问题。

    【讨论】:

    • 直到去年你是正确的,但是最新版本的访问(2010)确实有一个接近触发器的东西。由于 OP 没有说明他使用的是什么版本,因此可以安全地假设它是旧版本,因此这不适用。无论如何,这是一个链接blogs.office.com/b/microsoft-access/archive/2009/08/13/…
    • 我想说触发器在这里无关紧要。存在设计错误,即数据存储在两个表中,而应该将它们全部存储在同一个表中,并适当配置一个字段以区分以前存储在不同表中的记录。
    • @David-W-Fenton Soo,添加 IsDeleted 列?
    • 不管你怎么称呼它,无论是布尔值还是可以存储两个以上不同值的字段,是的——你定义每条记录的一个属性来区分以前在多个不同的组表。
    • @David-W-Fenton 这不是设计缺陷。它称为墓碑表,是在需要与外部源同步时跟踪已删除行的常用方法。有人可能会争辩说这些行不属于表,因为它们实际上并不存在。它们只是特定于同步的实现细节。它们当然与表查询的任何结果集无关。您也可以争辩说,在这种情况下,只需要跟踪主键和可能的日期,但我相信保留整行是很常见的。
    【解决方案3】:

    创建一个追加查询,将记录添加到第二个表中,该查询在您用于从第一个表中删除记录的表单的 On Delete Confirm 事件中执行。

    【讨论】:

      【解决方案4】:

      我想这个“删除”是按钮驱动的......

      因此,将按钮编程为首先将记录插入到一​​个表中,然后再删除它。

      只需在删除上方添加插入的 VBA。

      另一种完全消除您对另一个表的需求的方法只是一个布尔列...主动是/否(默认为是。)

      如果是 Active,那么当他们点击删除时它实际上并没有被删除,只需将标志设置为 False,那么实际上什么都不会被删除,不需要 SQL 代码并且没有风险,你甚至可以与更新的用户有一个列它打印在另一列中

         Me.Active = False
         Me.UserName = 'CurrentUser Location here
         Me.RecordSet.Requery
      

      那么就没有实际丢失任何东西的风险,而且你有最后标记它的人的记录。

      在连续表单中,只需添加 Where 标志 Active = True,则不会显示任何错误标志,并且它在用户群中看起来好像它已被删除。

      【讨论】:

        猜你喜欢
        • 2022-09-22
        • 1970-01-01
        • 2013-11-03
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多