Transcript
Page 1: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И

В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й УН И В Е РСИ Т Е Т

Р азраб о тка п ри л о ж ени й б аз данны х в с реде Delphi. Час ть II.

Учебно-метод ическое пособие по специальности «Прикладная математика и информатика » (010200)

В оронеж 2003

Page 2: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

2 Утверж д ено научно-метод ическим советом протокол № 6 от 26.05.03 факультета ПМ М . Составители : Руд алев В .Г., Кры ж ановская Ю .А . Пособие под готовлено на кафедре технической кибернетики и автоматического регулирования факультета Прикладной математики , информатики и механики В оронеж ского госуд арственного уни верситета. Рекоменд уется д ля студ ентов 4 курса д /о и 4 курса в /о факультета ПМ М .

Page 3: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

3 Д анное пособие, являю щ ееся прод олж ением части I пособия «Разработка прилож ени й баз д анны х в среде Delphi» к курсу «Базы д анны х и экспертны е системы » , содерж ит сведения по созд анию прилож ени й в среде «клиент-сервер» . М атериал основы вается на Delphi верси и 6 и СУБД Interbase 5.5-6.0. Д ля работы с пособием необход имо знание основны х компонентов Delphi д ля работы с базами д анны х в рамках пособия [3] и знакомство с язы ком SQL. Раз д елы 1, 4, п. 2.1-2.3 написаны В .Г.Руд алевы м, п. 2.4-2.5, разд ел 3 – Ю .А .Кры ж ановской . Введени е В торая часть пособия целиком посвящ ена особенностям созд ания клиент-серверны х прилож ени й на примере СУБД InterBase. InterBase и д еально под ход ит д ля созд ания информационны х систем малы х и средних предприяти й . Ряд особенностей д елает InterBase, по мнению корпораци и Borland и ряд а незав исимы х экспертов , пригод ной и д ля крупны х предприяти й :

• Уни версальность. InterBase в ы пускается д ля различны х программно-аппаратны х платформ: рабочих групп с сервером под управлением Novell NetWare или д оменов на базе Windows 2000 Server, информационны х систем на базе серверов IBM, Hewlett-Packard, SUN, SGI и др. InterBase под д ерж и вает станд арт ANSI SQL 92, корректно работает с национальны ми (в том числе и с кириллическими ) код ировками как в Windows, так и в Unix.

• InterBase отличается в ы сокой скоростью и над еж ностью , основанной на уникальны х алгоритмах д оступа, простотой ад министрирования и ни зкими затратами на сопровож д ение.

• Реально IB мож ет обслуж и в ать БД размером в 10-20 ги габай т, при размере од ного фай ла БД 2 ги габай та. М ногофай ловая БД мож ет состоять и з 65535 фай лов , таким образом теоретически й предел д ля од ной базы д анны х составляет 132 терабай та.

Преимущ ества более «крупнокалиберны х» систем (Oracle, DB2) проявляю тся в скорости работы с большими масси вами д анны х. В InterBase отсутствую т собственны е средства созд ания прилож ени й и Case-проектирования баз д анны х, что компенсируется многочисленны ми программны ми прод уктами сторонних фирм. Благод аря уд ачному сочетанию ни зки х системны х требовани й и в ы сокой над еж ности InterBase хорошо себя прояв ил на Бостонской бирж е, в проекте Magnavox в вооруж енны х силах СШ А , на М еж банковской В алю тной Бирж е М М В Б, в Ц ентре Управления Полетами , во внешнеторговой корпораци и А в и аэкспорт и др.

Page 4: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

4 1. Ос но вы раб о ты в InterBase

1.1. Interbase Interactive SQL Утилита Interbase Windows Interactive SQL (сокращ енно ISQL) – основная утилита в InterBase д ля работы с БД . Е е функци и :

• Созд ание базы д анны х • Созд ание таблиц и метад анны х БД • Соед инение с БД и в ы полнение SQL-запросов • О тображ ение информаци и о БД .

Зад ачи ад министрирования решаю тся с помощ ью утилиты Server Manager. В целом функциональны е возмож ности WISQL невелики , но сущ ествую т многочисленны е утилиты сторонних фирм, эти возмож ности расширяю щ ие. WISQL успешно работает и с фай лами БД , созд анны ми в InterBase старших верси й . О сновной инструмент InterBase верси й 6-7 – утилита IBConsole. Е е характери зую т совершенно новы й интерфей с, минимум новы х возмож ностей и более ж есткие лицензионны е ограничения. 1.1.1. С оздан и е б азы дан н ы х О братитесь к ад министратору базы д анны х, чтобы он зарегистрировал В ас на сервере Interbase под именем (например, 4k4gr) и паролем. Е сли ад министратором являетесь В ы , то сделай те это самостоятельно с помощ ью утилиты Interbase Server Manager (см. п. 2.1). Предполож им, что сервер InterBase запущ ен на компью тере с сетевы м именем c1r214srv, там ж е в папке d:\ib\4k располож ены фай лы баз д анны х. Папка d:\ib д оступна пользователям сети в в и д е логического д иска V: . Созд ай те папку, например V:\4k\folder. Запустите утилиту ISQL и в ы берите пункт меню File | Create DataBase. Е сли сервер запущ ен у В ас на локальной машине (тогд а он буд ет в и д ен в в и д е значка в правой части панели зад ач Windows), то в появ и вшемся окне требуется пометить “Local Engine” и указать путь к фай лу БД , д алее указать имя ад министратора (SYSDBA) и пароль (masterkey - пароль ад министратора по умолчанию ). Пароль ад министратора затем мож но сменить, а такж е д обав ить новы х пользователей с помощ ью утилиты InterBase Server Manager. При работе в Windows-сетях необход имо в ы брать в поле Network Protocol протокол TCP/IP или NetBEUI, в Novell-сетях – Novell SPX.

Page 5: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

5

О братите внимание, что разрешается указы вать только локальны е пути (D:\ib\4k\folder\sklad.gdb), буквы сетевы х д исков (например, V:\4k\folder\sklad.gdb) использовать нельзя. Е сли все бы ло сделано прав ильно, в папке D:\ib\4k\folder появ ится фай л sklad.gdb, не содерж ащ и й пока таблиц. После успешного соз д ания БД работу утилиты мож но завершить. 1.1.2. С оздан и е т аб ли ц и други х об ъ ект ов InterBase Д ля соз д ания таблиц, генераторов , триггеров и други х метад анны х (как, впрочем, и д ля в ы полнения лю бы х SQL-запросов ) необход имо соед иниться с уж е сущ ествую щ ей БД . Д ля этого после запуска ISQL в ы берите пункт меню "File|Connect to Database", появ ится д и алоговое окно д ля в вод а имени пользователя и пароля. Созд ание таблиц в ы полняется, как обы чно, с помощ ью оператора CREATE TABLE. В се созд анны е объ екты буд ут храниться в од ном фай ле *.gdb. В ISQL сущ ествует д в а способа в ы полнения операторов SQL: в первом способе текст оператора след ует набрать в окне SQL Statement; во втором - в ы брать пункт "File|Run an ISQL Script..." и указать имя скриптового фай ла (скрипта). Скрипт (текстовы й фай л с расширением .sql.) сод ерж ит послед овательность SQL-операторов , предназначенны х д ля созд ания объ ектов БД . В скриптах такж е уд обно хранить часто используемы е SQL-операторы д ля работы с БД . Пример скрипта д ля созд ания БД и всех объ ектов , в ней сод ерж ащ и хся, при веден в п. 4.2. Более уд обны м способом созд ания объ ектов БД д ля Interbase является использование утилиты Delphi SQL Explorer.

Page 6: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

