无法使用用户安全性解密Microsoft Access * .mdb数据库

时间:2014-02-13 20:47:48

标签: sql-server ms-access

我有一个旧的.mdb数据库,其中有许多表/表单/查询和外部连接(在Access 2003中创建),具有用户级安全性。

现在我已决定迁移到SQL Server,但我无法解密数据库(在Access 2010和2013中)以使用Access to SQL工具。

解密过程正在运行但最终我收到错误:“您无法访问此表”。

我试过修理&压缩。

你能帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

据我所知,你没有很多选择:

  • 您可以通过创建新数据库并使用与原始用户完全相同的用户名和PID来重建.mdw文件,然后将新.mdw与旧数据库一起使用。 /> 您可以使用the tools from Serge Gavrilov中的一些来帮助您从数据库中找到用户名和PID。

  • 查看UtterAccess.com上的论坛。似乎有很多关于 lost mdw 的讨论。

  • 您可以使用EverythingAccess之类的数据修复服务。花一些钱,但我相信他们可以恢复你的数据。

一旦您可以访问数据库,您就可以编写代码以从数据库中提取所有表单,查询等。这是我编写的代码片段。您需要大量调整它,因为它基于允许您选择数据库名称的表单。你将不得不为查询,表格等重复这个......

' Database.
Dim dbRep As DAO.Database
Dim dbNew As DAO.Database

' For copying tables and indexes.
Dim tblRep As DAO.TableDef
Dim tblNew As DAO.TableDef
Dim fldRep As DAO.Field
Dim fldNew As DAO.Field
Dim idxRep As DAO.Index
Dim idxNew As DAO.Index

' For copying data.
Dim rstRep As DAO.Recordset
Dim rstNew As DAO.Recordset
Dim rec1 As DAO.Recordset
Dim rec2 As Recordset
Dim intC As Integer

' For copying table relationships.
Dim relRep As DAO.Relation
Dim relNew As DAO.Relation

' For copying queries.
Dim qryRep As DAO.QueryDef
Dim qryNew As DAO.QueryDef

' For copying startup options.
Dim avarSUOpt
Dim strSUOpt As String
Dim varValue
Dim varType
Dim prpRep As DAO.Property
Dim prpNew As DAO.Property
' For importing forms, reports, modules, and macros.
Dim appNew As New Access.Application
Dim doc As DAO.Document

' Open the database, not in exclusive mode.
Set dbRep = OpenDatabase(Forms!CMDB_frmUpgrade.TxtDatabase, False)


' Open the new database
Set dbNew = CurrentDb

DoEvents

' Turn on the hourglass.
DoCmd.Hourglass True

    '********************
    Debug.Print "Copy Tables"
    '********************
