【问题标题】:How to create an automatically managed "last update" field with Microsoft Access如何使用 Microsoft Access 创建自动管理的“上次更新”字段
【发布时间】:2010-09-15 17:49:02
【问题描述】:

最初我想问是否有一种简单的方法可以通过 MS Access 提供自动管理的上次更新字段。

经过一番谷歌搜索,我发现了以下方法:

Private Sub Form_Dirty(Cancel As Integer)

   Me.Last_Update = Date()

End Sub

这似乎可以完成这项工作。我想我也会与其他人分享(如果有人有一些值得考虑的优点,请随时分享)

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    您也可以将相同的代码放入更新前。

    不同之处在于 OnDirty 会在您第一次开始编辑记录时标记该记录;而 BeforeUpdate 将在记录提交到数据库之前对其进行标记。

    如果您的用户开始编辑记录、参加会议并在一小时后完成编辑,则后者可能更可取。

    【讨论】:

    • BeforeUpdate 肯定是要使用的正确事件,而不是 OnDirty。
    【解决方案2】:

    此外,添加列验证规则(或CHECK 约束)以确保在更新表时更新“时间戳”列,而不是通过您的表单。 SQL DLL(ANSI-92 查询模式语法)看起来像这样:

    CREATE TABLE MyTable 
    (
       key_col INTEGER NOT NULL UNIQUE, 
       data_col INTEGER NOT NULL
    )
    ;
    ALTER TABLE MyTable ADD
       my_timestamp_col  DATETIME 
          DEFAULT NOW() 
       NOT NULL
    ;
    ALTER TABLE MyTable ADD
       CONSTRAINT my_timestamp_col__must_be_current_timestamp
          CHECK (my_timestamp_col = NOW())
    ;
    

    使用 Jet 4.0(Access 2007 之前,即从引擎中删除用户级安全性之前)的另一种方法是创建一个“帮助”Jet SQL PROCEDURE(访问术语:使用 SQL 'Action 定义的存储查询对象' 语句,与 SQL SELECT 查询不同)自动更新 'timestamp' 列,然后从表中删除 'update' 权限并在PROC 上授予它们,例如SQL DDL/DCL 类似:

    CREATE PROCEDURE MyProc 
    (
       arg_key INTEGER, 
       arg_new_data INTEGER
    )
    AS 
    UPDATE MyTable
       SET data_col = arg_new_data, 
           my_timestamp_col = NOW()
     WHERE key_col = arg_key
    ;
    REVOKE UPDATE ON MyTable FROM PUBLIC
    ;
    GRANT UPDATE ON MyProc TO PUBLIC
    ;
    

    这里的优点是所有更新都必须通过PROC,因此在开发人员的控制之下;缺点是 Access/Jet SQL 是您的表单还必须使用 PROC,这意味着范式转变远离了 Access 著名的标准“数据绑定表单”方法。

    【讨论】:

    • 我对这个答案感到非常困惑。您是在回答 Jet 后端还是 SQL Server?如果是 Jet,那么就没有触发器或存储过程,您必须使用表单级事件来标记记录(事实上,这非常有效)。
    • 我的答案是纯 Access/Jet/ACE,所有代码都是 ANSI-92 Query Mode Jet 4.0 语法,试试吧;-) Jet 确实有 PROCEDURE 语法。我的观点是,您实际上并不需要使用 Access 表单来实现 ACE/Jet 中的时间戳。
    • Here's a link CREATE PROCEDURE 的 Access2003 帮助。
    【解决方案3】:

    这可能是您在具有访问后端的访问数据库上的最佳选择 - 但如果您有一个 MS-SQL 后端,请在表上放置一个更新触发器,以便无论编辑来自何处,您都可以捕获编辑来自。

    CREATE TRIGGER [Table_stampUpdates] ON [dbo].[Table]
     FOR Update 
    AS 
    BEGIN 
    UPDATE Table
    SET 
    modified_by = right(system_user, len(system_user) - charindex('\', system_user)), modified_on = getdate() 
    FROM Table inner join inserted on Table.PrimaryKey = Inserted.PrimaryKey
     END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      相关资源
      最近更新 更多