6 З а м еча н и е. В литературе рекоменд уется д ля корректной работы с русскими буквами настраи вать InterBase специальны м образом: указы вать строку DEFAULT CHARACTER SET WIN1251 при созд ани и БД и атрибут COLLATE PXW_CYRL при определени и полей , в ы бирать драй вер LANGUAGE DRIVER = Pdox ANSI Cyrillic при определени и алиаса в BDE. О д нако реально все это необход имо только д ля прав ильной работы функци и UPPER язы ка SQL. По мнению авторов , горазд о рациональнее (и надеж нее!) не менять язы ковы х настроек, а использовать вместо UPPER UDF-функци и и з мод уля CASEUDF, которы й мож но скачать по адресу http://www.ibase.ru/ download/caseudf.zip (см. такж е п.2.5). 1.1.3. Получен и е и нформаци и о ст рукт уре б азы дан н ы х В ISQL мож но получить полную информацию о структуре базы д анны х: список таблиц и и х структуры , списки и текст триггеров , хранимы х процед ур и т.п. Э ту операцию мож но в ы полнить в пункте меню View или Extract. Н апример, д ля созд анной в гл.4 базы д анны х Sklad, в ы берем "Extract|SQL Metadata for Table" д ля таблицы Cust. В окошке ISQL Output появ ится текст оператора, которы й созд авал д анную таблицу и оператора, определи вшего первичны й клю ч: /* Extract Table CUST */ /* Table: CUST, Owner: RUD */ CREATE TABLE CUST (NC SMALLINT NOT NULL, NAME VARCHAR(20), ADDRESS VARCHAR(20), CONSTRAINT CUSTPRIMARYKEY1 PRIMARY KEY (NC));

1.2. SQL Explorer Применительно к InterBase утилита SQL Explorer облад ает множ еством д ополнительны х возмож ностей , превращ аю щ и х ее в уд обны й полнофункциональны й инструмент. 1.2.1. С оздан и е алиаса. В ы берите пункт меню New, в окне New Database Alias зад ай те значение IntеrBase. Переименуй те алиас, указав вместо Interbase1 имя IbSklad, в строке Server Name установ ите путь к базе д анны х c1r214srv:d:\ib\4gr\folder\sklad.gdb, в строке User Name зад ай те имя пользователя - 4k4gr. Путь мож но зад авать либо в формате <Имя к омпью т ера>:<пут ь> (если используется протокол TCP/IP), либо \\<Имя к омпью т ера>\<пут ь> (протокол NetBEUI). Е сли ранее в ы биралось Local Engine (сервер запущ ен на этом ж е компью тере), то <и мя к омпью т ера> мож но не указы вать.

Page 7: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

7

Примените и зменения, в ы брав пункт меню File – Apply. 1.2.2. С оеди н ен и е с БД Щ елкните по значку + напроти в алиаса (раскрой те алиас). В д и алоговом окне в вед ите имя пользователя, например 4k4gr и пароль. 1.2.3. С оздан и е т аб ли ц В ы берите в контекстном меню д ля ветв и Tables пункт New (созд ание новой таблицы ). Появ ится ветка Table1, переименуй те ее на Detal. Д ля созд ания столбца раскрой те Detal , в ы берите д ля ветки Columns в контексном меню пункт New (соз д ание нового столбца), и змените наз вание столбца с Column1 на nd, установ ите его тип integer, в строке Nulls установ ите No (поле nd буд ет первичны м клю чом).

Page 8: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

8 А налогично созд ай те другие столбцы , затем в ы д елите Detal и в ы полните File – Apply. Т аблица созд ана, и ее структура буд ет иметь в и д :

1.2.4. С оздан и е перви чн ого к лю ча. В ы берите Primary Key - New, затем Columns – New и подставьте значение nd.

1.2.5. С оздан и е ген ерат ора . В ы берите ветвь Generators - New, и змените имя G1, под ставьте начальное значение 0.

Page 9: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

9

Заметим, что д ля каж д ого д ей ств ия мож но просмотреть соответствую щ и й SQL-оператор на закладке Text. Д ей ств ие вступает в силу после применения (команд а меню Apply). 1.2.6. С оздан и е т ри ггера для авт омат и ческого заполн ен и я перви чн ого к лю чевого поля при добавлен и и н овой запи си . В ветв и Detal в ы берите Triggers – New. И змените имя триггера – By_nd, на вкладке Definition укаж ите в поле Type значение Before insert, а на вкладке Text меж д у Begin и End в вед ите строку new.nd=gen_id(g1,1);

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

Page 10: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

10 Х ранимы е процед уры созд аю тся в ветв и Procedures алиаса, метод ика з д есь такая ж е, как при созд ани и триггеров .

1.3. П ерех о д к InterBase Н а практике часто бы вает, что к моменту перевод а информационной системы предприятия на архитектуру клиент-сервер необход имы е таблицы , заполненны е информацией , уж е сущ ествую т, но в формате локальны х СУБД *.dbf, Paradox, Access. К ак преобразовать и х к формату InterBase, сохрани в , по возмож ности , д анны е? В о многи х (но не во всех) случаях з д есь мож ет помочь компонент TBatchMove, предназначенны й д ля копирования записей и з одного набора д анны х в другой . При копировани и компонент преобразует форматы , автоматически сохраняя имена столбцов , типы и сод ерж имое д анны х. О сновны е свой ства TBatchMove: Source – имя набора д анны х (таблицы или запрос), откуд а копирую тся д анны е, Destination – имя Н Д , куд а копирую тся д анны е, Mode - тип копирования. Е сли зад ать тип batCopy, то таблица д ля Н Д Destination буд ет созд ана заново в соответств и и со структурой таблицы Н Д Source и заполнена ее д анны ми . К опирование происход ит при в ы полнени и метод а Execute. Д ругой в ариант - использование утилиты datapump.exe (в ы полненной на основе компонента TBatchMove), наход ящ ей ся в папке BDE. След ую щ и й э тап преобразования таблиц – созд ание первичны х клю чей , генераторов , триггеров и др. специфичны х д ля InterBase объ ектов . При этом необход имо пересмотреть структуру прилож ения, разд ели в его на клиентскую и серверную части с учетом необход имы х транзакци й . 2. Ос о б енно с ти кл и ент-с ерверны х п ри л о ж ени й

2.1. О бщ и е при н ци пы 2.1.1. Проект и рован и е БД Н е след ует слишком увлекаться нормали зацией базы д анны х. В о всем нуж на мера. Н ормали зация способствует целостности БД , исклю чает и з таблиц и збы точную информацию и сокращ ает размер БД . Побочны е э ффекты – замед ление работы при д оступе к множ еству небольших таблиц и нарушение восприятия предметной области разработчиком – в клиент-серверной среде могут оказаться более значимы ми . 2.1.2. Проект и рован и е при лож ен и й. Н астоятельно рекоменд ую тся:

Page 11: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

11 • Перенос основны х в ы числени й в серверную часть прилож ения в соответств и и со след ую щ ей таблицей . Д ей стви е И н струм ен т Заполнение уникальны х клю чей Генераторы Под д ерж ка ссы лочной целостности Т ри ггеры В ед ение статистики Т ри ггеры Би знес-правила, связанны е с и зменением нескольких таблиц в рамках одной транзакци и

Т ри ггеры

О граничения на значения в в од имы х д анны х Предлож ение CHECK при созд ани и таблиц БД

Запросы , вклю чаю щ ие слож ны е алгоритмы с циклами и ветвлением

Х ранимы е процед уры

Часто используемы е в SQL-операторах функции UDF, в ы полняю щ иеся на сервере

И нтерфей с с пользователем, формирование запросов и интерпретация результатов

Клиентское прилож ение

• И спользование компонента TDataBase. Компонент устанавли вает од но общ ее соед инение с сервером д ля всех компонентов DataSet, в проти вном случае каж д ы й набор д анны х соз д ает отд ельное соед инение, что сни ж ает э ффекти вность д оступа.

• И спользование TQuery вместо TTable. Предлож ение WHERE предпочтительнее, чем фильтр, так как в ы полняется на сервере, а не на клиентской машине.

2.2. Тра н за кци и 2.2.1. Управлен и е т ран закци ями Т ранзакция – это группа операци й , рассматри ваемая как ед иное целое. В случае успеха транзакция подтверж д ается, в случае неуд ачи – целиком отменяется. При каж д ом в ы полнени и оператора SQL порож д ается транзакция. Т акж е неявно транзакция порож д ается при в ы зове нав и гационны х метод ов ред актирования наборов д анны х (Insert, Edit и т.п.) и при ред актировани и с помощ ью TDBGrid. Завершается неявная транзакция в ы зовом метод ов Post или Cancel. Предпочтительны м является явное управление транзакциями . Д ля этого использую тся либо операторы язы ка SQL (SET TRANSACTION, COMMIT, ROLLBACK), либо соответствую щ ие им свой ства и метод ы компонента TDataBase [2] . Рассмотрим последние более подробно. В ы зов метод а StartTransaction означает, что все послед ую щ ие операторы , и зменяю щ ие д анны е, относятся к текущ ей акти вной транзакци и . А кти вной назы вается незавершенная транзакция. Завершается транзакция в ы зовом метод а Commit – подтверж д ение транзакци и (и зменения окончательно фиксирую тся в БД ) или RollBack – откат транзакци и (д анны е оказы ваю тся в состояни и , предшествовавшем началу транзакци и ). Свой ство IsTransaction типа Boolean позволяет проверить, имею тся ли в настоящ и й момент акти вны е