If Forms!CMDB_frmUpgrade.CkTables = True Then
    Forms!CMDB_frmUpgrade.LstMessages.addItem "Copying Tables:"

    ' Loop through the collection of table definitions.
    For Each tblRep In dbRep.TableDefs
    Set rec1 = dbRep.OpenRecordset("SELECT MSysObjects.Name FROM MsysObjects WHERE ([Name] = '" & tblRep.Name & "') AND ((MSysObjects.Type)=4 or (MSysObjects.Type)=6)")

    If rec1.EOF Then
      XF = 0
    Else
      XF = 1
    End If

        ' Ignore system tables and CMDB tables.
        If InStr(1, tblRep.Name, "MSys", vbTextCompare) = 0 And _
            InStr(1, tblRep.Name, "CMDB", vbTextCompare) = 0 And _
            XF = 0 Then

            '***** Table definition
            ' Create a table definition with the same name.
            Set tblNew = dbNew.CreateTableDef(tblRep.Name)
            Forms!CMDB_frmUpgrade.LstMessages.addItem "--> " & tblRep.Name & ""

            ' Set properties.
            tblNew.ValidationRule = tblRep.ValidationRule
            tblNew.ValidationText = tblRep.ValidationText

            ' Loop through the collection of fields in the table.
            For Each fldRep In tblRep.Fields

                ' Ignore replication-related fields:
                ' Gen_XXX, s_ColLineage, s_Generation, s_GUID, s_Lineage
                If InStr(1, fldRep.Name, "s_", vbTextCompare) = 0 And _
                    InStr(1, fldRep.Name, "Gen_", vbTextCompare) = 0 Then

                    '***** Field definition
                    Set fldNew = tblNew.CreateField(fldRep.Name, fldRep.Type, _
                        fldRep.Size)

                    ' Set properties.
                    On Error Resume Next
                    fldNew.Attributes = fldRep.Attributes
                    fldNew.AllowZeroLength = fldRep.AllowZeroLength
                    fldNew.DefaultValue = fldRep.DefaultValue
                    fldNew.Required = fldRep.Required
                    fldNew.Size = fldRep.Size

                    ' Append the field.
                    tblNew.Fields.Append fldNew
                    'On Error GoTo Err_NewShell
                End If
            Next fldRep

            '***** Index definition

            ' Loop through the collection of indexes.
            For Each idxRep In tblRep.Indexes

                ' Ignore replication-related indexes:
                ' s_Generation, s_GUID
                If InStr(1, idxRep.Name, "s_", vbTextCompare) = 0 Then

                    ' Ignore indices set as part of Relation Objects
                    If Not idxRep.Foreign Then

                        ' Create an index with the same name.
                        Set idxNew = tblNew.CreateIndex(idxRep.Name)

                        ' Set properties.
                        idxNew.Clustered = idxRep.Clustered
                        idxNew.IgnoreNulls = idxRep.IgnoreNulls
                        idxNew.Primary = idxRep.Primary
                        idxNew.Required = idxRep.Required
                        idxNew.Unique = idxRep.Unique

                        ' Loop through the collection of index fields.
                        For Each fldRep In idxRep.Fields
                            ' Create an index field with the same name.
                            Set fldNew = idxNew.CreateField(fldRep.Name)
                            ' Set properties.
                            fldNew.Attributes = fldRep.Attributes
                            ' Append the index field.
                            idxNew.Fields.Append fldNew
                        Next fldRep

                        ' Append the index to the table.
                        tblNew.Indexes.Append idxNew
                    End If
                End If
            Next idxRep

            ' Append the table.
            dbNew.TableDefs.Append tblNew
        End If
        DoEvents
    Next tblRep

    '********************
    Debug.Print "Copy Data"
    '********************
    ' Loop through the list of table definitions.
    For Each tblRep In dbRep.TableDefs
    Set rec1 = dbRep.OpenRecordset("SELECT MSysObjects.Name FROM MsysObjects WHERE ([Name] = '" & tblRep.Name & "') AND ((MSysObjects.Type)=4 or (MSysObjects.Type)=6)")

    If rec1.EOF Then
      XF = 0
    Else
      XF = 1
    End If

        ' Ignore system tables and CMDB tables.
        If InStr(1, tblRep.Name, "MSys", vbTextCompare) = 0 And _
            InStr(1, tblRep.Name, "CMDB", vbTextCompare) = 0 And _
            XF = 0 Then

            ' Open a recordset for the new table.
            Set rstNew = dbNew.OpenRecordset(tblRep.Name, dbOpenTable)
            ' Open a recordset for the old table.
            Set rstRep = dbRep.OpenRecordset(tblRep.Name, dbOpenTable)

            ' Continue if there are records.
            If Not rstRep.BOF Then

                ' Move to the first record.
                rstRep.MoveFirst

                ' Loop through all the old table records.
                Do Until rstRep.EOF
                    ' Add a record to the new table.
                    rstNew.AddNew
                    ' For each field in the new table, set the value
                    ' to the value in the related field of the old table.
                    For intC = 0 To rstNew.Fields.count - 1
                        rstNew.Fields(intC).Value = _
                            rstRep.Fields(rstNew.Fields(intC).Name).Value
                    Next
                    ' Update the new table.
                    rstNew.Update
                    ' Move to the next old table record.
                    rstRep.MoveNext
                Loop ' rstRep
            End If

            ' Close the new recordset.
            rstNew.Close
            ' Close the old recordset.
            rstRep.Close
        End If
    DoEvents
    Next tblRep

End If