Необходимо изменить связанные таблицы в БД MS Access с именем пользователя, паролем и системной БД

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

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

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

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

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

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

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

1 ответ

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

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

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

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

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

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

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

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

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

Для кода ссылки, скажем, вы запросили пользователя, для какой компании они хотят, и вы передаете 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 (что я настоятельно рекомендую), код перекомпоновки нужно будет немного изменить. Смотрите этот ответ для более подробной информации об этом.

Другие вопросы по тегам