Page 12: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

12 транзакци и (в д анном прилож ени и !). Е сли есть, то начинать транзакцию (метод StartTransaction) нельзя. При органи заци и транзакци и рекоменд уется использовать механи зм исклю чительны х ситуаци й try … except. В при вод имом ни ж е примере транзакцией (неразры вной операцией ) является отпуск товара со склад а, сопровож д аю щ и й ся уменьшением остатка на склад е (таблица Detal) и д обавлением заказа (таблица CD): if Otpusk <= Ostatok then begin dbSklad.StartTransaction; // Начало транзакции try qrCD.Append ; // Изменение нового заказа qrCdTotal.AsString:= …; qrCd.Post; qrDetal.Edit; // Уменьшить остаток qrDetalOst.Value:=Ostatok-Otpusk; QrDetal.Post; dbSklad.Commit; // Фиксация транзакции except dbSklad.RollBack; // Откат транзакции ShowMessage('Ошибка транзакции!'); end; end else ShowMessage ('На складе нет нужного количества!'); При использовани и компонентов Interbase Express д анная станд артная схема несколько и зменяется (см. п. 2.3.2). 2.2.2. Взамодейст ви е т ран закци й В заимодей ств ие нескольких транзакци й , в ы з ванны х различны ми клиентскими прилож ениями , при д оступе к од ним и тем ж е д анны м мож но отрегулировать, определи в уровни и золяци и транзакци й с помощ ью свой ства TransIsolation: TTransIsolation компонента TDataBase. Значения свой ства обозначаю тся константами tiDirtyRead («грязное чтение» ), tiReadCommited (чтение под тверж д ени й ), tiRepeatableRead («повторяемое» чтение). При уровне DirtyRead транзакци и в и д ят все и зменения, в том числе и те, которы е могут бы ть впоследств и и отменены (RollBack). Поясним, что и неподтверж д енны е и зменения фи зически записаны в базе д анны х. И спользовать DirtyRead не рекоменд уется, так как транзакци и в заимно не и золирую тся и располагаю т поэтому нед остоверны ми д анны ми . Н еуд и в ительно, что в целях безопасности в InterBase уровень DirtyRead нед оступен и автоматически трактуется как ReadCommited. При уровне ReadCommited в и д ны то лько по дтвержден н ы е и зменения. Н апример, Перед ст арт ом т ран закци и 1 б ы ло: Иван ов М осква

Page 13: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

13 Тран закци я 1 ст арт овала и и змен и ла: Иван ов Ворон еж Тран закци я 2 ст арт овала и прочи т ала: Иван ов М осква Тран закци я 1 подт верди ла: Иван ов Ворон еж Тран закци я 2 прочи т ала: Иван ов Ворон еж О д нако и з д есь остается неопределенность, так как вторая транзакция при разны х чтениях в и д ит разны е результаты (преимущ еством перед DirtyRead является под тверж д енность эти х результатов ). Уровень RepeatableRead более строг и над еж ен. В се транзакци и располагаю т своими локальны ми версиями записей и при всех чтениях всегда (Repeatable) в и д ят только те подтверж д енны е д анны е, которы е бы ли д о и х старта. Н апример, в при вед енном в ы ше примере транзакция 2 оба раза прочитает одну и ту ж е запись Иван ов М осква. Прав д а, эта запись мож ет оказаться неактуальной , т.е. безнадеж но устареть. Поэтому в качестве компромисса часто используется уровень ReadCommited. 2.2.3. Тран закци и и кэши рован н ы е и змен ен и я К эширование и зменени й заклю чается в созд ани и на клиентской машине д ополнительного буфера (кэша), в котором хранятся ред актируемы е записи . В се и зменения заносятся в буфер, а в БД переносятся «пакетом» - фиксирую тся - при в ы зове метод а наборов д анны х ApplyUpdates. При необход имости кэш мож ет бы ть очищ ен от уж е зафиксированны х и зменени й - метод CommitUpdates - или очищ ен без фиксаци и и зменени й – метод CancelUpdates. К эширование и зменени й весьма полезно, так как уменьшает сетевой трафик и помогает ред актировать запросы «read only» (см. пример в [3]). В случае кэшированны х и зменени й типичная транзакция имеет в и д : dbSklad.StartTransaction; // Начало транзакции try qrDetal.ApplyUdates; // Фиксация изменений qrCD.ApplyUpdates; // … dbSklad.Commit; // Применение транзакции qrDetal.CommitUdates; qrCD.CommitUpdates; // Очистка кэша except dbSklad.RollBack; // Откат транзакции qrDetal.CancelUdates; // Отмена и очистка qrCD.CancelUpdates; // … ShowMessage('Ошибка транзакции!'); end;

2.3. К о м по н ен ты IBExpress Н ачиная с пятой верси и , палитра компонентов Delphi д ополнилась страницей Interbase, сод ерж ащ ей специали зированны е компоненты д оступа к серверу Interbase (компоненты InterBase Express, IBX). Главное и х д остоинство – более бы стры й д оступ к серверу, н е исп о ль зу ю щ ий BDE.

Page 14: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

14 Ф ункционально компоненты IBTable, IBTable, IBTable лишь незначительно отличаю тся от одноименны х BDE-ориентированны х компонентов . Структура и код прилож ения почти не и зменяю тся при переходе от BDE к IBX. Н аиболее инвариантны участки код а, связанны е с поиском, просмотром и ред актированием д анны х. При ведем основны е отличия в программировани и . 2.3.1. С т рукт ура при лож ен и я Н еобход имо учиты вать след ую щ ие особенности IBX.

• О бязат ель н ы м являет ся компонент IBDataBase, содерж ащ и й параметры соед инения с сервером, которы е устанавли ваю тся в окне DataBase Component Editor, в ы зы ваемом при д вой ном щ елчке по компоненту

Путь к базе д анны х на сервере, например c1r214srv:D:\IB\IB_SKLAD2.GDB, хранится в свой стве DataBaseName. А лиасы нигд е не использую тся!

• Д ля ред актирования наборов д анны х, воз вращ аемы х IBQuery, компонент IBUpdateSQL являет ся о бязат ель н ы м (в проти вном случае набор, незав исимо от запроса, всегд а является ReadOnly).

• Рекоменд уется компонент IBDataSet, объ ед иняю щ и й IBQuery и IBUpdateSQL («д ва в одном» ). Т екст SQL-запроса хранится в свой стве SelectSQL типа TStrings (причем формируется он уд обны м ред актором). Ф ункциональность IBUpdateSQL обеспечи вается ред актором набора д анны х, в ы зы в аемы м в контекстном меню и работаю щ им так ж е, как в обы чном UpdateSQL [3]. SQL-операторы мод ификаци и Н Д записы ваю тся в соответствую щ ие свой ства InsertSQL, ModifySQL, DeleteSQL.

Page 15: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

15 • И нтересной особенностью компонентов IBQuery,

IBDataSet, IBTable является возмож ность непосредственного в ы зова генератора д ля заполнения первичного клю чевого поля (свой ство GeneratorField: TIBGeneratorField). Т ри ггеры д ля этой цели более не нуж ны .

• При использовани и компонентов необход имо учиты вать новую модель управления транзакциями .

