Необходимо изменить связанные таблицы в БД MS Access с именем пользователя, паролем и системной БД
У меня есть внешняя БД, которая должна быть связана с различными внутренними БД. Чтобы дать вам представление, это относится к отдельным файлам MDB. Данное программное обеспечение создает БД для каждой компании.
На данный момент я пишу код в одном из этих файлов MDB.
Для масштабируемости я сейчас создаю новую БД, которая будет ссылаться на каждый MDB через код, и поэтому мои вопросы заключаются в следующем
Как изменить местоположение связанной таблицы с помощью кода / VB, чтобы пользователь мог выбрать компанию / БД, над которой он хочет работать
Как мне сделать это с передачей имени пользователя и пароля, которые одинаковы для всех компаний / БД
И, как показано ниже, нам нужно проверить имя пользователя и пароль через 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 (что я настоятельно рекомендую), код перекомпоновки нужно будет немного изменить. Смотрите этот ответ для более подробной информации об этом.