Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 5135 / 389 | Оценка: 4.23 / 3.83 | Длительность: 28:12:00
Специальности: Программист, Менеджер
Лекция 6:

Объекты ADO (продолжение)

Объект View и коллекция Views

Объекты View задают так называемые представления. Они подобны объектам Procedure, хранятся на сервере в виде оттранслированных запросов и задают отфильтрованное множество записей. Представления являются элементами таких баз данных как Microsoft SQL Server , а, следовательно, и MSDE. Поскольку с объектной точки зрения объект View имеет те же свойства, что и объект Procedure и соответствующие коллекции устроены одинаково, то я не буду задерживаться на более подробном описании этих объектов.

Объекты User, Group и их коллекции

Для того чтобы обеспечить защиту баз данных от неавторизованного доступа, для того чтобы разным пользователям предоставить разные права доступа к тем или иным объектам базы данных - таблицам, запросам, полям таблицы, одним из основных используемых механизмов является введение учетных записей для пользователей и групп пользователей базы данных. На объектном уровне защита баз данных поддерживается объектами User, Group и их коллекциями. Свойства Users и Groups объекта Catalog возвращают одноименные коллекции всех пользователей и всех групп, связанных с базой данных - объектом Catalog. Но поскольку каждая группа содержит одного или нескольких пользователей, то свойством Users обладает и объект Group, для него свойство возвращает всех пользователей, входящих в группу. Симметрично, свойством Groups обладает объект User, для него свойство возвращает все группы, в которые входит данный пользователь.

Коллекции Users и Groups устроены, как и все коллекции ADOX, у них три метода - Append, Delete, Refresh и два свойства: Item и Count. Создаются объекты и присоединяются к коллекции также согласно общей схеме, - при создании используется конструктор New, для присоединения - метод Append. Замечу, что, наконец-то, хотя бы в ADOX достигнута желаемая общность в организации коллекций.

Объект User

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

  • Property Name As String. Задает имя пользователя. Является свойством по умолчанию.
  • Property Groups As Groups. Возвращает одноименную коллекцию, содержащую все группы, в которые входит данный пользователь.

Пароль пользователя и разрешения на право доступа к тем или иным объектам базы данных задаются методами объекта User. Методов всего три:

  • Sub ChangePassword(OldPassword As String, NewPassword As String). Чтобы задать новый пароль, нужно знать и старый пароль. В случае, когда пароль задается в первый раз, старым паролем является пустая строка.
  • Function GetPermissions(Name, ObjectType As ObjectTypeEnum, [ObjectTypeId]) As RightsEnum. Метод (функция) возвращает разрешения на то, что может делать пользователь с объектом базы данных, чье имя задается параметром Name, а тип - параметром ObjectType. Третий параметр указывается лишь в тех исключительных ситуациях, когда речь идет об объектах, специфических для Провайдера. Права пользователя на объект задаются константами из перечисления RightsEnum. Возвращаемое значение может быть суммой отдельных констант и представляет маску, задающую отдельные разрешения. Различных констант в перечислении достаточно много, приведу лишь некоторые из них: adRightCreate, adRightDelete, adRightMaximumAllowed, adRightNone.
  • Sub SetPermissions(Name, ObjectType As ObjectTypeEnum, Action As ActionEnum, Rights As RightsEnum, [Inherit As InheritTypeEnum = adInheritNone], [ObjectTypeId]). Метод позволяет установить разрешения на возможные действия с элементом базы, чье имя задано параметром Name, а тип - параметром ObjectType. Параметр Rights задает маску, определяющую право на те или иные действия, значением параметра является сумма констант из перечисления RightsEnum. Параметр Action задает действия, выполняемые при установке разрешений. Параметр Inherit указывает, как объекты наследуют разрешения.

Объект Group

Группы облегчают управление правами доступа. Проще, быстрее и правильнее с содержательной точки зрения задать права группы, чем задавать их индивидуально для каждого пользователя. Хотя, конечно же, есть пользователи, для которых права задаются индивидуально.

С объектной точки зрения объект Group, во многом, устроен аналогично объекту User, - у него нет метода ChangePassword, поскольку у групп нет паролей, а свойство Groups заменяет симметричное свойство Users. Таким образом, у объекта Group два свойства: Name, Users и два метода - GetPermissions, SetPermission.

Пример программной работы в 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:

Результаты запроса к системной базе данных Access

Рис. 6.11. Результаты запроса к системной базе данных Access
Показ прав доступа к элементам базы данных Access

Рис. 6.12. Показ прав доступа к элементам базы данных Access

Конечно, все, что я сделал программно, можно сделать и руками, выбрав пункт меню "Сервис | Защита" и открыв соответствующее окно, например, окно разрешений, показанное на рис. 6.12.

Ольга Гафарова
Ольга Гафарова

Добрый день. Подскажите формулы при решении задачи на рис. 2.2 в лекции №2. Закон Ома, какие должны использоваться формулы для I и R

Курс: Основы офисного программирования и документы Excel

Серегй Лушников
Серегй Лушников