Лекция № 22
Тема: "Связывание таблиц. Доступ к данным по технологии файлового сервера"
План
1. Основные характеристики технологии
2. Обеспечение безопасного доступа к данным
3. Подключение локальной и сетевой БД в Delphi
4. Отображение связанных таблиц на форме
1. Основные характеристики технологии
Технология файлового сервера предполагает сетевой доступ к базе данных, размещенной на выделенном файловом сервере организации.

Приложения, установленные на компьютерах клиентов "знают" путь к сетевой базе данных. При запуске приложения происходит копирование базы данных с сервера на компьютер клиента. Вся работа с данными проводится пользователем с локальной копией БД. Через заданные промежутки времени локальная копия синхронизируется с данными на сервере, обновляя общие данные.
Данная технология имеет ряд преимуществ:
Недостатки данной технологии в следующем:
2. Обеспечение безопасного доступа к данным
Как было сказано выше, одной из основных проблем файл-серверных информационных систем является проблема обеспечения безопасности данных. Для ее решения можно использовать несколько подходов, однако ни один из них не сможет гарантировать полную безопасность. При данной технологии нужно помнить, что ваша БД всегда находится под угрозой.
Защита доступа к БД
Одной из форм защиты является защита самой БД. Такая защита предполагает установление на БД пароля, без знания которого БД нельзя открыть как на локальном компьютере, так и через сеть. Данный способ защищает БД от открытия, просмотра и редактирование, но не защищает от копирования, перемещения или удаления.
Рассмотрим принцип защиты БД в СУБД Microsoft Access:
Защита сетевой папки от просмотра
Если работу с базой данных предполагается выполнять несколькими пользователями через сеть, то по технологии файлового сервера один компьютер должен иметь общую папку, в которой будет находиться ваша БД. Этот компьютер и будет играть роль Файлового сервера.
Замечание. Для более корректного управления параметрами доступа к ресурсам компьютера через сеть рекомендуется отключить в Windows простой доступ к сети. Для этого:
Получить доступ к общим сетевым ресурсам любого компьютера можно через Сетевое окружение, в котором файл БД будет видим и доступен для любых операций, в том числе и для удаления. Для решения данной проблемы необходимо предоставить такой доступ к папке, чтобы она была "не видима" в окне Сетевого окружения. Для этого выполните действия:
После выполнения таких действий обратиться к файлу БД можно будет только с помощью команды:
\\имя_компьютера\имя_сетевой_ папки$\имя_БД.mdb
или
\\IP адрес_компьютера\имя_сетевой_ папки$\имя_БД.mdb
Ввести эти команды можно или в поле "Адрес" программы Мой компьютер, или в окне, которое вызывается с помощью команды "Пуск – Выполнить".
Для ввода такой команды необходимо знать имя БД, имя сетевой папки, имя компьютера или IP адрес компьютера. Для определения этих параметров необходимо:
ipconfig /all
Предоставления доступа к сетевой папке на уровне пользователей
Средства безопасности Windows позволяют предоставлять доступ к папке в сети не всем пользователям, а только указанным вами. Для этого необходимо:
После этого к папке можно получить доступ только с тех компьютеров, на которых работают пользователи с указанными именами и паролями.
Изменение количества сетевых подключений
Если в качестве операционной системы файлового сервера используется версия для рабочих станций (Windows 2000/XP), то необходимо учитывать заложенное в этих ОС ограничение: максимальное количество подключений не может превышать 10 ( для Windows XP Home - 5). Итак, к сетевой базе данных может подключиться только 9 пользователей (еще одно подключение занято самым файловым сервером).
Для просмотра максимального количества подключений на компьютере можно выполнить следующие действия:
- выполните команду "Пуск - Выполнить", введите команду CMD и щелкните ОК. В результате запустится окно с командной строкой;
- в командной строке введите команду:
net config server
и нажмите Enter. В результате отобразиться информация о параметрах компьютера. В том числе и максимальное число пользователей.
Для снятия ограничений можно использовать несколько способов:
- установить на машину-сервер серверную версию Windows 2000 Server/Windows 2003 Server/Windows 2008 Server. Данные версии не имеют ограничений, но значительно дороже версий для рабочих станций;
- обновить некоторые системные файлы Windows XP, что позволит снять ограничения. Данный метод расценивается компанией Microsoft как незаконный. При обновлении файлов необходимо загрузить компьютер в безопасном режиме и скопировать нужные файлы в папку Windows. После перезагрузки компьютера можно повторно ввести команду net config server и убедиться, что ограничения сняты.
3. Подключение локальной и сетевой БД в Delphi
Для доступа к базе данных в Delphi есть несколько способов. Наиболее распространенным есть технология ADO. Данная технология обеспечивает возможность подключения как локальных, так и сетевых баз данных. Отличается легкостью и простотой работы, поддерживает все распространенные форматы баз данных, позволяет публиковать данные в Интернет и т.п.
Все компоненты, необходимые для работы с данной технологией, находятся на вкладке ADO.
Для работы с базой данных необходимо выполнить подключение к физической базе данных, расположенной на диске компьютера или в сети. Для этого служит компонент ADOConnection, который при запуске программы не видим на форме. Для установки соединения из БД нанесите на форму компонент ADOConnection (ADO). В его свойстве ConnectionString щелкните на кнопке с тремя точками. Откроется окно настройки параметров соединения. В этом окне щелкните на кнопке "Build", выберите тип драйвера базы данных (для Microsoft Access укажите "Microsoft Jet…"), щелкните "Далее", на следующей закладке укажите имя сервера и (или) имя файла базы данных. С помощью кнопки "Проверить подключение" можно проверить соединение.
Соединение с локальной БД
Если база данных находится на одном жестком диске с программой (чаще всего в одной папке с программой), то при задании имени файла БД не забудьте удалить путь к ее файлу.
Если база данных находится в одной папке с программой, но в отдельной подпапке, то при задании имени файла БД удалите полный путь к файлу БД, оставив только имя подпапки и имя файла. Например: Data\DBase.mdb.
Соединение с БД по сети
Сетевой базой данных может быть обычная база данных, размещенная в общей сетевой папке. Программа на клиентской машине устанавливает связь с такой базой данных по сети, и пользователь работает с ней как с локальной копией. Такой подход позволяет одновременно соединиться с БД множеству пользователей и коллективно работать с ней.
Если база данных размещается на другом компьютере в сети, полный путь к ней записывается по правилам записи пути к сетевым ресурсам:
\\имя_компьютера\имя_ресурса\имя_БД
Например: пусть в сети есть компьютер с именем "PC1", на котором выделена в общее пользование сетевая папка с именем Baza$. В этой папке находится файл БД Base.mdb. Правильная запись пути к базе данных будет иметь вид:
\\pc1\Baza$\Base.mdb
Например: пусть компьютер "PC1" имеет IP-адрес 192.168.0.40. Тогда полный путь к сетевой базе данных, которая находится на этом компьютере, может быть записан так:
\\192.168.0.40\Baza$\Base.mdb
Указание пароля БД
Если БД имеет пароль, то при нажатии на кнопку "Проверить подключение" будет выдано окно с сообщением о неверном пароле. Для указания пароля перейдите на закладку "Все" и в строке "Jet OLEDB: Database Password" введите пароль доступа.
Изменение пути к сетевой БД
Рассмотренный выше способ соединения из БД имеет существенный недостаток: он привязывает программу к конкретному компьютеру в сети. Если БД перенести на другой ПК или в другую общую сетевую папку, то соединение установленно не будет. Поэтому для создания более универсальной программы необходимо, чтобы путь к БД можно было программно менять в зависимости от конкретной ситуации.
В этом случае путь к БД можно сохранять в реестре или в INI файле.
Пример 1. Пусть в INI файле settings.ini в разделе "Base" в параметре "Path" хранится путь к сетевой базе данных. Если сохраненный путь верный, то при запуске прораммы он считывается, и появляется форма ля работы с БД. Если путь не верный, то выдается диалог указания нового пути к БД и сохранения его в INI файл для работы в будущем.
Скопируйте содержимое свойства ConnectionString компонента ADOConnection в буфер обмена. В событии формы OnCreate введите код:
//вверху подключаем модуль для работы с INI файлом
uses …, inifiles;
. . .
procedure TForm1.FormCreate(Sender: TObject);
//описываем переменную для работы с INI файлом
var ini:TINIFiles;
//описываем переменную для считывания пути к файлу БД
baza:string;
begin
//создаем экземпляр объекта для работы с INI файлом
ini:=TINIFile.Create(ExtractFilePath(Application.ExeName)+'settings.ini');
//считываем из файла путь к БД и записываем его в переменную
baza:=ini.ReadString('Baza','Path','');
//если считанный путь не верный
if not FileExists(baza) then
//с помощью диалога задаем новый путь к файлу БД
//если путь указан
if OpenDialog1.Execute then
//записываем его в переменную для работы
baza:=OpenDialog1.FileName
//иначе, если путь не указан
else
//завершаем работу программы
Application.Terminate;
//отключаемся от БД
ADOConnection1.Connected:=false;
//путь к БД подставляем в строку установки соединения
// между кавычками вставьте содержимое буфера обмена. Потом вместо
// конкретного пути к БД укажите имя переменной baza
//например:
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OleDB.4.0; Data Source=’+
baza+’; Persist Security Info=false';
//пробуем подключиться к БД
try
//если подключение удалось
ADOConnection1.Connected:=true;
//сохраняем путь в INI файл
ini.WriteString('Baza','Path',baza);
//подключаем таблицу с данными
ADOTable1.Active:=true;
//если подключение не удалось
except
//выдаем сообщение об ошибке
Application.MessageBox(...);
end;
//удаляем экземпляр объекта для работы с INI файлом
ini.Free;
end;
Таким образом, если меняется имя сетевого компьютера, или имя общей сетевой папки, то достаточно поменять значение нужного параметра в INI файле.
Пример 2. Пусть в реестре в разделе HKML_LOCAL_MACHINE в ветке "Software\MyProgram" в параметре "Path" хранится путь к сетевой базе данных.
Скопируйте содержимое свойства ConnectionString компонента ADOConnection в буфер обмена. В событии формы OnCreate введите код:
//вверху подключаем модуль для работы с реестром
uses …, registry;
. . .
procedure TForm1.FormCreate(Sender: TObject);
//описываем переменную для работы с реестром
var reg:TRegistry;
//описываем переменную для считывания пути к файлу БД
baza:string;
begin
//создаем экземпляр объекта для работы с реестром
reg:=TRegistry.Create;
//устанавливаем активный раздел реестра
reg.RootKey:=HKEY_LOCAL_MACHINE;
//открываем нужную ветку в реестре
reg.OpenKey('Software\MyProgram',true);
//читаем из реестра путь к БД
baza:=reg.ReadString('Path');
//если считанный путь не верный
if not FileExists(baza) then
//с помощью диалога задаем новый путь к файлу БД
//если путь указан
if OpenDialog1.Execute then
//записываем его в переменную для работы
baza:=OpenDialog1.FileName
//иначе, если путь не указан
else
//завершаем работу программы
Application.Terminate;
//отключаемся от БД
ADOConnection1.Connected:=false;
//путь к БД подставляем в строку установки соединения
// между кавычками вставьте содержимое буфера обмена. Потом вместо
// конкретного пути к БД укажите имя переменной baza
//например:
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OleDB.4.0; Data Source=’+
baza+’; Persist Security Info=false';
//пробуем подключиться к БД
try
//если подключение удалось
ADOConnection1.Connected:=true;
//сохраняем путь в реестр
reg.WriteString('Path');
//подключаем таблицу с данными
ADOTable1.Active:=true;
//если подключение не удалось
except
//выдаем сообщение об ошибке
Application.MessageBox(...);
end;
//удаляем экземпляр объекта для работы с INI файлом
reg.Free;
end;
После подключения к БД можно выполнять действия над ее таблицами и другими элементами с помощью стандартных компонентов Delphi.
4. Отображение связанных таблиц на форме
Для отображения связей между таблицами на форме можно воспользоваться встроенными возможностями компонентов Delphi. Например, для отображения двух связанных таблиц необходимо нанести два компонента ADOTable и с помощью свойств Connection и TableName связать их с нужными таблицами БД. Затем нанести два компонента DataSource и связать их с соответствующими компонентами ADOTable. Затем, для выполнения связывания выделите ADOTable, связанный с подчиненной таблицей и задайте два свойства:
- MasterSource – ссылка на источник данных главной таблицы;
- MasterField – укажите поля из главной и подчиненной таблицы, по которым таблицы связаны в БД, и щелкните на кнопке Add.
Вопросы для самоконтроля
1. Опишите принципы работы информационной системы, построенной по технологии файлового сервера.
2. В чем преимущества информационной системы, построенной по технологии файлового сервера?
3. В чем недостатки информационной системы, построенной по технологии файлового сервера?
4. Опишите принцип защиты БД Access с помощью пароля?
5. Как скрыть общую сетевую папку в окне сетевого окружения?
6. Опишите принцип предоставления доступа к общей сетевой папке на уровне пользователей.
7. Опишите принцип настройки соединения с локальной БД в Delphi.
8. Опишите принцип настройки соединения с сетевой БД в Delphi.
9. Как указать пароль доступа к БД Access при настройке соединения с БД в Delphi?
10. Как связать две таблицы на форме?