2.3.2. Орган и заци я т ран закци й Управление транзакциями происход ит не через IBDataBase, а с помощ ью специального компонента IBTransaction, являю щ егося о бязат ель н ы м в прилож ени и . К омпонент IBDataBase связы вается с объ ектом IBTransaction через свой ство DefaultTransaction: TIBTransaction. Кроме того, ссы лку на IBTransaction над о указать в свой ствах Transaction: TIBTransaction наборов д анны х (IBQuery, IBTable и др.). В прилож ени и мож ет бы ть несколько объ ектов -транзакци й , поэтому каж д ы й набор д анны х мож ет органи зов ы вать свои собственны е, незав исимы е от други х наборов транзакци и . О сновны е метод ы IBTransaction аналогичны – StartTransaction, Commit и RollBack, однако метод ика и х применения несколько другая, а пример, рассмотренны й в п.2.2.1, неработоспособен. Стартует транзакция в ы зовом метод а StartTransaction или установкой свой ства Active в True. Н о след ует учиты вать, не запущ ена ли ранее транзакция другими способами (влож енны е транзакци и не д опускаю тся!). Д ело в том, что запуск транзакци и происход ит такж е и при акти в и заци и соед инения, происходящ ей при откры ти и наборов д анны х, связанны х с компонентом IBTransaction. В примере п. 2.2.1 Н Д предполагаю тся откры ты ми (иначе не буд ут работать комбинированны е списки ), поэтому в ы зов StartTransaction - запрещ енная влож енная транзакция. Прав ильны й пример органи заци и транзакци и при веден в разд еле 4. При в ы зове метод ов Commit или RollBack связанны е наборы д анны х закры ваю тся, при и х переоткры ти и запускается новая транзакция. Д ля д ополнительного контроля рекоменд уется проверять акти вность транзакци й (свой ство InTransaction: Boolean), сигнали зировать об акти вности и зменением цвета э лементов формы , д елать проверки и запросы при закры ти и форм работы с д анны ми , что и реали зовано в мод уле OtpForm примера. В остальном метод ика использования BDE- и IBX-компонентов од инакова.

2.4. П ро см о тры (Views) Д овольно часто пользователям требуется обратиться к некоторому подмнож еству д анны х, хранимы х в БД . Д ля обеспечения бы строты

Page 16: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

16 в ы полнения часто используемы х запросов и снятия с клиентского прилож ения необход имости такие запросы в ы д авать в БД , мож но определить просмотры (view). О собенно уд обно и х использовать, когд а такую информацию нуж но получать часто, а услов ия отбора остаю тся неи зменны ми . В и д , представление или просмотр (View) - это в иртуальная таблица, которая не сохранена фи зически в базе д анны х, но вед ет себя точно так ж е, как "реальная" таблица. В БД хранится только описание просмотра, которое используется д ля фильтраци и д анны х при появлени и запроса, ссы лаю щ егося на этот просмотр. Просмотр мож ет сод ерж ать д анны е и з одной или более таблиц или други х просмотров . В аж но понимать, что созд ание просмотра не генерирует копи и д анны х, хранимы х в други х таблицах, и когд а д анны е и зменяю тся через него, то меняю тся д анны е в таблицах. И наоборот, при прямом внесени и и зменени й в БД просмотры такж е меняю тся с целью отраж ения эти х и зменени й . Синтаксис созд ания просмотра: CREATE VIEW ИмяПросмотра [(Столбец[, Столбец…])] AS < оператор select>; Замечание. Н ельзя соз д ать просмотр, которы й базируется на результатах работы хранимой процед уры . Просмотр мож ет бы ть составлен и з лю бого под множ ества столбцов и строк одной таблицы , формируемого оператором SELECT. Н апример, таблица job и з employee.gdb (таблица сотрудников и з д емонстрационной БД , поставляемой вместе с InterBase) имеет 8 столбцов job_code, job_grade, job_country, job_title, min_salary, max_salary, job_requirement, language_req. Просмотр отображ ает граничны е значения зарплаты д ля каж д ой работы (все строки , но подмнож ество столбцов ) CREATE VIEW JOB_SALARY_RANGES AS SELECT JOB_CODE, MIN_SALARY, MAX_SALARY FROM JOB; О сновны е преимущ ества использования просмотров : 1. Упрощ ение д оступа к д анны м. Просмотры объ ед иняю т д анны е и з нескольких таблиц и поз воляю т в ы полнять часто используемы е операторы од ин раз . 2. У д обны й д ля пользователей способ д оступа к д анны м. Просмотры позволяю т «под гонять» БД к нуж д ам различны х пользователей , которы м горазд о уд обней работать только с той информацией , которая имеет отношение только к ним, не отвлекаясь на информацию други х пользователей . 3. Н езав исимость д анны х. Просмотры позволяю т защ итить пользователей от различны х э ффектов , в ы з в анны х и зменениями в структуре БД . Н апример, если ад министратор принял решение о разд елени и од ной таблицы на д ве, то пользователь этого мож ет и не заметить, если работает с просмотром, определенны м нуж ны м образом. 4. Безопасность д анны х. Просмотры обеспечи ваю т безопасность, разд еляя процесс д оступа к «чувств ительны м» и «безразличны м» частям БД .

Page 17: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

17 Н апример, мож но просмотреть список в аканси й , но без информаци и о предлагаемой зарплате и названи и фирмы . Просмотры могут бы ть обновляемы ми , но могут и не д опускать внесения в них и зменени й (когд а и зменение просмотра никак не отраж ается на таблицах, и з которы х просмотр созд ан). О бновляемость зав исит от характера просмотра. В целом з д есь требования такие ж е, как и д ля ред актирования Н Д TQuery (см. [1], [3, стр.39]). Просмотры мож но использовать в прилож ениях на Delphi наравне с обы чны ми таблицы , указы вая имя просмотра в свой стве TableName или в операторе SQL, встроенном в TQuery.

2.5. Фун кци и , о пределяем ы е по льзо ва телям и Помимо встроенны х SQL-функци й , таких, как min(), max(), avg(), InterBase под д ерж и вает библиотеки внешних функци й UDF (функци й , определяемы х пользователем). Представляя собой д инамические библиотеки (DDL в случае Windows), компонуемы е к ядру сервера InterBase, UDF обеспечи ваю т максимально в ы сокую прои з вод ительность. UDF мож но созд авать с помощ ью лю бы х компиляторов (С, Pascal, Fortran и т.п.). Д ля этого необход имо написать необход имы е функци и , откомпилировать и х, вклю чить в состав DLL и объ яв ить на сервере InterBase. UDF мож ет принять д о 10 параметров , соответствую щ и х лю бому типу д анны х InterBase, за исклю чением масси вов . В се в ход ны е параметры перед аю тся по ссы лке. В оз вращ аемы е значения перед аю тся либо по ссы лке (по умолчанию ), либо по значению . В последнем случае необход имо учиты вать соответствие типов :

Тип Interbase Тип Object Pascal Integer Integer Double precision Double Cstring Pchar Date Type IBGateTime=record

Days: integer; Msec: cardinal; End;

Чтобы перед ать числовое значение по значению , след ует при объ явлени и UDF в БД после в ы ход ного параметра указать служ ебное слово BY VALUE. После того, как функци и откомпилированы в библиотеку, и х нуж но объ яв ить д ля всех БД , в которы х планируется ее использование. К аж д ую функцию требуется объ являть отдельно, но только од ин раз д ля каж д ой БД . О бъ явление функци и информирует БД о ее располож ени и и свой ствах. Синтаксис объ явления: DECLARE EXTERNAL FUNCTION name [datatype | CSTRING(длина) [,datatype | CSTRING(длина)…]]

Page 18: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

18 RETURNS {datatype [BY VALUE] | CSTRING(длина)} [FREE_IT] ENTRY_POINT ‘entryname’ MODULE_NAME ‘modulename’; Аргум ен т О пи с а н и е Name И мя UDF д ля использования в SQL-операторах;

мож ет отличаться от имени , указанного после ENRT_POINT

Datatype Т ип в ход ного или воз вращ аемого параметра RETURNS О пределяет воз вращ аемое функцией значение BY VALUE О пределяет, что воз вращ аемы й результат д олж ен

перед аваться по значению CSTRING(длина) Указы вается д ля параметров строкового типа FREE_IT После завершения работы UDF освобож д ает память,

в ы д еленную под воз вращ аемое по ссы лке значение ‘entryname’ Строка в кавы чках, определяю щ ая имя функци и в

исход ном коде как оно хранится в библиотеке ‘modulename’ О писание фай ла, и д ентифицирую щ ее библиотеку, в

которой хранится UDF При определени и имени мод уля (библиотеки ) в операторе DECLARE EXTERNAL FUNCTION необход имо указы вать располож ение UDF, используя абсолю тны й путь, относительны й путь или только имя библиотеки . Первы й в ариант, безусловно, является негибким. О тносительны е пути могут бы ть неправильно истолкованы О С. В том ж е случае, если используется только имя мод уля, О С всегд а буд ет искать в под д иректории lib установочной д иректории InterBase (например, C:\Program Files\InterBase\lib) и в системны х д иректориях Windows. Н ачиная с InterBase 6, UDF д олж ны храниться только в д иректории ..\InterBase\udf ! К огд а UDF созд ана и объ явлена в БД , ее мож но использовать в операторах SQL, в хранимы х процед урах и триггерах. Д ля этого след ует встав ить ее имя в соответствую щ ее место SQL-оператора, заклю чи в в ход ны е параметры в круглы е скобки . InterBase пред оставляет пользователям некоторое количество наиболее часто используемы х функци й в в и д е UDF-библиотеки ib_udf.dll (папка ..\InterBase\udf ). Э ти UDF написаны на язы ке С. И сход ны е тексты и другие фай лы , необход имы е д ля перекомпиляци и библиотеки , располож ены в д иректории examples. Упражн ен и е. Подклю чите библиотеку ib_udf.dll и проверьте ее работоспособность. 3. Си с тема б езо п ас но с ти InterBase

