通过 Excel 用户窗体编辑 Access 数据库时跟踪更改(创建审计跟踪)
Posted
技术标签:
【中文标题】通过 Excel 用户窗体编辑 Access 数据库时跟踪更改(创建审计跟踪)【英文标题】:Track changes (Create Audit Trail) while Editing Access database via Excel Userform 【发布时间】:2020-10-20 09:13:04 【问题描述】:我正在从 Excel 数据库转移到 Access 数据库以支持多用户输入。 我有 excel 用户表单,我用它来添加和更新存储在共享点中的 Access 数据库。我想在数据库中的单独表中跟踪此数据库中的所有更改,以维护审计跟踪以供以后查看。
这是一个示例更新函数:
Sub Edit()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.AutomationSecurity = msoAutomationSecurityLow
Dim cnn As New ADODB.Connection 'dim the ADO collection class
Dim rst As New ADODB.Recordset 'dim the ADO recordset class
Dim dbPath As String
Dim qry As String
dbPath = "Share-point UNC path"
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";Jet OLEDB:Database"
Set rst = New ADODB.Recordset 'assign memory to the recordset
qry = "SELECT * FROM FileNumbers WHERE [File_Number]= '" & EditForm.txtFile.Value & "'"
rst.Open qry, cnn, adOpenKeyset, adLockOptimistic
With rst
.Fields("Archival_id").Value , EditForm.txtArchival.Value
.Fields("Remarks").Value , EditForm.txtRemarks.Value
.Fields("Retention Category").Value , EditForm.cmbRetention.Value
.Update
End With
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub
我想在一个单独的表格中跟踪更改,该表格如下所示:
我可以轻松记录编辑者、编辑日期和时间以及新值。我在记录旧值和编辑的参数时遇到问题,这将是文件编号表中的列名
当我使用 Excel 作为数据库时,我还使用了一个 Log Changes 函数。这是函数:
Sub LogChanges(c As Range, vNew)
With c
sep = IIf(Len(titles) > 0, "; ", "") 'need a separator?
If .Value <> vNew Then
'track the changes
titles = titles & sep & .Parent.Cells(1, .Column).Value 'column titles in Row1
oldValues = oldValues & sep & ValueOrBlank(.Value) 'track old value
newValues = newValues & sep & ValueOrBlank(vNew) 'track new value
.Value = vNew 'update the cell
End If
End With
End Sub
Function ValueOrBlank(v)
ValueOrBlank = IIf(Len(v) > 0, v, "[blank]")
End Function
然后我使用变量、oldValues、newValues 和标题来更新审计跟踪表。我似乎无法在这里实现此方法。请帮忙
【问题讨论】:
【参考方案1】:您不应该在前端(用户表单或数据对象)实现审计跟踪之类的东西。那些东西属于后端(数据库)。前端不应该关心数据是如何存储的以及是否有审计线索。
在数据库中,您通常使用一种称为触发器的机制。触发器是一种在发生数据库事件时运行的脚本,例如插入或更新命令。在这样的触发器中,您可以实现审计跟踪逻辑。
现在在Access中,这些机制的名称不是触发器,而是数据宏,但基本上是相同的想法。我在 SO 上的 Access 中找到了这个answer about trigger ,它基本上链接到微软关于data macros的官方文档
【讨论】:
这种方式的问题是我使用Excel用户表单而不是Access表单来填充数据库。在使用 Userform 编辑数据库时,我找不到任何跟踪更改的解决方案 这就是想法:在您的前端,您发出更新或插入语句。这些并没有真正在客户端执行,它们作为命令发送到后端(Excel 并没有真正更新数据库,它向 Access 发送更新请求)。在那里,触发器应该触发,以便除了您请求的更新之外,还执行其他操作 - 在您的情况下,将旧值和新值写入审计跟踪表中。 我为此找到了一篇很棒的文章:scottgem.wordpress.com/2012/10/18/…非常感谢您的帮助! 由于某种原因,当我从 VBA 用户窗体更新数据库时,没有触发 AfterUpdate 事件。但是当我在数据库中手动更改某些内容时,它工作得非常好。你能帮忙吗?以上是关于通过 Excel 用户窗体编辑 Access 数据库时跟踪更改(创建审计跟踪)的主要内容,如果未能解决你的问题,请参考以下文章
来自 Access 的 Excel VBA SQL 没有结果