如何使用Microsoft Access创建自动管理的“上次更新”字段

时间:2008-10-07 12:05:12

标签: ms-access

最初我想问一下是否有一种简单的方法可以使用MS Access提供自动管理的最后更新字段。

经过一些谷歌搜索后,我找到了以下方法:

Private Sub Form_Dirty(Cancel As Integer)

   Me.Last_Update = Date()

End Sub

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

3 个答案:

答案 0 :(得分:3)

此外,添加列验证规则(或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着名的标准“数据绑定表单”方法。

答案 1 :(得分:3)

您也可以将相同的代码放入BeforeUpdate中。

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

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

答案 2 :(得分:2)

这可能是您在具有访问后端的访问数据库上的最佳选择 - 但如果您有一个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
相关问题