Необходимо изменить связанные таблицы в БД MS Access с именем пользователя, паролем и системной БД - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть внешняя БД, которая должна быть связана с различными внутренними БД. Чтобы дать вам перспективу, это относится к отдельным файлам MDB. Данное программное обеспечение создает БД для каждой компании.

В данный момент я пишу код в одном из этих файлов MDB.

Для масштабируемости я сейчас создаю новую БД, которая будет ссылаться на каждый MDB через код, и поэтому мои вопросы следующие:

  1. Как изменить местоположение связанной таблицы с помощью кода / VB, чтобы пользователь мог выбрать компанию / БД, над которой он хочет работать

  2. Как мне это сделать, передав имя пользователя и пароль, которые одинаковы для всех компаний / БД

  3. И, как показано ниже, нам необходимо проверить имя пользователя и пароль через systemDB для его успешного открытия.

Как к сведению, именно так мы открываем БД на автономной основе- "C: \ Program Files (x86) \ Microsoft Office \ root \ Office16 \ MSACCESS.EXE" "C: \ temp \ SAMPLE.mdb" / WRKGRP "C: \ ProgramData \ SOFTWARE \ SYSTEM.mdw" / пользователь: имя пользователя / PWD: пароль

1 Ответ

0 голосов
/ 09 ноября 2018

Это вовсе не проблема, и ее абсолютно можно выполнить, если пояснить, что вы используете один файл MDW.

Для пояснения, что Microsoft Access Workgroup Security - это, по сути, "сеансовая" модель безопасности, котораяприменяется непосредственно к внешнему файлу MDB при его открытии.

В вашем примере командной строки означает, что Microsoft Access откроет файл внешнего интерфейса SAMPLE.MDB, используя указанный файл рабочей группы.

Как только Microsoft Access открыл SAMPLE.MDB в этом файле рабочей группы, вы не можете перейти на другой файл рабочей группы в рамках этой «сессии», не закрывая Microsoft Access и не открывая заново в новом файле рабочей группы.

К вашему сведению - этоМожно открыть с помощью кода таблицу в другом MDB, используя другой файл рабочей группы в этом соединении, но таким образом таблицу можно использовать только в коде как RecordSet (например), вы не можете сделать ее связанной таблицей.

В любом случае, вернемся к вашей реальной проблеме.Как связать различный внутренний набор таблиц для каждой компании.

Я бы рекомендовал добавить в вашу таблицу Company несколько полей, которые определяют имя файла и расположение каждого внутреннего файла.Например:

enter image description here

Обратите внимание, что местом может быть путь UNC или сопоставленный путь диска.Или, может быть, вам не нужно явно определять местоположение в таблице.Возможно, все серверные части находятся в одной папке или в определяемом динамическом месте, например \Dallas\Dallas.mdb, \NewYork\NewYork.mdb и т. Д. Если вы можете каким-либо образом определить местоположение каждого серверного модуля, то выхорошо.

Теперь, поскольку у вас, скорее всего, будут «глобальные» интерфейсные таблицы, может быть, также некоторые «глобальные» связанные фоновые таблицы i.e. Common.mdb и ваши фоновые таблицы для вашей компании, я бырекомендуем иметь внешнюю таблицу, которая определяет имя каждой из таблиц, которые включены только в файлы, относящиеся к конкретной компании.Таким образом, мы можем легко циклически проходить только по этим именам таблиц и вносить изменения в ссылки.

enter image description here

Для кода ссылки, скажем, вы запросилиПользователь, для какой компании он хочет, и вы передаете CompanyID функции повторного связывания:

Public Function ChangeCompanyLinks(CompanyID As Long) As Boolean
    Dim db As DAO.Database
    Dim ldb As DAO.Database
    Dim tdf As DAO.TableDef
    Dim rstCompany As DAO.Recordset
    Dim rstTables As DAO.Recordset
    Dim mssql As String
    Dim dbFullPath As String
    Dim retVal As Boolean

    Set db = CurrentDb()
    retVal = False
    mssql = "SELECT * FROM [tblCompany] WHERE [CompanyID] = " & CompanyID
    Set rstCompany = db.OpenRecordset(mssql, dbOpenSnapshot)
    If Not rstCompany.BOF Then
        dbFullPath = rstCompany("DBLocation") & "\" & rstCompany("DBName")
        If Dir(dbFullPath) = rstCompany("DBName") Then
            'NOTE: By opening a temporary constant link to the back-end during
            '      relinking, the relinking runs faster
            Set ldb = OpenDatabase(dbFullPath)
            mssql = "SELECT * FROM [tblLinkedTables] WHERE [FileType] = ""Company"""
            Set rstTables = db.OpenRecordset(mssql, dbOpenSnapshot)
            Do While Not rstTables.EOF
                Set tdf = db.TableDefs(rstTables("TableName"))
                tdf.Connect = ";DATABASE=" & dbFullPath
                tdf.RefreshLink
                rstTables.MoveNext
            Loop
            rstTables.Close
            ldb.Close
            retVal = True
        Else
            MsgBox "Unable to Locate Company File"
        End If
    End If
    rstCompany.Close

    ChangeCompanyLinks = retVal
    Set rstCompany = Nothing
    Set rstTables = Nothing
    Set ldb = Nothing
    Set tdf = Nothing
    db.Close
    Set db = Nothing

End Function

Очевидно, что вы захотите добавить обработку ошибок и немного ее настроить в соответствии с вашей ситуацией,но этот код будет повторно связывать указанные таблицы с новым бэкэндом.

Обратите внимание, что если вы в конечном итоге измените использование своих бэкэнд-таблиц в SQL Server (что я настоятельно рекомендую),код ссылки должен быть немного изменен.См. этот ответ для более подробной информации.

...