3.1. База да н н ы х безо па с н о сти Безопасность InterBase строится на основе специальной базы д анны х (БД безопасности ) д ля каж д ого сервера, сод ерж ащ ей а) список пользователей ,

Page 19: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

19 имею щ и х разрешение на установление соед инения с БД и сервисами InterBase на этом сервере, б) пароли пользователей в зашифрованном в и д е. Э та база д анны х хранится в фай ле isc4.gdb в папке ..\Interbase. След ую щ ая таблица описы вает содерж имое БД безопасности : Столбец О пи с а н и е User name И мя, в вод имое пользователем при подклю чени и Password Пароль UID Ц елое число, определяю щ ее и д ентификатор

пользователя GID Ц елое число, определяю щ ее и д ентификатор группы Full name Реальное имя пользователя К огд а пользователь пы тается установ ить соед инение с БД на сервере, прои з вод ится проверка соответств ия имени пользователя и его пароля и з записи в БД безопасности (при перед аче по сети пароли шифрую тся). В случае соответств ия соед инение успешно устанавли вается. Д ля управления пользователями (отображ ения, и зменения, д обавления или уд аления информаци и и з базы безопасности ) служ ат утилита команд ной строки gsec или более уд обная Windows-программа IB Server Manager, которую рассмотрим более подробно.

3.2. П о льзо ва тели и па ро ли Д ля просмотра и и зменения количества пользователей и и х при в илеги й след ует в ы брать пункт Tasks|User Security в IB Server Manager, чтобы откры ть InterBase Security dialog box и в ы полнить такие операци и , как:

• Просмотреть список автори зованны х пользователей . • Д обав ить пользователя (пункт Add User). • И зменить пользовательски й пароль и д ополнительную информацию о пользователе (пункт Modify User). И мя пользователя и зменить нельзя: д ля этого нуж но сначала пользователя уд алить, а затем д обав ить нового пользователя.

• У д алить пользователя. Д ля этого след ует в ы брать пункт Delete, а затем подтверд ить уд аление в д и алоговом окне.

Замечание. Т олько пользователь SYSDBA имеет права на д обавление, мод ификаци ю и уд аление пользователей . К аж д ы й сервер InterBase имеет пользователя SYSDBA с паролем masterkey. Сначала это ед инственны й автори зованны й пользователь на сервере. И он д олж ен автори зовать (зарегистрировать) други х пользователей . SYSDBA – специальны й пользователь, которы й мож ет обой ти станд артную SQL-защ иту и в ы полнить некоторы е специальны е операци и , например, shutdown д ля БД . В аж но:

• Рекоменд уется как мож но бы стрее и зменить пароль д ля пользователя SYSDBA, в проти вном случае безопасность мож ет бы ть нарушена, так

Page 20: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

20 как неавтори зованны й пользователь мож ет получить д оступ к БД на сервере (пользователь SYSDBA имеет д оступ ко всем объ ектам).

• Имена пользоват елей могут бы ть д линой д о 31 символа, не являю тся чувств ительны ми к смене регистра, но не д олж ны содерж ать пробелов .

• П аро ли чу вст вит ель н ы к регист ру бу кв. З н а чен и е и м еют то лько первы е 8 с и м во ло в па ро ля, но д лина пароля мож ет д ости гать 32 символов .

О бы чно д ля каж д ого человека, работаю щ его с InterBase, соз д ается отд ельны й пользователь, од нако возмож ны и другие в арианты :

• Созд ание одного пользователя д ля группы лиц в целях упрощ ения ад министрирования паролей . Н апример, пользователь FINANCE мож ет уд овлетворять запросы на д оступ лю бого и каж д ого и з персонала финансового отдела. Группа сотруд ников д олж на запомнить только од ин общ и й пароль.

• Созд ание од ного пользователя д ля группы лиц, имею щ и х од инаковы е при в илеги и д ля д оступа к БД .

След ую щ и й SQL-оператор созд ает БД с указанием имени пользователя и пароля: CREATE DATABASE 'c1r214srv:d:\ib\folder\ibSklad.gdb' USER

"SVETA" PASSWORD "privet" О ператор буд ет успешны м, если пользователь SVETA зарегистрирован в базе д анны х безопасности на сервере c1r214srv с паролем privet, после чего SVETA станет влад ельцем (owner) БД IB_Sklad.gdb.

3.3. Гра н ты и при ви леги и Подклю чение к БД не означает автоматическую возмож ность ред актирования и д аж е отображ ения д анны х. При в илеги и д олж ны бы ть зад аны явны м образом; пользователи не смогут обращ аться ни к одному объ екту БД , пока не получат соответствую щ ие при в илеги и . При в илеги и , д анны е специальному «пользователю » PUBLIC, применимы д ля всех пользователей . В се таблицы и хранимы е процед уры защ и щ аю тся от несанкционированного д оступа при и х созд ани и . Сначала только созд атель таблицы (owner) имеет д оступ к д анны м, но он мож ет назначать при в илеги и другим пользователям (пред оставлять грант). Grant (англ.) – д ар, пред оставление, субси д ия. Защ ита от несанкционированного д оступа осущ ествляется с помощ ью таблицы при в илеги й д оступа - списка операци й , которы е разрешены пользователям БД . О д ноименны й SQL-оператор GRANT назначает при в илеги и д оступа различны м субъ ектам безопасности - конкретны м пользователям, ролям (см. п. 3.4), а такж е хранимы м процед урам и триггерам. О бъ ектами безопасности

Page 21: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

21 (охраняемы ми объ ектам), к которы м применяется GRANT, могут бы ть таблицы целиком, столбцы таблиц, триггеры , хранимы е процед уры , просмотры . SQL-оператор REVOKE уд аляет ранее пред оставленны е при в илеги и д оступа. Синтаксис оператора GRANT (подробнее см. в разд еле Language Reference технической д окументаци и , поставляемой с InterBase): GRANT {<privileges> ON [Table] {tablename | viewname} TO {<object> | <userlist> | GROUP Unix_group} | <role_granted> TO {PUBLIC | role_grantee_list}}; Здесь: <privileges> = {ALL [PRIVILEGES] | <privilege_list>} <privilege_list>={ SELECT | DELETE | INSERT | UPDATE [(col [, col …]) ] | REFERENCES [(col [, col ...])] [, <privilege_list> ...]}} <object> = { PROCEDURE procname | TRIGGER trigname | VIEW viewname | PUBLIC

[, <object>…]} <userlist> ={ [USER] username | rolename | Unix_user} [, <userlist> ...] [WITH GRANT OPTION] <role_granted> = rolename [, rolename…] <role_grantee_list> = [USER] username [, [USER] username …]

[WITH ADMIN OPTION] П ри ви леги я Разреша ет по льзо ва телям …

SELECT Просматри вать строки в таблице или просмотре DELETE У д алять строки INSERT В ставлять строки UPDATE И зменять все или указанны е столбцы EXECUTE В ы полнять хранимы е процед уры

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

ALL О бъ ед иняет SELECT, DELETE, INSERT, UPDATE, и REFERENCES

Примеры : GRANT ALL ON detal TO Vasya - назначение д оступа д ля таблицы Detal пользователю Vasya. GRANT UPDATE (ost) ON detal TO Vasya - назначение при в илеги и на и зменение столбца Ost.

Page 22: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

22

3.4. Группы по льзо ва телей При в илеги и мож но назначать группам пользователей через механи зм ролей. Чтобы созд ать и использовать роль, необход имо в ы полнить четы ре шага. Сначала роль объ является с помощ ью оператора CREATE ROLE <роль>. Затем с помощ ью оператора GRANT назначаю тся при в илеги и роли д ля указанны х таблиц и столбцов . Н а третьем шаге, снова с помощ ью оператора GRANT, роли назначаю тся пользователям. Н аконец, роль д олж на бы ть указана при соед инени и с базой д анны х, например, в д и алоговом окне соед инения WISQL. Пример: CREATE ROLE admins // Созд ание роли admins GRANT ALL,EXECUTE ON cust TO admins //При в илеги и на таблицу GRANT admins TO sveta, vasya // Т еперь оба - ад министраторы CONNECT 'c1r214srv:d:\ib\folder\ibSklad.gdb' USER 'SVETA'

