最初我想问一下是否有一种简单的方法可以使用MS Access提供自动管理的最后更新字段。
经过一些谷歌搜索后,我找到了以下方法:
Private Sub Form_Dirty(Cancel As Integer)
Me.Last_Update = Date()
End Sub
这似乎可以完成这项工作。我以为我也会和其他人分享(如果有人有一些应该考虑的优点,请随时分享)
答案 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