М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й У Н И В Е РСИ Т Е Т
Р азраб о тка п ри л о ж ени й б аз данны х в среде Delphi. Ч асть III. InterBase У чебно-метод и ческоепособи епо специ альности «При клад наяматемати ка и и нформати ка» 010501 (010200)
В оронеж , 2005
2 У тв ерж д ено научно-метод и чески м сов етом факультета ПМ М 21.09.2005 г.
протокол № 1 от
Состав и тель Руд алев В .Г.
У чебно-метод и ческое пособи е под готов лено на кафед ре техни ческой ки бернети ки и ав томати ческого регули ров ани я факультета при клад ной математи ки , и нформати ки и механи ки В оронеж ского госуд арств енного уни в ерси тета. Рекоменд уетсяд лястуд ентов 4 курса д /о факультета ПМ М .
3 В в едени е Д анное пособи е, яв ляю щ ееся прод олж ени ем сери и метод и чески х пособи й по разработке при лож ени й баз д анны х, сод ерж и т св ед ени я об особенностях и спользов ани я СУ БД InterBase. Д ля работы с пособи ем необход и мо знани е основ ны х компонентов Delphi д ляработы сбазами д анны х в рамках пособи я[3] и знакомств о сязы ком SQL. Сервербаз д анны х InterBase в ы пускается фи рмой Borland д ля разли чны х программно-аппаратны х платформ: Novell NetWare, Windows в сех в ерси й, Linux, и нформаци онны х си стем на базесерверов IBM, Hewlett-Packard, SUN, SGI и д р. Реально InterBase мож ет обслуж и в ать БД размером в 10-20 ги габайт, при размере од ного файла БД 2 ги габайта. М ногофайлов ая БД мож ет состоять и з 65535 файлов , таки м образом, теорети чески й пред ел д ля од ной базы д анны х 132 терабайта. InterBase – опти мальное реш ени е д ля малы х и сред ни х органи заци й с чи слом рабочи х станци й поряд ка нескольки х д есятков . СерверInterbase облад ает д остаточной прои зв од и тельностью , над еж ностью и ни зки ми си стемны ми требов ани ями . А д ми ни стри ров ани е Interbase горазд о прощ е, чем серверов Oracle и ли MS SQL, но при этом обеспечи в ается при емлемая д ля многи х зад ачстепень защ и ты и нформаци и . В ход ной язы кInterbase наи более точно под д ерж и в ает станд арт ANSI SQL 92, что д елаетInterbase некоей «константой» сред и множ еств а несов мести мы х д и алектов SQL д руги х фи рм. Н емалов аж ноепреи мущ еств о Interbase – отсутств и еж естки х ли цензи онны х ограни чени й. В ерси и InterBase, в ы пускаемы ефи рмой Borland, небесплатны . В то ж ев ремяи сход ны етексты InterBase откры ты д ляразработчи ков и в рамках ряд а проектов (напри мер, FireBird, Jaffil) в ы пускаю тся св ои сов ерш енно бесплатны е усов ерш енств ов анны е в ерси и сервера, сов мести мы е с InterBase, и нформаци я о которы х постоянно обнов ляется на сайте ibase.ru. И зв естны й нед остаток Interbase – отсутств и е сред ств и нструментальной под д ерж ки - полностью компенси руется многочи сленны ми ути ли тами и программны ми комплексами сторонни х фи рм – IBAdmin, IBManager, IBExpert и д р.
4 1. О с но в ы р або ты в InterBase 1.1. У стано вка InterBase У станов ка InterBase и ли FireBird, как прав и ло, прои сход и т бы стро и не в ы зы в ает затруд нени й. Н апри мер, при установ ке сервера FireBird 1.5 на локальны й компью тер, не под клю ченны й к сети , необход и мо запусти ть установ очны й файл Firebird-1.5.2.4731-Win32.ехе и след ов ать и нструкци ям, при ни мая установ ки по умолчани ю (в частности , согласи в ш и сь с запуском FireBird при старте Windows в качеств е служ бы ). FireBird пред лож и т В ам д в а в ари анта установ ки – Classic и SuperServer. В в ари анте Classic каж д ы й запрос кли ента обрабаты в ается в отд ельном процессе, в в ари анте SuperServer – отд ельны ми потоками в нутри ед и ного процесса. Первы й в ари ант отли чается стаби льностью работы , в торой – меньш и м потреблени ем си стемны х ресурсов . При установ кеFireBird в сети необход и мо установ и ть серверна од ном и з узлов сети , которы й буд ети грать роль сервера баз д анны х. Н а рабочи х станци ях сети необход и мо установ и ть кли ент InterBasе. Это мож но в ы полни ть разли чны ми способами . В о-первы х, запусти ть установ очны й файл, отклю чи в опци ю установ ки сервера, а остав и в только установ ку кли ента. В о-в торы х, отмети ть при установ ке Delphi флаж ок Install InterBase Client. Н аконец, мож но скопи ров ать файл gds32.dll в папку Windows\System32. Это ед и нств енны й файл, необход и мы й д ляработы кли ента. 1.2. И нструментал ьны е средства У ти ли та Interbase Console (сокращ енно IBConsole) – основ ная ути ли та в InterBase в ерси й 6-7 д ляработы сБД . Е ефункци и : • Созд ани ебазы д анны х • Соед и нени есБД и в ы полнени еSQL-запросов • О тображ ени еи нформаци и о БД . • А д ми ни стри ров ани еБД . В целом функци ональны е в озмож ности IBConsole нев ели ки , поэтому часто пользую тся ути ли той SQL Explorer, в ход ящ ей в состав Delphi. SQL Explorer работаетчерез BDE и позв оляетлегко созд ав ать табли цы и д руги еобъекты БД в д и алогов ом реж и ме. О д нако, по мнени ю ав тора (сов сем неори ги нальному), пред почти тельней яв ляется св обод но распространяемая ути ли та IBExpert, отли чаю щ аяся богатой функци ональностью , простотой и спользов ани я и стаби льностью работы . Рассмотри м под робнееоснов ны ев озмож ности IBExpert и метод и ку ееи спользов ани я на при мерев ерси и 2.5. У ти ли та под д ерж и в аетнесколько язы ков пользов ательского и нтерфейса, в том чи сле и русски й (которы й мож но в ы брать через пунктменю Options – Environment Option – Interface Language), но д алеемы буд ем и з пед агоги чески х побуж д ени й (т.е. и з в ред ности ) и спользов ать англоязы чны й и нтерфейс.
5 1.3. Со здани е и реги страци я б азы данны х Созд ани енов ой базы д анны х прои сход и тв четы реэтапа • Созд ани е нов ой пустой БД , хранящ ейся в файле с расш и рени ем *.gdb (д ляInterBase) *.fdb (д ляFireBird) • Реги страци я БД в IBExpert • Соед и нени есБД • Созд ани етабли ц и д руги х метад анны х Пред полож и м, что серверустанов лен у В асна локальном компью теред ома и ли на том ж е компью тере, на котором буд ет д алее работать кли ентское ПО . У бев д и тесь, что серверзапущ ен: в Windows 98 он буд ет в и д ен в в и д е значка прав ой части панели зад ач; в Windows 2000/XP управ лять его запуском мож но через спи сокслуж б (Services), в котором при сутств ую т служ бы InterBase (и ли Firebird) Guardian и InterBase Server. В ы бери те в глав ном меню IBExpert пункт DataBase - Create DataBase. В поле Server в в ед и те Local, в поле Database – путь кнов ому, ещ е не сущ еств ую щ ему файлу:
В поле UserName – и мя ад ми ни стратора SYSDBA, в поле Password – пароль ад ми ни стратора masterkey (в прочем, над еемся, что В ы этот в сем и зв естны й пароль уж е смени ли и ли скоро смени те). В качеств е SQL Dialect укаж и те Dialect 3. Этотд и алектязы ка SQL под д ерж и в аетсяначи наясв ерси й InterBase 6 и FireBird и отли чаетсярасш и ренны ми в озмож ностями . Д и алект1 и спользуйте, если необход и мо обеспечи ть сов мести мость с InterBase ранни х в ерси й. О стальны еполямож но остав и ть без и зменени й. Реги страци я необход и ма д ля уд обств а д альнейш ей работы . При реги страци и IBExpert запоми нает путь к БД и д руги е параметры соед и нени я и при послед ую щ и х запусках отображ аетспи сокзареги стри ров анны х баз. О кно реги страци и ав томати чески появ ляется после созд ани я БД . Зд есь необход и мо указать и мя и в ерси ю серв ера ( в д анном случае FireBird 1.5), в ы брав и х и з спи ска, и али ас – сокращ енное и мя БД . Буд ьте в ни мательны и
6 уточни те, какая в ерси я InterBase у В ас установ лена. заполнять необязательно.
О стальны е
поля
Послереги страци и в окнеDataBase Explorer появ и тсяали асБД – NewSklad.
Д ля д альнейш ей работы необход и мо соед и ни ться с БД , д в а раза щ елкнув по али асу, послечего появ и тся спи сокметад анны х (д оменов , табли ц, просмотров , храни мы х процед ур, три ггеров , генераторов , и склю чени й, функци й, опред еляемы х пользов ателем и ролей):
Т еперь метад анны е мож но созд ав ать и мод и фи ци ров ать. Н о сначала обрати м В аш е в ни мани е на след ую щ ее очень в аж ное обстоятельств о, которое над о
7 учи ты в ать при работе в сети . И мена баз д анны х в InterBase строятся по прав и лу: Server_Name:Full_FileName, гд е Server_Name – сетев ое и мя компью тера, на котором установ лен сервер InterBase. В качеств е сетев ого и мени могут в ы ступать и мя NetBios, д оменное и мяи ли IP-ад рескомпью тера. Full_FileName – и мяфайла *.gdb, обы чно суказани ем пути . Н апри мер: c1r214srv:d:\ib\4gr\MyBase\sklad.gdb. Н аправ лени е слэш а значени я не и меет. Н о в и мени файла нельзя указы в ать ни и мена папокобщ его д оступа, ни отображ ени я эти х папокна логи чески е букв ы д и сков . Н апри мер, нед опусти ма запи сь \\c1r214srv\MyBase\sklad.gdb. Н ельзятакж езапи сы в ать c1r214srv:H:\MyBase\sklad.gdb, если букв а H указы в ает не на фи зи чески й д и ск, а обозначаетсетев ую папку общ его д оступа. Н апри мер, если на сервере на д и ске D зав ед ена папка общ его д оступа d:\ib, отображ аемая на букв у H. В кач естве Full_FileName мо ж но п ро п и сы вать то л ько ф и зи ч ески й п уть к БД на ко мп ьютере, где устано вл ен сервер. В при в ед енном при мере таки м путем яв лялся путь d:\ib\4gr\MyBase\sklad.gdb, которы й и над о указы в ать при реги страци и сервера. В реальны х си туаци ях д ля в ы яснени я д опусти мы х путей обрати тесь кад ми ни стратору сети . При работев сети окна созд ани яи реги страци и БД в IBExpert и мею тнесколько и ной в и д , гд е д ля уд обств а и мя сервера c1r214srv запи сы в ается отд ельно в в ерхней части окна. Разумеется, если БД и спользуется не только д ля учебны х целей, то ад ми ни страторд олж ен заранее созд ать пользов ателей БД с неад ми ни страти в ны ми прав ами , и мена и пароли которы х В ы , какряд ов ы епользов атели , указы в аетев место SYSDBA и masterkey (см. п. 1.7.2).
8
Е сли В ам требуется перенести готов ую базу д анны х с д ругого компью тера, то д ляреги страци и ее на серверенеобход и мо в ы полни ть д в а д ейств и я: • Скопи ров ать файл БД на сервер, напри мерв папку H:\4gr\MyBase. • Зареги стри ров ать БД , в ы брав в глав ном меню IBExpert пункт DataBase Register DataBase и заполни в окно
Замеч ани е. В ли тературе рекоменд уется д ля корректной работы с русски ми букв ами настраи в ать InterBase специ альны м образом: указы в ать в качеств е CharSet при созд ани и БД WIN1251 и зад ав ать атри бут COLLATE PXW_CYRL при опред елени и строков ы х полей. О д нако реально в се это необход и мо только
9 д ляправ и льной работы функци и Upper язы ка SQL срусски ми букв ам. По мнени ю ав тора, горазд о раци ональнее и над еж нее не менять язы ков ы х настроек, а и спользов ать функци ю UpCase (и аналоги чны ефункци и ) и з мод уляCASEUDF, которы й мож но скачать по ад ресу http://www.ibase.ru/ download/caseudf.zip и установ и ть на серв ере(см. разд ел 3). 1.4. Со здани е таб л и ц Д ля созд ани я табли ц, генераторов , три ггеров и д руги х метад анны х (как, в прочем, и д ля в ы полнени я лю бы х SQL-запросов ) необход и мо соед и ни ться с уж е сущ еств ую щ ей БД . Д ля этого после запуска IBExpert раскройте али ас БД , в ы д ели те в етку Tables, и в контекстном меню в ы бери те пункт New Table. Сразу ж е и змени те и мя табли цы на Customers (см. в ерхню ю часть окна). Д обав ьте и мена полей, в ы би рая и х ти п (и ли д омен) и з спи ска д оступны х ти пов (и ли д оменов ). Ч тобы объяв и ть поле перви чны м клю чом, д в аж д ы щ елкни те напроти в него в колонкеPK.
Н аж ати е первой кнопки в панели и нструментов и ли Ctrl+F9 генери рует DDL операторсозд ани я табли цы , которое затем след ует под тв ерд и ть, наж ав кнопку Commit в след ую щ ем окне. Замети м, что и д алее в се д ейств и я в IBExpert рассматри в аю тся кактранзакци и и требую т яв ного под тв ерж д ени я (Commit), что пов ы ш аетнад еж ность работы . После того кактабли ца бы ла созд ана, ее структуру мож но при необход и мости мод и фи ци ров ать. Н апри мер, чтобы д обав и ть нов ое поле, след ует в контекстном меню в ы брать New Field, в появ и в ш емсяокнезад ать и мяполяи его ти п и в зав ерш ени енаж ать Ctrl+Alt+C (под тв ерж д ени етранзакци и ):
10
IBExpert пы тается корректно мод и фи ци ров ать структуру табли ц без потери сод ерж ащ и хся в ни х д анны х. Замечани е: д ля и зменени я ти па поля сущ еств ую т д в а способа. В первом способеслед уетуд али ть полеи созд ать его занов о. В торой способ пред почти тельнее, но требует некоторой пред усмотри тельности : старайтесь явно созд ав ать д омены д ляв сех и спользуемы х в БД ти пов д анны х. Д ля и зменени я ти па д остаточно буд ет в ы брать необход и мы й д омен и з спи ска на первой в клад кепред ы д ущ его окна. InterBase ав томати чески , неяв но созд ает д омены д ля в сех созд ав аемы х полей, но при св аи в ает и м «неуд обочи таемы е» и мена, напри мер, RDB$6. Поэтому лучш есозд ав ать д омены яв но. Д ля яв ного созд ани я д омена в ы д ели те объект Domains в окне Database Explorer, наж ми теCTRL+N и заполни теокно,
указав при необход и мости наклад ы в аемы е на д омен ограни чени я. Д алее при созд ани и поля указы в аем не ти п Varchar(40) not null, а и мя д омена Address_Domain. 1.5. Со здани е генерато ро в, три ггеро в и храни мы х п ро цедур Генераторы обы чно и спользую тся в InterBase д ляполучени я уни кальны х ав тои нкрементны х значени й. Занесени еи х в перви чны еклю чев ы еполямож етбы ть в ы полнено и ли три ггером (ав томати чески ), и ли кли ентски м при лож ени ем. Первы й способ в о многи х случаях пред почти телен, таккактри ггерсрабаты в ает
11 в сегд а, незав и си мо от того, как прои сход и т в став ка нов ой запи си – и з IBExpert, кли ентского при лож ени яна Delphi, Web-при лож ени й и т.п. Созд ать генераторпрощ е в сего сразу при объяв лени и перв и чного клю чев ого поля. Д ля этого над о перейти на в клад ку AutoIncrement и помети ть флаг Create Generator. Генераторбуд етсозд ан ав томати чески , его и мяи начальноезначени е мож но при необход и мости отред акти ров ать.
Н а в клад ке Trigger отметьте флаг Create Trigger, что при в ед ет каналоги чному результату:
Зд есь бы л созд ан три ггер, в ы полняю щ и йся после собы ти я в став ки нов ой запи си и заполняю щ и й клю чев оеполенов ой запи си уни кальны м значени ем. Н а в сяки й случай сгенери руйте тем ж е способом и храни мую процед уру (в клад ка Procedure) д ля перед ачи значени я генератора в о в неш ню ю сред у, напри мер, в кли ентскоепри лож ени е.
12 CREATE PROCEDURE SP_GEN_CUSTOMERS_ID RETURNS (ID INTEGER) AS BEGIN ID = GEN_ID(GEN_CUSTOMERS_ID, 1); SUSPEND; END
Генераторы , три ггеры и храни мы е процед уры мож но такж е созд ав ать и в ручную (через окно Database Explorer). При созд ани и три ггеров и храни мы х процед уроткры в ается уд обны й ред акторс си нтакси ческой под св еткой и ни спад аю щ и ми спи сками под сказок. В неш ни й в и д ред актора пред став лен на ри сунке (см. ни ж е). О тмети м, что ред акти руется только тело три ггера. Н азв ани е табли цы и собы ти ед лятри ггера (After Insert и т.п.) в ы би раю тсяи з спи сков .
А налоги чны е д ейств и я мож но в ы полни ть д ля в сех созд ав аемы х табли ц. При необход и мости мож но созд ать д ополни тельны е три ггеры , напри мер, д ля каскад ны х в озд ейств и й и ли в ед ени ястати сти ки . Замети м, что д ля каж д ого д ейств и я по созд ани ю табли ц и д руги х объектов мож но просмотреть соотв етств ую щ и й оператор опред елени я д анны х на заклад кеDDL. Д ейств и е в ступаетв си лу послепри менени я (кнопка с«молни ей» на панели в в ерхней части окна). 1.6. Вы п о л нени е SQL-зап ро со в В IBExpert сущ еств уетнесколько способов в ы полнени яоператоров язы ка SQL. И нструмент SQL Editor (клав и ш а F12) наи более уни в ерсален и пред назначен д ля в ы полнени я прои зв ольны х операторов созд ани я, в ы борки , мани пули ров ани яи управ лени яд анны ми .
13 И нструмент Query Builder (пункт меню Tools) уд обно и спользов ать, как след ует и з назв ани я, д ля в и зуального построени я запросов SELECT. В клад ка Builder пред назначена д ля конструи ров ани я запроса, в клад ка Edit – д ля просмотра и ред акти ров ани яего текста, Result – просмотра результата. Д ляв ы полнени я запроса наж ми те F9, но перед эти м убед и тесь, что нуж ная база д анны х (NewSklad) в ы брана в лев ом в ерхнем углу окна:
И нструмент Script Executive и спользуется д ля ред акти ров ани я и в ы полнени я скри птов – послед ов ательностей SQL-операторов . Н апри мер, у В ас и меется скри пт д ля созд ани я базы д анны х, полученны й при помощ и си стемы Caseпроекти ров ани я ERWIN. Скри птхрани тся в текстов ом файле sklad.sql и сод ерж и тд в а оператора Create Table. Загрузи теэтотфайл в Script Executive.
Запусти те скри пт с помощ ью клав и ш и F9. В окне DataBase Explorer появ ятся д в е созд анны е скри птом табли цы , которы е мож но в д альнейш ем мод и фи ци ров ать, д обав и в , напри мер, ограни чени ессы лочной целостности .
14
1.7. У п равл ени е п о л ьзо вател ями К аж д ы й сервер InterBase и меет пользов ателя SYSDBA с ад ми ни страти в ны ми полномочи ями . Пароль - masterkey. Сначала это ед и нств енны й ав тори зов анны й пользов атель на сервере. И он д олж ен ав тори зов ать (зареги стри ров ать) д руги х пользов ателей. Т олько пользов атель SYSDBA и меет прав а на д обав лени е, мод и фи каци ю и уд алени епользов ателей. И м енап о ль зо в ат елей могутбы ть д ли ной д о 31 си мв ола, неяв ляю тся чув ств и тельны ми ксменереги стра, но нед олж ны сод ерж ать пробелов . П а рол и чув с т в и т ел ьны к реги с т ру букв . Знач ени е и меют то л ько п ервы е 8 си мво л о в п аро л я, но д ли на паролямож етд ости гать 32 си мв олов . Рассмотри м основ ны еопераци и ад ми ни стри ров ани яInterBase. 1.7.1. С м енап аро ля адм инис т рат о ра О бы чно это самая первая операци я после установ ки сервера. В ы бери те в глав ном меню Tools – User Manager. В появ и в ш емся окне в в од и м SYSDBA и masterkey. В ы д еляем пользов ателя(пока он только од и н) и ж мем Edit.
В в од и м и под тв ерж д аем нов ы й пароль. Е сли в IBExpert уж е бы ли зареги стри ров аны базы д анны х со стары м паролем, то и х в се при д ется перереги стри ров ать, и наче соед и нени е не буд ет установ лено. В этом – смы сл появ ляю щ егося на экране пред упреж д ени я. Пароль не мож ет бы ть пусты м и состоящ и м и з пробелов !
15 1.7.2. До бав ление но в о го п о ль зо в ат еля В окнеUser Manager наж и маем Add и д обав ляем и нформаци ю
Н ов ы й пользов атель 4k4gr смож етсозд ав ать базы д анны х и реги стри ров ать и х, после чего он станет и х в лад ельцем (owner) с прав ом полного д оступа. При соед и нени и c базой д анны х 4k4gr буд етуказы в ать св ои учетны ед анны е. В лад елец базы д анны х мож ет пред остав лять при в и леги и д оступа ксв оей БД д руги м пользов ателям, разреш аяи ли запрещ аяи м отд ельны еопераци и . 1.7.3. П редо с т ав ление п рив илегий Под клю чени е кБД не означает ав томати ческую в озмож ность ред акти ров ани я, и д аж еотображ ени яд анны х. При в и леги и д олж ны бы ть зад аны яв ны м образом; пользов атели не смогут обращ аться ни код ному объекту БД , пока не получат соотв етств ую щ и епри в и леги и . При в и леги и , д анны еспеци альному «пользов ателю » PUBLIC, при мени мы д ляв сех пользов ателей. Сначала только созд атель табли цы (owner) и меетд оступ кд анны м, но он мож ет назначать при в и леги и д руги м пользов ателям (пред остав лять грант). Grant (англ.) – д ар, пред остав лени е, субси д и я. О д нои менны й SQL-операторGRANT назначает при в и леги и д оступа разли чны м субъектам безопасности - конкретны м пользов ателям, ролям (см. п. 3.4), а такж е храни мы м процед урам и три ггерам. О бъектами безопасности (охраняемы ми объектам), ккоторы м при меняетсяGRANT, могутбы ть табли цы цели ком, столбцы табли ц, три ггеры , храни мы е процед уры , просмотры . SQL-операторREVOKE уд аляетранеепред остав ленны епри в и леги и д оступа. При ви л еги я
Р азреш ает п о л ьзо вател ям …
SELECT DELETE INSERT UPDATE EXECUTE
Просматри в ать строки в табли цеи ли просмотре У д алять строки В став лять строки И зменять в сеи ли указанны естолбцы В ы полнять храни мы епроцед уры
REFERENCES
ALL
16 Созд ав ать в неш ни й клю ч, которы й ссы лается на указанны й перви чны й клю ч табли цы , д аж е если пользов атель неяв ляетсяеев лад ельцем О бъед и няет SELECT, DELETE, INSERT, UPDATE, и REFERENCES
При в и леги и мож но назначать в д и алогов ом реж и меспомощ ью IBExpert. В ы зов и тев глав ном меню и нструментTools - Grant Manager. О ткроетсяокно:
К акв и д и м, первоначально в сеправ а и мею тсятолько у SYSDBA. У пользов ателей 4k4gr и PUBLIC и х нет:
Н азначени епри в и леги й прои зв од и тсяд в ойны м щ елчком ли бо в ы бором и з контекстного меню и ли с и спользов ани ем панели и нструментов . К нопки с и зо-
17 браж ени ем «лад они » означаю т Grant WITH GRANT OPTION. Пользов атель, облад аю щ и й таки ми при в и леги ями , мож ет пред остав лять указанную при в и леги ю д руги м пользов ателям. При в и леги и могут назначаться какпо отнош ени ю ктабли цам, таки котд ельны м колонкам (см. ни ж ню ю часть окна). 1.7.4. И с п о ль зо в ание ро лей. Роль – это аналог группы пользов ателей в Windows 2000/XP. Рекоменд уется при в и леги и назначать и менно ролям, а не пользов ателям. Д ейств и тельно, роли хранятся в самой базе д анны х, а пользов атели – в служ ебной базе isc4.gdb, которая у каж д ого сервера св оя. Поэтому при переносеБД на д ругой серв ерроли сохраняю тся, а пользов атели – нет. Е сли прав а д аны неролям, а пользов ателям, то потребуется и х назначать занов о. При и спользов ани и ж е ролей д остаточно буд етв клю чи ть в и х состав нов ы х пользов ателей, при в и леги и менять нетнеобход и мости . Созд ад и м в качеств е при мера роли Manager и Guest. Д ля созд ани я ролей служ и тв клад ка Roles и нструмента User Manager.
Д ляв клю чени япользов ателей в состав роли перейд и тена в клад ку Membership и отметьтесоотв етств ую щ и й флаж ок.
В ы борфлага With ADMIN OPTION означает, что пользов атель, в клю ченны й в состав роли , буд ети меть в озмож ность назначени я, отзы в а и уд алени яроли , т.е. станетееад ми ни стратором. Н азначени е при в и леги й д ля ролей в ы полняется с помощ ью Grant Manager, как и д ляобы чны х пользов ателей. Замеч ани е. Е сли пользов атель и меет при в и леги и д оступа кБД только через роль, то и мяроли д олж но бы ть указано при лю бом соед и нени и сбазой д анны х,
18 напри мер, при и спользов ани и операторов SQL, в окне реги страци и IBExpert, в компонентах кли ентски х при лож ени й и т.п. 1.8. Со здани е UDF Поми мо в строенны х простейш и х функци й язы ка SQL, таки х какmin(), max(), avg(), InterBase под д ерж и в ает би бли отеки в неш ни х функци й UDF (функци й, опред еляемы х пользов ателем). UDF сущ еств енно расш и ряю т в озмож ности язы ка SQL. Н апри мер, в состав Firebird в ход ят UDF математи чески х и календ арны х функци й. UDF мож но созд ав ать с помощ ью лю бы х компи ляторов (С, Delphi, 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(длина)…]] RETURNS {datatype [BY VALUE] | CSTRING(длина)} [FREE_IT] ENTRY_POINT ‘entryname’ MODULE_NAME ‘modulename’;
А ргумент Name
О пи сани е И мяUDF д ляи спользов ани яв SQL-операторах; мож етотли чатьсяоти мени , указанного после
19 ENRT_POINT
Datatype
Т и п в ход ного и ли в озв ращ аемого параметра
RETURNS
О пред еляетв озв ращ аемоефункци ей значени е
О пред еляет, что в озв ращ аемы й результатд олж ен перед ав атьсяпо значени ю CSTRING(д ли на) У казы в аетсяд ляпараметров строков ого ти па Послезав ерш ени яработы UDF осв обож д аетпамять, FREE_IT в ы д еленную под в озв ращ аемоепо ссы лкезначени е, Строка в кав ы чках, опред еляю щ аяи мяфункци и в ‘entryname’ и сход ном код екаконо храни тсяв би бли отеке; О пи сани ефайла, и д енти фи ци рую щ ееби бли отеку, в ‘modulename’ которой храни тсяUDF BY VALUE
Замеч ани е: Н ачи ная с InterBase 6, UDF д олж ны храни ться только в папке ..\InterBase\udf . К огд а UDF созд ана и объяв лена в БД , ее мож но и спользов ать в операторах SQL, в храни мы х процед урах и три ггерах. Д ля этого след уетв став и ть ее и мя в соотв етств ую щ ее место SQL-оператора, заклю чи в в ход ны е параметры в круглы ескобки . Прод емонстри руем под клю чени е и и спользов ани е UDF на при мере и зв естной би бли отеки caseudf.dll. Просмотри м и сход ны й текст би бли отеки . К акв и д и м, это - обы чнаяDLL, напи саннаяна Delphi. library caseudf; { Copyright Dmitry Kuzmenko, Epsylon Technologies } { e-mail:
[email protected], web: http://ib.demo.ru } { вообще о копирайте на такие функции говорить смешно, так что пользуйтесь на здоровье } uses Windows, SysUtils; function UpCase(CStr: PChar): PChar; cdecl; export; begin CharUpperBuff(CStr, Length(CStr)); Result:=CStr; end; { другие функции, а также комментарии и инструкции автора для краткости опущены } exports UpCase; begin isMultiThread:=True; end.
20 В DataBase Explorer в ы берем пункт UDFs – New и заполни м откры в ш ую ся форму ред акти ров ани я в соотв етств и и с ее объяв лени ем в DLL:
Сгенери ров анноеобъяв лени еUDF на SQL, запи санноена в клад кеDDL, буд ет и меть в и д : DECLARE EXTERNAL FUNCTION UPCASE CSTRING(255) RETURNS CSTRING(255) ENTRY_POINT 'UpCase' MODULE_NAME 'CASEUDF.DLL'
О бы чно ав торы UDF не при лагаю т кфайлу *.dll и сход ны й код , а пред остав ляю ттолько в ы ш епри в ед енны й SQL-оператор, что в полнед остаточно. При мер и спользов ани яUDF в SQL Builder:
2. Н апи с ани е кли ентс ки х пр и ло ж ени й Н аи более эффекти в ны м способом созд ани я при лож ени й яв ляю тся прямы е в ы зов ы функци й API кли ента и з при лож ени й. Х орош и м при мером такого способа яв ляется сама программа IBExpert, напи санная, по косв енны м при знакам, на Delphi. О д нако в пов сед нев ной практи ке горазд о уд обнее и спользов ать компонентно-ори енти ров анны е технологи и , основ анны ена станд артны х технологи ях д оступа кд анны м. Д ля разработчи ка в аж но, что под д ерж ка InterBase в строена в о в сесущ еств ую щ и естанд арты д оступа кд анны м со стороны кли ента – ADO, ADO.NET, ODBC, JDBC, BDE, DbExpress и д р. В Delphi и мею тся компоненты д ля д оступа через ADO, BDE и DbExpress. Прав д а, технологи я BDE в настоящ еев ремя устарела и необеспечи в аеттребуемой прои зв од и тельности . Д ля д оступа через ADO необход и мо установ и ть в Windows ADO-пров айд ер д ля InterBase (в озмож ны е в ари анты см. на сайте www.ibase.ru). У ни в ерсальная
21 компонентная технологи я DbExpress, офи ци ально рекоменд уемая Borland, позв оляет созд ав ать компактны е и бы стры е кроссплатформенны е при лож ени я, но и меетнекоторы енеуд обств а и ограни чени я. Д алее мы буд ем рассматри в ать специ али зи ров анны е компоненты Interbase Express (IBX), постав ляемы е в состав е Delphi и умею щ и е работать только с InterBase. А льтернати в ны е специ али зи ров анны е компоненты FIBPlus от компани и Devrace более функци ональны , но они яв ляю тся самостоятельны м платны м программны м прод уктом, которы й след уетпри обретать отд ельно. 2.1. Структура п ри л о ж ени я Структура и код при лож ени я при разли чны х технологи ях д оступа од ноти пны , так как компоненты д оступа к д анны м в Delphi, буд учи потомками класса TDataSet, и мею т много общ и х черт со став ш и ми класси чески ми BDEори енти ров анны ми компонентами . Н аи более и нв ари антны участки код а, св язанны еспои ском, просмотром и ред акти ров ани ем д анны х. Н еобход и мо учи ты в ать след ую щ и еособенности IBX. О бязат ел ьны м яв л яет с я компонент IBDataBase, сод ерж ащ и й параметры соед и нени я ссервером (и мя сервера, протокол, путь кБД , и мя и пароль), которы еустанав ли в аю тсяв окнеDataBase Component Editor, в ы зы в аемом при д в ойном щ елчкепо компоненту.
Эти значени я мож но в в ести такж е программно и ли с помощ ью и нспектора объектов . Н апри мер, путь к базе д анны х на сервере c1r214srv:D:\IB\4gr\MyBase\NewSklad.gdb храни тся в св ойств е DataBaseName рассматри в аемого компонента.
22 Н а этапе отлад ки не забуд ьте установ и ть св ойств о LoginPrompt в False, что ли ш и тВ ассомни тельного уд ов ольств и ямногократно наби рать и мя и пароль при запусках программы . Н а зав ерш аю щ ем этапе разработки при под готов ке программы кразв ерты в ани ю , наоборот, след ует очи сти ть компонент IBDataBase от параметров соед и нени я с базой д анны х, пред усмотрев и х в в од в д и алогов ом реж и ме (см. при мерв разд еле 3). В проти в ном случае при установ ке программы на нов ы й компью тер, скореев сего, потребуетсяееперекомпи ляци я. Об язател ьны м в п ри л о ж ени и яв ляется компонент IBTransaction, с помощ ью которого прои сход и т управ лени е транзакци ями . К омпонент IBDataBase св язы в аетсясобъектом IBTransaction через св ойств о property DefaultTransaction: TIBTransaction. К роме того, ссы лку на IBTransaction над о указать в св ойств ах Transaction: TIBTransaction наборов д анны х (IBQuery, IBTable и д р.). В при лож ени и мож ет бы ть несколько объектов -транзакци й, поэтому каж д ы й наборд анны х мож ет органи зов ы в ать св ои собств енны е, незав и си мы е от д руги х наборов транзакци и . Стартует транзакци я в ы зов ом метод а StartTransaction и ли установ кой св ойств а компонента TIBTransaction Active:= True. Н о запусктранзакци и прои сход и т такж е и неяв но при акти в и заци и соед и нени я, прои сход ящ ей при откры ти и наборов д анны х, св язанны х с компонентом IBTransaction, напри мер, при в ы зов е tbCust.Open. При в ы зов е метод ов Commit (под тв ерж д ени етранзакци и ) и ли RollBack (откат) св язанны енаборы д анны х закры в аю тся, а при и х нов ом откры ти и запускается нов ая транзакци я. Поэтому след уетобязательно пров ерять, незапущ ена ли ранеетранзакци яд руги ми способами (в лож енны е транзакци и не д опускаю тся!). Д ля этой цели служ и тсв ойств о компонента IBTransaction property InTransaction: Boolean. Пров ери в его значени е, мож но такж е си гнали зи ров ать об акти в ности транзакци й запросами , сообщ ени ями т.п. О пи ш ем кратко особенности компонентов д оступа кд анны м. 2.2. Ко мп о ненты до ступ а к данны м 2.2.1. TIBTable К омпонент TIBTable форми рует в и ртуальную табли цу, аналог фи зи ческой табли цы БД . К омпонент при откры ти и набора д анны х неяв но в ы зы в ает операторSELECT * FROM Таблица, что при в од и тккопи ров ани ю в сех д анны х на
23 кли ентски й компью тер. Поэтому д ля больш и х табли ц этот компонент и спользов ать не рекоменд уется. О снов ны е св ойств а и метод ы сов пад аю т с TTable. Полож и тельнаяособенность - при год ность д ля отображ ени янетолько табли ц, но и просмотров (View). Н ачи ная с в ерси и Delphi 7, и справ лена д осад ная ош и бка при работе с фи льтрами . 2.2.2. TIBQuery Н аборд анны х, в озв ращ аемы й TIBQuery, в сегд а, незав и си мо от ти па запроса, и меет значени е св ойств а ReadOnly, рав ное True, что препятств ует его непосред ств енному ред акти ров ани ю . Д ля ред акти ров ани я наборов д анны х, в озв ращ аемы х TIBQuery, послед ни й над о обязательно св язы в ать с компонентом TIBUpdateSQL, незав и си мо от того, и спользуется кэш и ров ани е и зменени й и ли нет. К омпонент TIBUpdateSQL размещ ается в мод уле д анны х. И мя экземпляра TIBUpdateSQL указы в ается в св ойств е UpdateObject компонента TIBQuery. Д алее в Update SQL Editor необход и мо ав томати чески сгенери ров ать и ли в ручную пропи сать мод и фи ци рую щ и еSQL-запросы . 2.2.3. TIBDataSet Д анны й компонент объед и няет функци ональность IBTable, IBQuery и IBUpdateSQL, яв ляясь наи более «прод в и нуты м» . Т екст SQL-запроса храни тся в св ойств еSelectSQL ти па TStrings (при чем, форми руется он уд обны м ред актором). В озмож ности IBUpdateSQL обеспечи в аю тся ред актором набора д анны х, в ы зы в аемом в контекстном меню и работаю щ ем такж е, какв обы чном UpdateSQL. SQL-операторы мод и фи каци и Н Д запи сы в аю тсяв соотв етств ую щ и есв ойств а InsertSQL, ModifySQL, DeleteSQL. И нтересной особенностью компонентов IBQuery и IBDataSet яв ляется в озмож ность непосред ств енного в ы зов а генератора д ля заполнени яперви чного клю чев ого поля. Зд есь и спользуетсясв ойств о property GeneratorField: TIBGeneratorField, в котороеслед уетзапи сать и мя клю чев ого поляи и мягенератора (это уд обнее сд елать спомощ ью и нспекторобъектов ). Е сли д ляд анной цели опред елен такж еи три ггер, то он перепи ш етв став ленноезначени е. 2.2.4. TIBSQL К омпонент пред назначен д ля бы строго в ы полнени я SQL-запросов . В отли чи е отрассмотренны х компонентов , яв ляю щ и хсяпотомками TDataSet, он прои сход и т непосред ств енно от TСomponent, не умеет отображ аться в в и зуальны х
24 компонентах и и спользует од нонаправ ленны й курсор. Перемещ ени е по набору д анны х, в озв ращ аемому компонентом, прои сход и т только в од ном направ лени и – в ни з, с и спользов ани ем метод а Next. В ы полняется запрос при в ы зов еметод а ExecQuery. 3. П р и мер пр о гр амми р о в ани я 3.1. Предметная о б л асть В качеств е при мера рассмотри м зад ачу ав томати заци и отпуска тов ара со склад а. Ц ели д анного пособи янетребую т учета в сех особенностей пред метной области , поэтому упрости м зад ачу д о ми ни мально в озмож ны х пред елов . Пред полож и м, что БД состои т и з трех табли ц (заказчи ки , заказы и и зд ели я), св язанны х по клю чам Cust_ID и Prod_ID. К аж д ы й заказчи кмож ет сд елать несколько заказов , а каж д ы й тов армож ет бы ть прод ан нескольки м заказчи кам. А нони мны е прод аж и не д опускаю тся. Т ов арпрод ается пош тучно, при чем нельзя прод ать тов ар, которого нет на склад е. Л оги ческая структура БД в нотаци и си стемы Case-проекти ров ани я Erwin при в ед ена на ри сунке. (Замети м, что в состав еIBExpert и меетсяпод обны й и нструмент Database Designer).
В д анном случае заказ (Order) мож ет состоять только и з од ного тов ара (Product), что яв ляется наи более серьезны м ограни чени ем пред став ленной мод ели , которое мож но преод олеть в в ед ени ем ещ е од ной табли цы «Д етали заказа» . Разв ернуты й и более функци ональны й д емонстраци онны й при мер базы д анны х «Заказы » мож но найти , напри мер, в папке ..\Borland\Delphi7\Demos\Db\IBMastApp в установ очной д и р ектори и Delphi (соотв етств ую щ и й файл БД наход и тся в папке ..\Borland\Borland Shared\Data\mastsql.gdb).
3.2. Структура БД Структура БД д ляпред метной области сучетом особенностей язы ка SQL серв ера InterBase мож етбы ть опи сана спомощ ью след ую щ его скри пта:
25 SET
TERM
^;
/*
Ус т анав лив ает
разделит ель м еж ду о п ерат о рам и */
/* Т абли цы */ CREATE TABLE Customers ( Cust_ID INTEGER NOT NULL, CustName VARCHAR(20) NOT NULL, Address CHAR(40), PRIMARY KEY (Cust_ID)
)^ CREATE TABLE Products ( Prod_ID INTEGER NOT NULL, ProductName VARCHAR(20) NOT NULL, Price DECIMAL(10,2) NOT NULL CHECK (Price > 0), /* Остаток на складе */ Rest INTEGER NOT NULL CHECK (Rest >= 0), PRIMARY KEY (Prod_ID) )^ CREATE TABLE Orders ( Num INTEGER NOT NULL, Cust_ID INTEGER NOT NULL, Prod_ID INTEGER NOT NULL, ProdCount INTEGER NOT NULL CHECK (ProdCount > 0), Total NUMERIC(10,2) NOT NULL,/*Итого в у.е.*/ SaleDate DATE NOT NULL, PRIMARY KEY (Num), FOREIGN KEY (Cust_ID) REFERENCES Customers, FOREIGN KEY (Prod_ID) REFERENCES Products )^
/* Генерат о ры */ CREATE GENERATOR GEN_CUSTOMERS_ID ^ SET GENERATOR GEN_CUSTOMERS_ID TO 0 ^ CREATE GENERATOR GEN_ORDERS_ID ^ SET GENERATOR GEN_ORDERS_ID TO 0 ^ CREATE GENERATOR GEN_PRODUCTS_ID ^ SET GENERATOR GEN_PRODUCTS_ID TO 0 ^
/* Х рани мы епроцед уры */ CREATE PROCEDURE SP_GEN_CUSTOMERS_ID RETURNS (ID INTEGER) AS BEGIN ID = GEN_ID(GEN_CUSTOMERS_ID, 1); SUSPEND; /* Во зв ращ ает значение генерат о ра*/ END ^
/* Т ри ггеры */ CREATE TRIGGER PRODUCTS_BI FOR PRODUCTS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.PROD_ID IS NULL) THEN NEW.PROD_ID = GEN_ID(GEN_PRODUCTS_ID,1); END ^
26 CREATE TRIGGER PRODUCTS_AD0 FOR PRODUCTS ACTIVE AFTER DELETE POSITION 0 AS begin /* Каскадное удаление заказов на удаленный товар */ delete from Orders where orders.prod_id = products.prod_id; end ^ CREATE TRIGGER ORDERS_BI FOR ORDERS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.NUM IS NULL) THEN NEW.NUM = GEN_ID(GEN_ORDERS_ID,1); END ^ COMMIT ^ SET TERM ; ^
Д ля созд ани я перечи сленны х объектов в ы полни те скри пт в окне Script Executive и ли в оспользуйтесь д и алогов ы ми сред ств ами IBExpert. Задани е. Перепи ш и те операци ю отпуска тов ара с помощ ью три ггера, ав томати чески уменьш аю щ его остатоктов ара на склад епослев став ки нов ого заказа. 3.3. Кл и ентская ч асть 3.3.1. Н ас т ро йкам о дуля данных После созд ани я мод уля д анны х (пункт меню File – New – Data Module) располож и м на нем компоненты д оступа кд анны м. При в ы боре и мен компонентов зд есь и д алеебуд ем пользов атьсяв енгерской нотаци ей. Префи ксds и спользуем д ляти пов TDataSorce, id – TIBDataSet, iq – TIBQuery, и т.д .
1. Н астройте компонентсоед и нени я idbSklad: TIBDatabase и компонент управ лени ятранзакци ями itaSklad: TIBTransaction. При начальной отлад ке в оспользуйтесь д ля настройки idbSklad ред актором DataBase Editor
(см.п.2.1), в котором пользов ателяи пароль.
27 укаж и те параметры соед и нени я, в клю чая и мя
Св ойств о Значени е DatabaseName D:\IB\4gr\MyBase\NewSklad.gdb LoginPrompt False DefaultTransacti ItaSklad on После того, как программа буд ет полностью отлаж ена, в ы зов и те DataBase Editor и очи сти те в нем в се поля. О ни буд ут заполняться при запуске программы . 2. Н астройтекомпонентiqInsert , и спользуемы й д ляв став ки нов ы х запи сей в табли цу Product, и компоненты idCust, idOrders, idProduct, св язав и х сбазой д анны х: Database
IdbSklad
Transaction
itaSklad
3. Д ляобъектов idCust, idOrders, idProduct ти па TIBDataSet укаж и тев св ойств ах SelectSQL запросы в и д а select * from <имя соответствующей таблицы>. 4. И спользуя DataSet Editor (контекстное меню компонентов idCust, idOrders, idProduct), опред ели те д ейств и я по ред акти ров ани ю наборов д анны х. Д ляпри мера рассмотри м компонентidCust.
К нопка Get Table Fields заполняетполями табли цы области на экранеKey Fields и Update Fields. В о в торой области указы в аю тся ред акти руемы е поля. К акпра-
28 в и ло, мож но остав и ть в се поля. В области слев а необход и мо в ы брать клю чев ы еполя, по которы м буд етпрои сход и ть пои скв табли це. Н аж ав кнопку Select Primary Keys, в ы берем д ляпои ска перви чны й клю ч. При в ы бореDatasets Defaults пои скбуд етпров од и тьсяпо в сем полям. Н аж ав кнопку Generate SQL, получи м SQL-операторы д ля обнов лени я Н Д , которы е мож но просмотреть и при необход и мости отред акти ров ать на в клад ке SQL. Сами операторы хранятся в св ойств ах SelectSQL, DeleteSQL, InsertSQL, ModifySQL и и мею тв и д , соотв етств енно, select * from CUSTOMERS delete from CUSTOMERS where
Cust_ID = :OLD_Cust_ID insert into CUSTOMERS (Cust_ID, CustName, Address) values (:Cust_ID, :CustName, :ADDRESS) update CUSTOMERS set Cust_ID = :Cust_ID, CustName = :CustName, ADDRESS = :ADDRESS where Cust_ID = :OLD_ Cust_ID Параметрами запросов (напри мер, :Cust_ID) яв ляю тсяполянабора д анны х, значени я которы х под став ляю тся в поля табли цы на сервере. При став ка OLD означаетобращ ени екстарому значени ю поляи з набора д анны х (д о ред акти ров ани я), скоторы м срав ни в аетсяполеи з табли цы на сервере. Заполни те св ойств о GeneratorField, указав и мя генератора GEN_CUSTOMERS_ID, и мя клю чев ого поля Cust_ID и собы ти е On New Record.
А налоги чны м образом настройтекомпоненты idOrders, idProduct. 5. Д ляред акти ров ани язаказчи ков в клю чи м реж и м кэш и ров ани яи зменени й, установ и в св ойств о CachedUpdates компонента idCust в True. К эш и ров ани еи зменени й означает, что запи си на серверемогути зменятьсягруппами , которы е буд ут переноси ться и з при лож ени я на серв ер отд ельной команд ой. В д анном случае мож но буд ет д обав лять сразу несколько заказчи ков , но в базе д анны х они появ ятся только послев ы зов а метод а ApplyUpdates компонента idCust.
29 Д ля компонентов idOrders, idProduct остав и м обы чны й реж и м ред акти ров ани я, установ и в CachedUpdates рав ны м False. 6. Д ля компонентов idCust, idOrders, idProduct созд айте ти пи зи ров анны е поля (напри мер, idСustAddress: TStringField и остальны е), и спользуя ред акторполей Fields Editor. Fields Editor в ы зы в ается в контекстном меню упомянуты х компонентов . Д обав ьтев состав ти пи зи ров анны х полей (Т П) в се поля набора д анны х. И мена Т П строятся по при нци пу ИмяНД+ИмяПоля и в клю чаю тся в опи сани е мод уля д анны х. О чев и д ны м преи мущ еств ом д анного под ход а яв ляетсяконтроль компи лятора за корректностью обращ ени й кполям. 7. У станов и те св ойств о DataSource объектов dsCust, dsOrder, dsProduct, в idCust, idOrders, idProduct, соотв етств енно. 3.3.2. Взаим о дейс т в ие с п о ль зо в ат елем Гл авная ф о рма п ри л о ж ени я
Н а глав ной форме располож ены кнопки sbAdd, sbOtp, sbArc, spQuit: TspeedButton, реали зую щ и е функци и – при ход (мод уль AddUnit), расход (OtpUnit), архи в (ArcUnit), в ы ход . В глав ном меню функци и кнопокпрод убли ров аны . У станов ка соед и нени я с БД в ы полняется при в ы боре пункта «И нструменты Соед и нени е» . Запускается форма соед и нени я (frmConnect), и мею щ ая на этаперазработки след ую щ и й в и д
Д ляв в од а паролязд есь и спользуетсякомпонентMaskEdit. И нформаци яо соед и нени и запи сы в аетсяв компоненты edtDatabase: TEdit; //Полное имя БД с указанием сервера (см.стр 6)
30 edtUser: TEdit; // Имя пользователя edtRole: TEdit; //Роль пользователя medtPassword: TMaskEdit; // Пароль В обработчи ксобы ти яOnClick кнопки Ok запи ш и те: if dlgOpen.Execute then edtDatabase.Text := dlgOpen.FileName; Соед и нени ев ы полняетсяв глав ной формев обработчи кепункта глав ного меню : procedure TMainForm.ConnectClick(Sender: TObject); begin with frmConnect, dm do if ShowModal = IDOK then begin itaSklad.Active := false; IdbSklad.Connected := false; idbSklad.DatabaseName := edtDatabase.Text; idbSklad.Params.Clear; idbSklad.Params.Add(Format('USER_NAME=%s', [edtUser.Text])); idbSklad.Params.Add(Format('PASSWORD=%s', [medtPassword.Text])); if edtRole.Text <> '' then idbSklad.Params.Add(Format('ROLE=%s', [edtRole.Text])); idbSklad.Connected := true; itaSklad.Active := true; end; end; У пра ж нени я. Запрограмми руйте д оступность кнопокопераци й с БД в зав и си мости отнали чи я сней соед и нени я. Пред усмотри тебезопасное хранени епараметров соед и нени я в конфи гураци онном файле и ли си стемном реестре, чтобы нев ы зы в ать д и алог соед и нени япри каж д ом запускепрограммы . Фо рма п ри хо да тов ара на склад и меетв и д
31 и раскры в аетсяпри наж ати и кнопки
sbAdd глав ного меню procedure TMainForm.sbAddClick(Sender: TObject); begin // При добавлении товара SQL-операторы with DM.iqInsert do // Добавление товара на склад if AddForm.ShowModal=mrOK then begin // Проверяем наличие на складе Close; SQL.Clear; SQL.Add('SELECT * FROM Products WHERE ProductName = :p1 and Price = :p2'); ParamByName('p1').value:=AddForm.Edit1.Text; ParamByName('p2').value:=AddForm.Edit2.Text; Open; if IsEmpty then begin //Если нет, то добавляем CLose; SQL.Clear; SQL.add('INSERT INTO Products (ProductName, Price, Rest) values (:p1, :p2, :p3)'); ParamByName('p1').value:=AddForm.Edit1.Text; ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); ExecSQL; end else // Если есть, то увеличиваем количество begin CLose; SQL.Clear; SQL.add('UPDATE Products SET Rest = Rest+ :p3 WHERE (ProductName = :p1) and (Price = :p2)'); ParamByName('p1').value:=AddForm.Edit1.Text; ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); ExecSQL; end; end; end;
Д лялучш ей и ллю страци и матери ала мод ули AddUnit, OtpUnit, ArcUnit и спользую т разли чны е способы д оступа кд анны м. Н епосред ств енны й в ы зов SQL-операторов , и спользов анны й в ы ш е, обеспечи в ает наи более бы стры й д оступ. Н о след ует помни ть, что под обны й код некорректен, его след ует о б язател ьно до п о л нять п ро верко й вво ди мы х данны х (что В ы сейчас сд елаете в качеств е упраж нени я). В этом плане более уд обны компоненты , и спользуемы е нами при программи ров ани и форма отпуска тов аров . Фо рма о тп уска тов ара и меетв и д
32
и в ы зы в аетсяв обработчи ке procedure TMainForm.spOtpClick(Sender: TObject); begin OtpForm.ShowModal; end;
К омпонентdblcCust: TDBLookUpComboBox служ и тд лязанесени яв заказы код а заказчи ка, в ы би раемого и з табли цы кли ентов , и настраи в ается след ую щ и м образом: Св ойств о
Значени е
При мечани е
DataField DataSource
Cust_ID DM.dsOrders
В какоеполеи в какой Н Д запи сы в ается
KeyField
Cust_ID
Ч то запи сы в ается
ListField
CustName;Address
Ч то отображ аетсяв спи ске
ListSource
DM.dsCust
О ткуд а берется
К омпонентdblcProduct в ы полняетту ж ефункци ю , но д анны еберети з табли цы и зд ели й. Св ойств о
Значени е
При мечани е
DataField DataSource
Prod_ID DM.dsOrders
В какоеполеи в какой Н Д запи сы в ается
KeyField
Prod_ID
Ч то запи сы в ается
ListField
ProdName;Price;Rest
Ч то отображ аетсяв спи ске
ListSource
DM.dsProduct
О ткуд а берется
К омпонентdeCount: TDBEdit пред назначен д ляв в од а коли честв а тов аров в св язанноесни м полеБД :
33 Св ойств о
Значени е
При мечани е
DataField DataSource
ProdCount DM.dsOrders
В какоеполеи в какой Н Д запи сы в ается
Больш и м преи мущ еств ом TDBEdit по срав нени ю собы чны ми TEdit яв ляется его «ти пи зи ров анность» : в в од си мв олов , нед опусти мы х д ля св язанны х с компонентом д анны х, блоки руется. К омпонент dp: TdateTimePicker и спользуется д ля отображ ени я текущ ей д аты и занесени яеев табли цу заказов . Д алеенапи ш ем простую процед уру (метод класса TOtpForm ), котораяпров еряет состояни е Н Д и , в случае в став ки , д елает д оступны ми элементы управ лени я. procedure TOtpForm.Accessed; var Ins: Boolean; begin // Разрешаем кнопки в зав-ти от состояния НД Ins := dm.idOrders.State in [dsInsert]; dblcCust.Enabled := Ins; dblcProduct.Enabled := Ins; btOrder.Enabled := Ins; btCancel.Enabled := Ins; btAdd.Enabled := Not Ins; btClose.Enabled := Not ins; end; end;
В первы й раз процед ура в ы зы в аетсяпри появ лени и формы на экране: procedure TOtpForm.FormShow(Sender: TObject); begin Accessed; end;
О бработчи кнаж ати якнопки «Д обав и ть пустой» : procedure TOtpForm.btAddClick(Sender: TObject); begin with dm do begin // Переоткрываем НД, что влечет старт транзакции idCust.Close; idCust.Open; idProduct.Close; idProduct.Open; idOrders.Close; idOrders.Open; // Добавляем пустую запись idOrders.Append; end; // О старте транзакции сигнализируем цветом OtpForm.lbCount.Color := clRed;
34 Accessed; end;
При напи сани и обработчи ка наж ати якнопки «В заказ!» учтем, что оформлени е заказа состои ти з операци й в д в ух табли цах (запи си в ж урнал заказов и уменьш ени яостатка на склад е) и д олж но рассматри в атьсякактранзакци я. procedure TOtpForm.btOrderClick(Sender: TObject); var otpusk, ostatok: integer; begin with dm do begin Otpusk := deCount.Field.Value; Ostatok := DM.idProductRest.value; if Otpusk <= Ostatok then begin //Можно продать только то, что есть на складе try // Редактируем новый пустой заказ idOrdersSaleDate.Value := dp.Date; idOrdersProdCount.Value := Otpusk; idOrdersTotal.Value := idProductprice.Value * Otpusk; lbTotal.Caption := idOrdersTotal.AsString; idOrders.Post; // Уменьшаем остаток idProduct.Edit; idProductRest.Value := Ostatok-Otpusk; idProduct.Post; // Подтверждаем транзакцию itaSklad.Commit; except // Откатываем транзакцию itaSklad.RollBack; ShowMessage('Ошибка транзакции!'); end; end //if Otpusk <= Ostatok else begin ShowMessage('На складе нет нужного количества!’); // Откатываем транзакцию dm.itaSklad.RollBack; end; end; // with dm CheckTrans; Accessed; end;
При наж ати и кнопки «О тмена» откаты в аем транзакци ю : procedure TOtpForm.btCancelClick(Sender: TObject); begin dm.itaSklad.RollBack; CheckTrans; Accessed;
35 end;
При и зменени и коли честв а пересчи ты в аем сумму заказа: procedure TOtpForm.deCountChange(Sender: TObject); var Otpusk: integer; begin if deCount.Text <>'' then Otpusk := StrToInt(deCount.Text) else Otpusk := 0 ; try lbTotal.Caption := FloatToStrF( dm.idProductprice.Value * Otpusk, ffFixed, 10, 2); except ShowMessage('Неправильно указано количество!'); end; end;
При закры ти и формы пров еряем акти в ность транзакци и , в ы д аем пред упреж д ени яи зав ерш аем ли бо откаты в аем транзакци ю : procedure TOtpForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if CheckTrans then if MessageDlg ('Имеются незавершенные транзакции. Завершить mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin dm.idOrders.Post; dm.idProduct.Post; dm.itaSklad.Commit; end else dm.itaSklad.RollBack; OtpForm.lbCount.Color := OtpForm.Color; Close; end;
их?’,
Ф ункци япров ерки акти в ности транзакци и : function CheckTrans: boolean; begin Result := dm.itaSklad.InTransaction; if Result then OtpForm.lbOpl.Color := clRed //При активной транзакции меняется цвет else OtpForm.lbOpl.Color := OtpForm.Color; end;
Фо рма архи во в состои т и з трех заклад ок- заказчи ки , заказы и тов ары . Размести те на форме компонент TPageControl. В ы би рая в его контекстном ме-
36 ню пункты New Page, созд айте три заклад ки TTabSheet – tsCust, tsOrders, tsProducts. Располож и те на первой и з ни х сетку д анны х DBGrid и д руги е элементы управ лени я (д в е строки ред акти ров ани я, пять кнопоки группу переклю чателей), какпоказано на ри сунке.
Св яж и те сетки д анны х dgrCust, dgrProduct с соотв етств ую щ и ми и сточни ками д анны х dsCust, dsProduct: TDataSource. Д обав лени е нов ы х заказчи ков буд ет прои сход и ть с помощ ью обы чны х компонентов TEDit. И спользую тсякэш и ров анны еи зменени я. Т аккакзапи сь в ед ется только в од ну табли цу, органи зов ы в ать неяв ную транзакци ю нет необход и мости . Запи ш ем обработчи ки собы ти й, реали зую щ и ефункци и обнов лени я: procedure TArcForm.bApplyClick(Sender: TObject); begin // Если такого заказчика нет if (eName.text<>'') and (eAddress.Text<>'') then with DM do begin // Добавляем в набор данных idCust.Append; idCustCustName.value:=eName.text; idCustAddress.Value:=eAddress.Text; idCust.Post; end else ShowMessage('Имя и адрес обязательны для заполнения!') end; procedure TArcForm.bDeleteClick(Sender: TObject); begin // Удаление заказчика dm.idCust.Delete;
37 end; procedure TArcForm.bbApplyClick(Sender: TObject); begin // Переносим из кэша в базу данных dm.idCust.ApplyUpdates; end; procedure TArcForm.bbCancelClick(Sender: TObject); begin // Отмена изменений dm.idCust.CancelUpdates; end;
Ф ункци и сорти ров ки и пои ска: procedure TArcForm.rgOrderClick(Sender: TObject); begin // Устанавливаем режим сортировки case rgOrder.ItemIndex of 0: dm.idCust.SelectSQL[1]:=''; 1: dm.idCust.SelectSQL[1]:='ORDER BY CustName'; 2: dm.idCust.SelectSQL[1]:='ORDER BY Address'; end; dm.idCust.Close; dm.idCust.Open; end; procedure ArcForm.bLocateClick(Sender: TObject); begin // Поиск заказчика по фамилии DM.idCust.Locate('Name', eName.text,[loPartialKey]); end;
В клад ки «Заказы » и «Т ов ары » функци онально более просты е, на ни х реали зов ан (в табли чной форме) только просмотрзаказов и тов аров соотв етств енно. Н а в клад ке «Заказы » сетка д анны х отображ ает в ы борку и з трех табли ц, полученную с помощ ью запроса, реали зую щ его в нутреннее соед и нени е (см. переменную Query в ли сти нге). Ч тобы не расход ов ать ли ш ни х ресурсов , пропи ш ем запрос в уж е и мею щ и йся у нас компонентiqInsert. Послед ни й св язы в аетсяссеткой посред ств ом в ременного компонента, объяв ляемого в секци и реали заци и мод уляvar ds: TDataSource и созд ав аемого д и нами чески : procedure TArcForm.FormCreate(Sender: TObject); begin // Создаем временный источник данных ds:= TDataSource.Create(self); // Связываем его с набором данных ds.DataSet := dm.iqInsert; // и с сеткой dgrOrders.DataSource := ds; end;
38
О бработчи кщ елчка по группепереклю чателей: procedure TTablForm.rgLinkClick(Sender: TObject); var Query: string; begin // Формируем запрос Query := 'SELECT Customers.Cust_id, Customers.CustName,’ + ‘Products.ProductName, Orders.Total,’ + ‘ Orders.SaleDate FROM customers, orders, products' + ' WHERE (Customers.Cust_id=Orders.Cust_id)' + ' AND (Orders.Prod_ID=Products.Prod_ID)'; with dm,iqInsert do begin Close; Sql.Clear; Sql.Add(Query); // Показываем данные для … case rgLink.Itemindex of 0: begin // текущего заказчика SQL.add('AND (Orders.Cust_Id = :p1)'); ParamByName('p1').value := idCustCust_ID.value; end; 1: begin // текущего товара SQL.add('AND (Orders.Prod_Id = :p1)'); ParamByName('p1').value := idProductProd_ID.value; end;
39 end; Open; end; end;
Ч тобы запрос в ы полнялся каж д ы й раз при появ лени и формы на экране, при св ойте с помощ ью и нспектора объектов обработчи ку собы ти я OnShow формы и ли tsOrders процед уру rgLinkClick. Н аконец, чтобы в сеработало, напи ш ем обработчи ки procedure TArcForm.tsCustShow(Sender: TObject); begin dm.idCust.Close; dm.idCust.Open; end;
и procedure TArcForm.tsDetalShow(Sender: TObject); begin dm.idProduct.Close; dm.idProduct.Open; end;
В неш ни й в и д сетки д лязаказов настройтесамостоятельно.
Задани я для с амо с то ятельно й р або ты Реш ени е каж д ой зад ачи д олж но в клю чать ER-мод ель указанной пред метной области , структуру БД с серверной реали заци ей би знес-прав и л и кли ентское при лож ени е. 1. Би бли отека 2. В и д еотека 3. И нформаци онно-пои сков аяси стема 4. М узы кальны еальбомы 5. О тд ел кад ров 6. Распред елени еучебной нагрузки 7. Брони ров ани еав и аби летов 8. Гости ни ца 9. Прокуратура 10. Ф акультет 11. И Т У 12. К ули нарны ерецепты 13. Н арод ны ед епутаты 14. Реги стратура лечебного учреж д ени я 15. А в тозапчасти
40 16. Заказы на сборку компью теров 17. А в тосалон 18. F1 Word Grand Prix 19. Би рж а труд а 20. Т урагентств о 21. А ренд а помещ ени й 22. Ри элтерскаяфи рма 23. CIA 24. Ф и нансов аяоргани заци я 25. У прав лени егоси мущ еств ом 26. О рд ена и наград ы 27. О хранноеагентств о 28. Hollywood 29. Росси йски й футбол 30. Город ски ед остопри мечательности 31. Д ома на прод аж у 32. А льпи ни стски й клуб 33. У прав лени епроектами 34. К атера и яхты 35. Ресторан 36. Запов ед ни к
П р и ло ж ени е. Ти пы по лей InterBase Т и п поля
SmallInt
Размер, байт 2
Integer
4
Float
4
Double precision Char(n)
8 n
VarChar(n) n
Д и апаХ рани мы езначени я зон/точность – 32768 … 32767
Ц елы ечи сла в д и апазоне– 32767 … 32767.
–2,147,483,648 …
Ц елы ечи сла со знаком
2,147,483,647 – 3,4 ⋅1038 … 3,4 ⋅10 38 – 2,225 ⋅10307 2,225⋅ 10 308 0-32767 0-32767
Ч и сла сплав аю щ ей точкой точностью д о 7 значащ и х ци фр. Ч и сла сплав аю щ ей точкой точностью д о 15 значащ и х ци фр. Си мв ольны й столбец д ли ной n си мв олов . Си мв ольны й столбец переменной д ли ны , сод ерж ащ и й д о n си мв олов .
41 Д ата.
Date
8
01.01.0100 – 29.02.32768
Time
4
В ремяд ня.
TIMESTAMP
8
0:00 -23:59.9999 1.01.100 29.02. 32768
Blob
Переменны й
Н ет
Decimal (p,s)
переменны й
Numeric (p,s)
переменны й
P – общ ее чи сло знаков от1 д о 18, s – чи сло знаков после точки от0 д о 18, s <= p P – общ ее чи сло знаков от1 д о 18, s – чи сло знаков после точки .
И спользуетсяд ляхранени яобъемны х д анны х (текст, графи ка, оци фров анны й зв уки д р.). Сод ерж и моеопред еляется под ти пом. Ч и сло сфи кси ров анной точкой. Н апри мер, DECIMAL(10, 3) сод ерж и тчи сла след ую щ его формата: ppppppp.sss. Ч и сло P опред еляетнаи меньш ую точность при хранени и .
Сод ерж и тд ату и в ремя.
Ч и сло сфи кси ров анной точкой. Н апри мер, NUMERIC (10, 3) сод ерж и тчи сла след ую щ его формата: ppppppp.sss. P опред еляетточноечи сло храни мы х знаков .
Т абли ца состав лена при мени тельно кInterbase 6.5 и FireBird 1.1, в д руги х в ерси ях Interbase и FireBird и мею тсянекоторы еразли чи я.
Ли тер атур а 1. Ф аронов В .В . Программи ров ани е баз д анны х в Delphi 7: У чебны й курс / В .В . Ф аронов .— СПб.: Пи тер, 2003 .— 458 с. 2. Д арахв ели д зе П.Г. Разработка WEB-служ б сред ств ами Delphi / П.Г. Д арахв ели д зе, Е .П.М арков . - СПб.: BHV-Петербург, 2003. - 647 с. 3. Разработка при лож ени й баз д анны х в сред еDelphi: У чебно-метод и ческое пособи е по специ альности "При клад ная математи ка и и нформати ка" 010200 / В оронеж . гос. ун-т. Сост.: В .Г. Руд алев , Ю .А . К ры ж анов ская .— Ч .2 .— 2003 .— 38 с.
42 СОДЕР Ж А Н И Е Введени е ................................................................................................3 1. Осно вы раб о ты в InterBase.............................................................4 1.1. У станов ка InterBase.................................................................................... 4 1.2. И нструментальны есред ств а...................................................................... 4 1.3. Созд ани еи реги страци ябазы д анны х ....................................................... 5 1.4. Созд ани етабли ц......................................................................................... 9 1.5. Созд ани егенераторов , три ггеров и храни мы х процед ур....................... 10 1.6. В ы полнени еSQL-запросов ...................................................................... 12 1.7. У прав лени епользов ателями .................................................................... 14 1.7.1. Смена пароляад ми ни стратора.............................................................. 14 1.7.2. Д обав лени енов ого пользов ателя.......................................................... 15 1.7.3. Пред остав лени епри в и леги й ................................................................. 15 1.7.4. И спользов ани еролей. ........................................................................... 17 1.8. Созд ани еUDF .......................................................................................... 18
2. Н ап и сани е кл и ентски х п ри л о ж ени й ..........................................20 2.1. Структура при лож ени я............................................................................ 21 2.2. К омпоненты д оступа кд анны м............................................................... 22 2.2.1. TIBTable................................................................................................. 22 2.2.2. TIBQuery ................................................................................................ 23 2.2.3. TIBDataSet ............................................................................................. 23 2.2.4. TIBSQL .................................................................................................. 23
3. При мерп ро грамми ро вани я .........................................................24 3.1. Пред метнаяобласть................................................................................. 24 3.2. Структура БД ............................................................................................ 24 3.3. К ли ентскаячасть...................................................................................... 26 3.3.1. Н астройка мод уляд анны х .................................................................... 26 3.3.2. В заи мод ейств и еспользов ателем......................................................... 29
Задани я дл я само сто ятел ьно й раб о ты ............................................39 При л о ж ени е. Т и п ы п о л ей InterBase................................................40 Л и тература..........................................................................................41
43 Состав и тель Руд алев В алери й Геннад ьев и ч Ред акторТ и хоми ров а О .А .