PASSWORD 'privet' ROLE 'admins'

3.5. InterBase Server Manager Утилита предназначена д ля ад министрирования локальны х и распределенны х БД и серверов InterBase. С помощ ью этой утилиты мож но в ы полнить след ую щ ие операци и :

• определить или и зменить имена пользователей и и х пароли ; • прои з вести резервное копирование и восстановление БД ; • уд алить "мусор" и з базы ; • завершить/отменить «зав исшие» транзакци и ; • прои з вести проверку базы на наличие ошибок.

Рассмотрим некоторы е возмож ности более подробно. 3.5.1. Резервн ое к опи рован и е б азы дан н ы х При резервном копировани и , проведенном с помощ ью Server Manager, кроме сохранения базы д анны х в архи ве, в ы полняю тся д ополнительны е операци и . При этом:

• У величи вается бы стродей ств ие базы . В процессе копирования/восстановления происход ит "сбор мусора" - в базе д анны х освобож д ается место, занятое уд аленны ми записями . Т ем самы м уменьшается фи з ически й размер базы .

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

• Д анны е мож но перенести на другую операционную систему. Различны е компью теры имею т собственны е форматы фай лов баз д анны х и эти фай лы нельзя просто перенести на другую операционную

Page 23: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

23 систему. Д ля в ы полнения этой операци и нуж но созд ать резервную копию базы в т ран спорт н ом формате.

3.5.2. Удален и е « мусора» Borland InterBase - СУБД с многоверсионностью д анны х. К огд а запись и зменяется, на страницу д анны х помещ ается ее копия с новы ми значениями , однако старая запись остается. Старое значение назы вается "Back Version" (резервная версия) и является "историей отката" - если транзакция, и змени вшая запись, отменится, то старая версия записи останется на своем месте. Кроме этого, стары е верси и обеспечи ваю т уровень и золяци и Repeatable Read д ля д линны х транзакци й , которы м на все время д ей ствия нуж но в и д еть д анны е, сущ ествовавшие на момент начала такой транзакци и . К огд а и зменяю щ ая записи транзакция под тверж д ается и все конкурирую щ ие транзакци и такж е завершаю тся, старая версия перестает бы ть необход имой . В часто и зменяемой базе д анны х стары е записи могут занимать значительное д исковое пространство и ухуд шать прои з вод ительность БД . Т акие записи являю тся «мусором» , которы й необход имо в ы чищ ать, д ля чего в ы берите Maintenance | Database Sweep. Э то при ведет к немед ленной очистке БД от «мусора» с освобож д ением места, занятого отмененны ми и неактуальны ми записями . Сбор «мусора» мож ет прои з вод иться автоматически через интервал, определенны й в д и алоге Database Properties. 4. При мер п ро грамми ро вани я Н апишем программу вед ения БД «Склад » , основанную на специали з ированны х компонентах Interbase Express.

Полностью готовы й пример наход ится на сетевом ресурсе \\c1r214srv\method\BD. А налогичны е, но более развернуты е полнофункциональны е д емонстрационны е примеры мож но най ти в папке ..\Borland\Delphi6\Demos\Db\IBMastApp в установочной д иректори и Delphi (соответствую щ и й фай л БД ..\Borland\Borland Shared\Data\mastsql.gdb) или в книге [2].

4.1. Серверн а я ча сть Скрипт определения д анны х: CREATE DATABASE "d:\db\ib_sklad2.gdb" USER "SYSDBA" PASSWORD "masterkey";

Page 24: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

24 SET TERM ^; CREATE TABLE CUST ( NC SMALLINT NOT NULL PRIMARY KEY, NAME VARCHAR(20), ADDRESS VARCHAR(20) ) ^ CREATE TABLE DETAL ( ND SMALLINT NOT NULL PRIMARY KEY, NAME VARCHAR(10) NOT NULL, PRICE DOUBLE PRECISION CHECK (PRICE > 0), OST INTEGER CHECK (OST >= 0) ) ^ CREATE TABLE CD ( NUM SMALLINT NOT NULL PRIMARY KEY, NC SMALLINT NOT NULL, ND SMALLINT NOT NULL, KOL INTEGER NOT NULL CHECK (KOL > 0), TOTAL DOUBLE PRECISION NOT NULL, DATA DATE ) ^ CREATE TABLE STAT ( DATA TIMESTAMP NOT NULL, ND SMALLINT NOT NULL, KOL INTEGER NOT NULL ) ^ /* Генераторы */ CREATE GENERATOR G1 ^ SET GENERATOR G1 TO 1 ^ CREATE GENERATOR G2 ^ SET GENERATOR G2 TO 1 ^ CREATE GENERATOR G3 ^ SET GENERATOR G3 TO 1 ^ /* Хранимые процедуры */ CREATE PROCEDURE GET_NUM RETURNS ( NR INTEGER ) AS BEGIN NR=gen_id(g1,1); END ^ /* Триггеры */ CREATE TRIGGER CDTRIGGER1 FOR CD BEFORE INSERT POSITION 0 AS BEGIN new.num=gen_id(g2,1); END ^ CREATE TRIGGER BY_ND FOR DETAL BEFORE INSERT POSITION 0 AS BEGIN detal.nd=gen_id(g3,1); END ^ /* Каскадное удаление */ CREATE TRIGGER DETALTRIGGER1 FOR DETAL AFTER DELETE POSITION 0

AS BEGIN

Page 25: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

25 delete from cd where cd.nd=detal.nd; END ^ /* Сбор статистики */ CREATE TRIGGER T1 FOR CD AFTER INSERT POSITION 0 AS declare variable cnt integer; declare variable old_kol integer; BEGIN SELECT count(*) FROM stat WHERE (data=New.data) and (nd=new.nd) INTO :cnt; IF (:cnt = 0) THEN BEGIN INSERT INTO STAT (data, nd, kol) VALUES (new.data, new.nd, new.kol); END ELSE BEGIN UPDATE stat SET kol=kol + new.kol WHERE (data= new.data) AND (nd = new.nd); END END ^ COMMIT ^ EXIT ^ З а да н и е. Перепишите операцию отпуска товара с помощ ью триггера, автоматически уменьшаю щ его остаток товара на складе после вставки нового заказа.

4.2. К ли ен тска я ча сть М о дуль да н н ы х :

Указания. • Н астройку компонентов в ы полните в соответстви и с при вод имы ми ни ж е фай лами описания форм (.dfm). В них указы ваю тся только те значения свой ств компонентов , которы е необход имы д ля работоспособности программы . Д ругие свой ства (размер, цвет и пр.) зад авай те в инспекторе объ ектов по собственному усмотрению .

Page 26: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

26 • О бъ екты dsCust, dsCD, dsDetal свяж ите с объ ектами idCust, idCD, idDetal, соответственно.

• Н астрой те компоненты соед инения и управления транзакциями . При настройке idbSklad воспользуй тесь ред актором DataBase Editor и укаж ите все параметры соед инения, вклю чая имя пользователя и пароль, запрос которы х заблокируй те.

object idbSklad: TIBDatabase DatabaseName = 'D:\DB\IB_SKLAD2.GDB' LoginPrompt = False DefaultTransaction = itaSklad end object itaSklad: TIBTransaction Active = False End • В се остальны е Н Д idCust … iqTemp свяж ите с пред ы д ущ ими д в умя компонентами , установ и в свой ства

Database = idbSklad Transaction = itaSklad • Н астрой те компоненты д ля вставки новы х записей в таблицу Detal: object iqInsert: TIBQuery Database = idbSklad Transaction = itaSklad end object iqTemp: TIBQuery Database = idbSklad Transaction = itaSklad End • Д ля объ ектов TIBDataSet укаж ите в свой ствах SelectSQL запросы в и д а select * from <имя_табл>. Созд ай те в соответств и и с листингом типи зированны е поля (idCustNC: TSmallintField и остальны е), используя Fields Editor.

• И спользуя DataSet Editor, определите д ей ств ия по ред актированию Н Д (свой ства DeleteSQL, InsertSQL, ModifySQL заполнятся автоматически ).

• Заполните свой ство GeneratorField, указав необход имы й генератор и собы тие On New Record.

object idCust: TIBDataSet CachedUpdates = True DeleteSQL.Strings = ( 'delete from CUST where NC = :OLD_NC') InsertSQL.Strings = ('insert into CUST (NC, NAME,

ADDRESS) values (:NC, :NAME, :ADDRESS)') SelectSQL.Strings = ('select * from CUST' ) ModifySQL.Strings = ('update CUST set NC = :NC,

NAME = :NAME, ADDRESS = :ADDRESS where NC = :OLD_NC') GeneratorField.Field = 'NC' GeneratorField.Generator = 'G1' object idCustNC: TSmallintField FieldName = 'NC' Required = True

Page 27: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

27 end object idCustNAME: TIBStringField FieldName = 'NAME' end object idCustADDRESS: TIBStringField FieldName = 'ADDRESS' end end object idCD: TIBDataSet CachedUpdates = False DeleteSQL.Strings = ( 'delete from CD where NUM = :OLD_NUM') InsertSQL.Strings = ( 'insert into CD (NUM, NC, ND, KOL, TOTAL, DATA) values (:NUM, :NC, :ND, :KOL, :TOTAL, :DATA)') SelectSQL.Strings = ( 'select * from CD' ) ModifySQL.Strings = ('update CD set NUM = :NUM,

NC = :NC, ND = :ND, KOL = :KOL, TOTAL = :TOTAL, DATA = :DATA where NUM = :OLD_NUM')

GeneratorField.Field = 'NUM' GeneratorField.Generator = 'G2' object idCDNUM: TSmallintField FieldName = 'NUM' Required = True end object idCDNC: TSmallintField FieldName = 'NC' end object idCDND: TSmallintField FieldName = 'ND' end object idCDKOL: TIntegerField FieldName = 'KOL' end object idCDTOTAL: TfloatField FieldName = 'TOTAL' end object idCDDATA: TDateTimeField FieldName = 'DATA' end end object idDetal: TIBDataSet Database = idbSklad Transaction = itaSklad CachedUpdates = False DeleteSQL.Strings = ( 'delete from DETAL where ND = :OLD_ND') InsertSQL.Strings = ('insert into DETAL (ND, NAME, PRICE,

OST) values (:ND, :NAME, :PRICE, :OST)' ) SelectSQL.Strings = ('select * from DETAL') ModifySQL.Strings = ( 'update DETAL set ND = :ND, NAME =

:NAME, PRICE = :PRICE, OST = :OST where ND = :OLD_ND')

Page 28: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

28 GeneratorField.Field = 'ND' GeneratorField.Generator = 'G3' object idDetalND: TSmallintField FieldName = 'ND' Required = True end object idDetalNAME: TIBStringField FieldName = 'NAME' end object idDetalPRICE: TFloatField FieldName = 'PRICE' end object idDetalOST: TIntegerField FieldName = 'OST' end end end Гла вн а я ф о рм а при ло жен и я:

Зд есь располож ены кнопки sbAdd, sbRem, sbArc, spQuit: TspeedButton, реали зую щ ие функци и – приход , расход , архи в , в ы ход . В главном меню прод ублируй те функци и кнопок и д обавьте д ополнительны е необход имы е, на В аш в з гляд , функци и . Д ля лучшей иллю страци и материала все в ы з ы ваемы е мод ули AddUnit, OtpUnit, TablUnit использую т различны е способы д оступа к д анны м. О бра бо тчи ки с о бы ти й кн о по к: procedure TMainForm.sbAddClick(Sender: TObject); begin // При добавлении товара используются неявные транзакции with DM do // Добавление товара на склад if AddForm.ShowModal=mrOK then begin iqTemp.CLose; iqTemp.SQL.Clear; // Проверить, есть ли на складе iqTemp.SQL.Add('SELECT * FROM Detal WHERE Name= :p1 and Price = :p2'); iqTemp.ParamByName('p1').value:=AddForm.Edit1.Text; iqTemp.ParamByName('p2').value:=AddForm.Edit2.Text; iqTemp.Open; iqInsert.SQL.Clear; if iqTemp.Recordcount=0 then //Если нет, то добавить begin

Page 29: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

29 iqInsert.SQL.add('INSERT INTO detal (name, price, ost) values (:p1, :p2, :p3)'); iqInsert.ParamByName('p1').value:= AddForm.Edit1.Text; iqInsert.ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); iqInsert.ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); iqInsert.ExecSQL; end else begin // Если есть, то увеличить количество iqInsert.SQL.add ('UPDATE detal SET ost = ost + :p3 WHERE (Name =:p1) and (price=:p2)'); iqInsert.ParamByName('p1').value:= AddForm.Edit1.Text; iqInsert.ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); iqInsert.ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); iqInsert.ExecSQL; end; end; end; procedure TMainForm.spRemClick(Sender: TObject); begin OtpForm.ShowModal; // вызов формы отпуска end; procedure TMainForm.sbArcClick(Sender: TObject); begin TablForm.ShowModal; // вызов формы архивов end; Фо рм а при х о да то ва ра AddForm:

Зд есь использую тся обы чны е компоненты TEdit. Установ ите д ля кнопки Применить свой ство ModalResult = mrOK, а д ля кнопки Отмена ModalResult = mrCancel.

Page 30: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

30 Фо рм а о тпуска то ва ро в:

О пи с а н и е ф о рм ы (View as Text): object OtpForm: TOtpForm Caption = 'Расход' OnCloseQuery = FormCloseQuery OnShow = FormShow object lbTotal: TLabel Caption = '0' end object lbOpl: TLabel Caption = 'К оплате' end object lbDate: TLabel Caption = 'lbDate' end object dblcCust: TDBLookupComboBox DataField = 'NC' DataSource = DM.dsCD KeyField = 'NC' ListField = 'NAME;Address' ListSource = DM.dsCust end object dblcDetal: TDBLookupComboBox DataField = 'ND' DataSource = DM.dsCD KeyField = 'ND' ListField = 'NAME;PRICE;OST' ListSource = DM.dsDetal end object btAdd: TButton Caption = 'Добавить пустой' OnClick = btAddClick end

Page 31: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

31 object btCancel: TButton Caption = 'Отменить' OnClick = btCancelClick end object btClose: TBitBtn Caption = '&Выход' Kind = bkClose end object btOrder: TBitBtn Caption = 'В заказ!' OnClick = btOrderClick end object eKol: TEdit Text = '0' OnChange = eKolChange end end О бра бо тчи ки с о бы ти й : function CheckTrans: boolean; begin Result := dm.itaSklad.InTransaction; if Result then OtpForm.lbOpl.Color:=clRed //При активной транзакции меняется цвет else OtpForm.lbOpl.Color:=OtpForm.Color; end; procedure TOtpForm.FormShow(Sender: TObject); begin dblcCust.Enabled:=False; dblcDetal.Enabled:=False; btOrder.Enabled:=False; btCancel.Enabled:=False; lbDate.Caption:=DateToStr(Date); end; procedure TOtpForm.btAddClick(Sender: TObject); begin with dm do begin idCust.Close; idCust.Open; idDetal.Close; idDetal.Open; idCd.Close; idCD.Open; idCD.append; end; CheckTrans; dblcCust.Enabled:=True; dblcDetal.Enabled:=True;

Page 32: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

32 btOrder.Enabled:=True; btCancel.Enabled:=True; end; procedure TOtpForm.btCancelClick(Sender: TObject); begin dm.idCD.Cancel; dm.idCD.Close; dm.idCust.Close; dm.idDetal.Close; dm.itaSklad.RollBack; CheckTrans; dblcCust.Enabled:=False; dblcDetal.Enabled:=False; btOrder.Enabled:=False; btCancel.Enabled:=False; end; procedure TOtpForm.btOrderClick(Sender: TObject); var otpusk, ostatok: integer; begin with dm do begin Otpusk := StrToInt(eKol.Text); Ostatok := DM.idDetalOst.value; if Otpusk <= Ostatok then begin try // Изменение нового пустого заказа idCDData.Value:=Date; idCdKol.Value:=Otpusk; lbTotal.Caption:=IntTostr( idDetalprice.AsInteger*StrToInt(eKol.text)); idCdTotal.AsString:= lbTotal.Caption; idCd.Post; // Уменьшить остаток idDetal.Edit; idDetalOst.Value:=Ostatok-Otpusk; idDetal.Post; itaSklad.Commit; except itaSklad.RollBack; ShowMessage('Ошибка транзакции!'); end; end //if Otpusk <= Ostatok else begin ShowMessage ('На складе нет нужного количества!'); idCD.Cancel; end; end; // with dm CheckTrans; dblcCust.Enabled:=False; dblcDetal.Enabled:=False; btOrder.Enabled:=False;

