【发布时间】:2010-09-15 17:49:02
【问题描述】:
最初我想问是否有一种简单的方法可以通过 MS Access 提供自动管理的上次更新字段。
经过一番谷歌搜索,我发现了以下方法:
Private Sub Form_Dirty(Cancel As Integer)
Me.Last_Update = Date()
End Sub
这似乎可以完成这项工作。我想我也会与其他人分享(如果有人有一些值得考虑的优点,请随时分享)
【问题讨论】:
标签: ms-access
最初我想问是否有一种简单的方法可以通过 MS Access 提供自动管理的上次更新字段。
经过一番谷歌搜索,我发现了以下方法:
Private Sub Form_Dirty(Cancel As Integer)
Me.Last_Update = Date()
End Sub
这似乎可以完成这项工作。我想我也会与其他人分享(如果有人有一些值得考虑的优点,请随时分享)
【问题讨论】:
标签: ms-access
您也可以将相同的代码放入更新前。
不同之处在于 OnDirty 会在您第一次开始编辑记录时标记该记录;而 BeforeUpdate 将在记录提交到数据库之前对其进行标记。
如果您的用户开始编辑记录、参加会议并在一小时后完成编辑,则后者可能更可取。
【讨论】:
此外,添加列验证规则(或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 著名的标准“数据绑定表单”方法。
【讨论】:
CREATE PROCEDURE 的 Access2003 帮助。
这可能是您在具有访问后端的访问数据库上的最佳选择 - 但如果您有一个 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
【讨论】: