通过 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中,窗体有哪几种视图?如何切换?

来自 Access 的 Excel VBA SQL 没有结果

通过 Access 2013 VBA 编辑后无法打开 Excel 2013 文件

通过用户窗体将数据插入新行 - Excel Vba

在 Access 的子窗体中插入空白行

C# WPF制作窗体特效问题