Page 33: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

33 btCancel.Enabled:=False; end; procedure TOtpForm.eKolChange(Sender: TObject); begin if eKol.text='' then eKol.Text:='0'; try lbTotal.Caption:=IntTostr( dm.idDetalprice.AsInteger*StrToInt(eKol.text)); except ShowMessage('Неправильно указано количество!'); end; end; procedure TOtpForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if CheckTrans then if MessageDlg('Имеются незавершенные транзакции. Завершить их?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then dm.itaSklad.Commit else dm.itaSklad.RollBack; CheckTrans; Close; end; Фо рм а а рх и во в:

Д ля д обавления новы х заказчиков использую тся кэшированны е и зменения. Т ак как запись вед ется только в од ну таблицу, органи зов ы вать транзакцию нет необход имости .

Page 34: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

34 Н а вкладках Заказы и Т ов ары – только просмотр заказов и товаров , соответственно. С помощ ью переклю чателя rgLink: TradioGroup устанавли вается связь master-detail. object TablForm: TTablForm Caption = 'Таблицы' object PageControl1: TPageControl ActivePage = tsCust object tsCust: TTabSheet Caption = 'Заказчики' object dgrCust: TDBGrid DataSource = DM.dsCust ReadOnly = True end object rgOrder: TRadioGroup Caption = 'Сортировать' items.Strings=('по номеру' 'по имени' 'по адресу') end object bAdd: TButton Caption = 'Добавить' end object bLocate: TButton Caption = 'Поиск' end object eName: TEdit end object eAddress: TEdit end object bDelete: TButton Caption = 'Удалить' end object bbApply: TBitBtn Caption = '&Применить' end object bbCancel: TBitBtn Caption = '&Отменить' end end object tsOrders: TTabSheet Caption = 'Заказы' object dgrOrders: TDBGrid DataSource = DM.dsCD ReadOnly = True end object rgLink: TRadioGroup Caption = 'Связать' Columns = 3 ItemIndex = 2 Items.Strings = ( 'с заказчиками' 'с товарами' 'не связывать') end

Page 35: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

35 end object tsDetal: TTabSheet Caption = 'Товары' object dgrDetal: TDBGrid DataSource = DM.dsDetal ReadOnly = True end object dbnDetal: TDBNavigator DataSource = DM.dsDetal end end end end procedure TTablForm.tsOrdersShow(Sender: TObject); begin rgLinkClick(Sender); end; procedure TTablForm.tsCustShow(Sender: TObject); begin // Обновление запроса dm.idCust.Close; dm.idCust.Open; end; procedure TTablForm.tsDetalShow(Sender: TObject); begin dm.idDetal.Close; dm.idDetal.Open; end; procedure TTablForm.rgOrderClick(Sender: TObject); begin case rgOrder.ItemIndex of // Способы сортировки 0: dm.idCust.SelectSQL[1]:=''; 1: dm.idCust.SelectSQL[1]:='ORDER BY Name'; 2: dm.idCust.SelectSQL[1]:='ORDER BY Address'; end; dm.idCust.Close; dm.idCust.Open; end; procedure TTablForm.bAddClick(Sender: TObject); begin // Добавление заказчика пока происходит в кэш if (Ename.text<>'') and (eAddress.Text<>'') then with DM do begin idCust.Append; idCustName.value:=eName.text; idCustAddress.Value:=eAddress.Text; idCust.Post; end else

Page 36: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

36 ShowMessage('Не указаны имя и адрес!') end; procedure TTablForm.bLocateClick(Sender: TObject); begin DM.idCust.Locate('Name', eName.text,[loPartialKey]); end; procedure TTablForm.bDeleteClick(Sender: TObject); begin dm.idCust.Delete; // Удаление из кэша end; procedure TTablForm.rgLinkClick(Sender: TObject); begin //Связь Master-Detail устанавливается через условие WHERE //В свойстве SelectSQL[0]находится основная часть запроса with dm,idcd do case rgLink.Itemindex of 2,-1: begin // Нет связи Close; SelectSQL[1]:=''; Open end; 0: begin // Главная таблица – Cust Close; SelectSQL[1]:='Where nc = :p1'; ParamByName('p1').value:=idCustNc.value; Open; end; 1: begin // Главная таблица – Detal Close; SelectSQL[1]:='Where nd = :p1'; ParamByName('p1').value:=idDetalnd.value; Open; end; end; end; procedure TTablForm.bbApplyClick(Sender: TObject); begin dm.idCust.ApplyUpdates; // Перенос из кэша на сервер end; procedure TTablForm.bbCancelClick(Sender: TObject); begin dm.idCust.CancelUpdates; // Отказ от изменений end; З а да н и е: Перенесите в клиент-серверную сред у прилож ения БД , разработанны е В ами при и з учени и 1 части пособия. И спользуй те специали з ированны е компоненты IBX.

Page 37: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

37 Ли терату ра

1. Ф аронов В .В ., Ш умаков П.В . Delphi 5. Руковод ство разработчика баз д анны х. – М .: «Н оли д ж » , 2000. – 640 с. 2. Д арахвели д зе П.Г., М арков Е .П. Программирование в Delphi 7. - СПб.: «BHV-Санкт-Петербург» , 2003. - 794 с. 3. Разработка прилож ени й баз д анны х в среде Delphi. Часть 1. / Сост.: В .Г.Руд алев , Ю .А .Кры ж ановская; В оронеж . гос. ун-т. - В оронеж , 2002. - 59 с.

Page 38: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

38 СО Д Е РЖ АН И Е В веден и е ................................................................................................3 1. О с н о вы ра бо ты в InterBase ............................................................4

1.1. Interbase Interactive SQL ...........................................................4 1.1.1. Созд ание базы д анны х ........................................................................... 4 1.1.2. Созд ание таблиц и други х объ ектов InterBase ...................................... 5 1.1.3. Получение информаци и о структуре базы д анны х ............................... 6

1.2. SQL Explorer ................................................................................6 1.2.1. Созд ание алиаса...................................................................................... 6 1.2.2. Соед инение с БД ..................................................................................... 7 1.2.3. Созд ание таблиц..................................................................................... 7 1.2.4. Созд ание первичного клю ча. ................................................................. 8 1.2.5. Созд ание генератора. ............................................................................. 8 1.2.6. Созд ание триггера д ля автоматического заполнения первичного клю чевого поля при д обавлени и новой записи . ................................................................ 9

1.3. Переход к InterBase....................................................................10 2. О с о бен н о сти кли ен т-серверн ы х при ло жен и й ...........................10

2.1. О бщ ие принципы .......................................................................10 2.1.1. Проектирование БД .............................................................................. 10 2.1.2. Проектирование прилож ени й . ............................................................ 10

2.2. Т ранзакци и .................................................................................11 2.2.1. Управление транзакциями ................................................................... 11 2.2.2. В замодей ств ие транзакци й .................................................................. 12 2.2.3. Т ранзакции и кэшированны е и зменения............................................. 13

2.3. К омпоненты IBExpress .............................................................13 2.3.1. Структура прилож ения........................................................................ 14 2.3.2. О ргани зация транзакци й ...................................................................... 15

2.4. Просмотры (Views)....................................................................15 2.5. Ф ункци и , определяемы е пользователями ................................17

3. Си стем а безо па с н о сти InterBase ..................................................18 3.1. База д анны х безопасности .........................................................18 3.2. Пользователи и пароли ..............................................................19 3.3. Гранты и при вилеги и .................................................................20 3.4. Группы пользователей ...............................................................22 3.5. InterBase Server Manager............................................................22

3.5.1. Резервное копирование базы д анны х .................................................. 22 3.5.2. У д аление «мусора» ............................................................................... 23

4. П ри м ер про гра м м и ро ва н и я.........................................................23 4.1. Серверная часть.........................................................................23 4.2. Клиентская часть .......................................................................25

Л и тера тура ..........................................................................................37

Page 39: Разработка приложений баз данных в среде Delphi. Часть 2: Учебно-методическое пособие

39 Составители : Руд алев В алери й Геннад иев ич Кры ж ановская Ю лиана А лександровна Ред актор Т и хомирова О .А .


Recommended