微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过Excel用户窗体编辑Access数据库时跟踪更改创建审计跟踪

如何解决通过Excel用户窗体编辑Access数据库时跟踪更改创建审计跟踪

我正从Excel数据库转移到Access数据库,以支持用户输入。 我有用于添加和更新存储在sharepoint中的Access数据库的excel用户窗体。我想在数据库一个单独的表中跟踪该数据库中的所有更改,以维护审核跟踪以供以后查看。

这是示例更新功能

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

我想在一个单独的表中跟踪更改,如下所示:

enter image description here

我可以轻松地记录“编辑依据”,编辑日期和时间以及新值。我在记录旧值和编辑的参数时遇到麻烦,这些值将成为“文件编号”表中的列名

当我使用Excel作为数据库时,我还使用了“日志更改”功能。这是功能

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和标题来更新审计跟踪表。我似乎无法在这里实现此方法。请帮忙

解决方法

您不应在前端实现审计跟踪之类的功能(用户窗体或数据对象)。这些东西属于后端(数据库)。前端不应该在意数据如何存储以及是否存在审计跟踪的事实。

在数据库上,通常使用一种称为 trigger 的机制。触发器是一种在数据库事件(例如插入或更新命令)的情况下运行的脚本。在这样的触发器中,您可以实现审核跟踪逻辑。

现在在Access中,这些机制的名称不是触发器,而是 data宏,但基本上是相同的想法。我在Access on SO上发现了这个answer about trigger ,它基本上与Microsoft关于data macros的官方文档有关。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。