Пример программной работы в Access с пользователями и группами
База данных Microsoft Jet позволяет устанавливать защиту с использованием механизма учетных записей пользователей и групп пользователей. По умолчанию, когда создается новая база данных, автоматически создаются две типичные группы пользователей - Admins и Users. Первая из них включает администраторов базы, обладающих максимальными правами, другая - "обычных" пользователей. В специальной системной базе данных Access хранится информация о группах, о пользователях, их именах и паролях. Эта база данных хранится в файле с именем System и расширением - mdw. Обычный путь к этому файлу - "c:\Program Files\Microsoft Office\Offce\system.mdw". Фактический путь можно посмотреть и при необходимости изменить в реестре, где он находится в разделе:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\9.0\Access\Jet\4.0\Engines Параметр, задающий путь, имеет имя SystemDB.
В нижеследующем примере я ввел в дополнение к существующим группам еще две группы - читателей и писателей - с именами, соответственно, Readers и Writers и четырех новых пользователей, входящих по-разному в эти группы. Группам заданы различные права на доступ к таблицам базы данных. Но, прежде чем давать другие пояснения приведу соответствующий программный код:
Public Sub CreateUsersАndGroups() 'Cоздание пользователей и групп Dim myUs(1 To 4) As New User 'учетные записи пользователей Dim myGr(1 To 2) As New Group 'учетные записи групп 'Установить соединение с базой NewDB 'и системной базой данных System.mdw CreateConnectionSystemDB Cat1.ActiveConnection = Con1 'Пользователи myUs(1).Name = "Vladimir" myUs(1).ChangePassword "", "Old111" Cat1.Users.Append myUs(1)
myUs(2).Name = "Nina" Call myUs(2).ChangePassword("", "Best111") Call Cat1.Users.Append(myUs(2))
myUs(3).Name = "Ilya" Call myUs(3).ChangePassword("", "Prim111") Call Cat1.Users.Append(myUs(3))
myUs(4).Name = "Yuly" Call myUs(4).ChangePassword("", "Clev111") Call Cat1.Users.Append(myUs(4))
'Группы myGr(1).Name = "Readers" Call Cat1.Groups.Append(myGr(1)) myGr(1).Users.Append (myUs(1)) myGr(1).Users.Append (myUs(2)) myGr(1).Users.Append (myUs(3)) myGr(1).Users.Append (myUs(4))
myGr(2).Name = "Writers" Call Cat1.Groups.Append(myGr(2)) myGr(2).Users.Append (myUs(1))
'Установление прав Call myGr(1).SetPermissions("Книги", _ adPermObjTable, adAccessSet, adRightRead, adInheritBoth) Call myGr(1).SetPermissions("Заказчики", _ adPermObjTable, adAccessSet, adRightRead, adInheritBoth)
Call myGr(2).SetPermissions("Книги", _ adPermObjTable, adAccessSet, adRightFull, adInheritBoth) Call myGr(2).SetPermissions("Заказчики", _ adPermObjTable, adAccessSet, adRightFull, adInheritBoth)
Call myUs(3).SetPermissions("Заказчики", _ adPermObjTable, adAccessSet, adRightMaximumAllowed, adInheritBoth) End Sub
Прежде всего, хочу обратить внимание на главную особенность работы с объектами User, Group и их коллекциями, когда речь идет о Провайдере Microsoft Jet. При установлении соединения необходимо связаться не только с самой базой данных, но и с системной базой данных. По этой причине вызывается специальная процедура, устанавливающая такое соединение:
Public Sub CreateConnectionSystemDB() 'Создание соединения с базой данных Access - NewDB ' и системной базой данных - System.mdw Dim strConnStr As String If Con1.State = adStateOpen Then Con1.Close 'закрыть соединение
Con1.Provider = "Microsoft.jet.oledb.4.0" Con1.ConnectionString = _ "Data Source=c:\!O2000\DsCd\Ch16\NewDB.mdb;" & _ "Jet OLEDB:System database =" & _ "c:\Program Files\Microsoft Office\Office\system.mdw" 'Открытие соединения Con1.Open End Sub
Заметьте, я задаю специфическое для Провайдера свойство "Jet OLEDB:System database" непосредственно в строке соединения, хотя мог бы это сделать, используя коллекцию Properties.
Возвращаясь к процедуре CreateUsersAndGroups, приведу еще несколько комментариев к ее работе:
- Создание объектов User и Group, присоединение их к коллекциям идет по традиционной схеме.
- Лишь после того, как созданы пользователи и группы, создаются коллекции Users для каждой группы. Заметьте, при этом автоматически будут созданы коллекции Groups для каждого объекта User.
- На последнем шаге я задаю различные права для каждой группы на доступ к таблицам "Книги" и "Заказчики", а также индивидуальные права на работу с таблицей "Заказчики" для одного из пользователей с именем "Ilya".
В заключение пара экранных снимков. Взгляните, как выглядит результаты одного из запросов к системной базе данных, после выполнения процедуры CreateUsersAndGroups:
Рис. 6.11. Результаты запроса к системной базе данных Access
Рис. 6.12. Показ прав доступа к элементам базы данных Access
Конечно, все, что я сделал программно, можно сделать и руками, выбрав пункт меню "Сервис | Защита" и открыв соответствующее окно, например, окно разрешений, показанное на рис. 6.12.
'Группы myGr(1).Name = "Readers" Call Cat1.Groups.Append(myGr(1)) myGr(1).Users.Append (myUs(1)) myGr(1).Users.Append (myUs(2)) myGr(1).Users.Append (myUs(3)) myGr(1).Users.Append (myUs(4))
myGr(2).Name = "Writers" Call Cat1.Groups.Append(myGr(2)) myGr(2).Users.Append (myUs(1))
'Установление прав Call myGr(1).SetPermissions("Книги", _ adPermObjTable, adAccessSet, adRightRead, adInheritBoth) Call myGr(1).SetPermissions("Заказчики", _ adPermObjTable, adAccessSet, adRightRead, adInheritBoth)
Call myGr(2).SetPermissions("Книги", _ adPermObjTable, adAccessSet, adRightFull, adInheritBoth) Call myGr(2).SetPermissions("Заказчики", _ adPermObjTable, adAccessSet, adRightFull, adInheritBoth)
Call myUs(3).SetPermissions("Заказчики", _ adPermObjTable, adAccessSet, adRightMaximumAllowed, adInheritBoth) End Sub
Прежде всего, хочу обратить внимание на главную особенность работы с объектами User, Group и их коллекциями, когда речь идет о Провайдере Microsoft Jet. При установлении соединения необходимо связаться не только с самой базой данных, но и с системной базой данных. По этой причине вызывается специальная процедура, устанавливающая такое соединение:
Public Sub CreateConnectionSystemDB() 'Создание соединения с базой данных Access - NewDB ' и системной базой данных - System.mdw Dim strConnStr As String If Con1.State = adStateOpen Then Con1.Close 'закрыть соединение
Con1.Provider = "Microsoft.jet.oledb.4.0" Con1.ConnectionString = _ "Data Source=c:\!O2000\DsCd\Ch16\NewDB.mdb;" & _ "Jet OLEDB:System database =" & _ "c:\Program Files\Microsoft Office\Office\system.mdw" 'Открытие соединения Con1.Open End Sub
Заметьте, я задаю специфическое для Провайдера свойство "Jet OLEDB:System database" непосредственно в строке соединения, хотя мог бы это сделать, используя коллекцию Properties.
Возвращаясь к процедуре CreateUsersAndGroups, приведу еще несколько комментариев к ее работе:
- Создание объектов User и Group, присоединение их к коллекциям идет по традиционной схеме.
- Лишь после того, как созданы пользователи и группы, создаются коллекции Users для каждой группы. Заметьте, при этом автоматически будут созданы коллекции Groups для каждого объекта User.
- На последнем шаге я задаю различные права для каждой группы на доступ к таблицам "Книги" и "Заказчики", а также индивидуальные права на работу с таблицей "Заказчики" для одного из пользователей с именем "Ilya".
В заключение пара экранных снимков. Взгляните, как выглядит результаты одного из запросов к системной базе данных, после выполнения процедуры CreateUsersAndGroups:
Рис. 6.11. Результаты запроса к системной базе данных Access
Рис. 6.12. Показ прав доступа к элементам базы данных Access
Конечно, все, что я сделал программно, можно сделать и руками, выбрав пункт меню "Сервис | Защита" и открыв соответствующее окно, например, окно разрешений, показанное на рис. 6.12.