- •Введение.
- •Лекция1.Введениевклиент-серверныеСубд.
- •InterbaseSqlServer.Общиесведения.
- •Платформы
- •Типыприложений
- •ФайлыбазыданныхInterBase
- •Лекция3.Триггерыихранимыепроцедуры
- •Хранимыепроцедуры(StoredProcedures)
- •Терминаторы
- •Заголовок
- •Телопроцедуры
- •Блоккодапроцедуры
- •Операторприсваивания
- •УсловныйоператорIf…then…else
- •ОператорSelect
- •ЦиклForselecTиSuspend
- •ЦиклWhile…do
- •ОператорыInsert,update,delete
- •ОператорExecuteprocedure
- •Исключения
- •СобытияиоператорPost_event
- •Измененияиудаленияхранимыхпроцедур
- •Примерысозданияивызовахранимыхпроцедур
- •Генераторы
- •Увеличениешагагенератора
- •Триггеры
- •ПеременныеNeWиOld
- •Реализацияавтоинкрементныхключевыхполей
- •Лекция4.Транзакции.Механизмтранзакций
- •Атомарность(Atomicity)
- •Согласованность(Consistency)
- •Изолированность(Isolation)
- •Устойчивость(Durability)
- •Неявныйиявныйстарттранзакций
- •Кактранзакцияработает
- •Уровниизолированноститранзакций
- •Параметрытранзакций
- •Компонентыдоступакданнымивизуальныекомпоненты МеханизмыдоступакБд
- •ПроблемырусскихбукввInterBase
- •Лекция5. Основы языка php. Функции php для работы с субд ИсторияPhp
- •ВозможностиPhp
- •Основнойсинтаксис
- •Разделениеинструкций
- •Комментарии
- •Переменные,константыиоператоры
- •Переменные
- •Константы
- •Операторы
- •Типыданных
- •Типboolean(булевилилогическийтип)
- •Типinteger(целые)
- •Типfloat(числасплавающейточкой)
- •Типstring(строки)
- •Одинарныекавычки
- •Двойныекавычки
- •Типarray(массив)
- •Определениеприпомощиarray()
- •Определениеспомощьюсинтаксисаквадратныхскобок
- •Типobject(объекты)
- •Типresource(ресурсы)
- •Решениезадачи
- •Построениеинтерфейсадлядобавленияинформации
- •Установкасоединения
- •Выборбазыданных
- •Получениеспискаполейтаблицы
- •Отображениеспискаполейвhtml-форму
- •Записьданныхвбазуданных
- •Отображениеданных,хранящихсявMySql
- •Заключение
ПеременныеNeWиOld
Этипеременныеобъявлятьненужно,ониужеприсутствуютвкаждомтриггере.Соответственно,переменныехранятстароеиновоезначениякакоголибополя.Обращатьсякэтимзначениямможнотак:
NEW.<имя_поля>
Этипеременныемогутбытьиспользованыдля:
Получениядопустимыхзначенийпоумолчанию.
Проверкивходныхданных,ипринеобходимости,ихизменения.
Получениязначенийполейдлямодификациидругихтаблиц.
Реализацииавтоинкрементныхполей.
Имеютсянекоторыеограничениянаиспользованиеэтихпеременных.Так,значенияNEWмогутбытьиспользованывсобытияхINSERTиUPDATE,приудалениизаписиNEWимеетзначениеNULL.ЗначенияOLDдоступнывсобытияхUPDATEиDELETE,апривставкеновойзаписиOLDимеетзначениеNULL.
Дляпримерасоздадимтриггер,которыйсрабатываетпередвставкойновойзаписиипроверяетвходящеецелоечисло.Еслионоотрицательно,триггеризменяетегонаноль:
SETTERM^;
CREATETRIGGERNotOtricFORTable_Cel
ACTIVEBEFOREINSERT
AS
BEGIN
IF(NEW.Dlinnoe<0)THENNEW.Dlinnoe=0;
END^
SETTERM;^
СоздайтеэтоттриггерспомощьюInteractiveSQL.Затемвэтойжеутилитевведитедвазначения(подробнейоредактированиимыпоговоримнаследующейлекции):
INSERTINTOTable_cel(Dlinnoe)VALUES(5);
INSERTINTOTable_cel(Dlinnoe)VALUES(-10);
SELECT*FROMTable_cel;
Каквидите,втаблицепоявилисьдвеновыестроки:
Рис.3.5.Двеновыезаписи
Впервомслучаезначение5сохранилосьбезизменения,авовторойзаписитриггеризменилзначение-10на0.
Реализацияавтоинкрементныхключевыхполей
Длясозданияполя,значениекоторогоавтоматическиувеличиваетсянаединицу,нужносделатьнесколькодействий:
Создатьгенератордляключевогополя.КлючевоеполедолжноиметьтипINTEGER,бытьNOTNULLиобъявленокакPRIMARYKEY.Собственно,генераторможноиспользоватьдлялюбогоавтоинкрементногополя,необязательноключевого.Ночащевсегогенераторыиспользуютименнодляключевыхполей.
Присвоитьгенераторузначение0(илииное,еслитаблицаперенесенаиздругойБД,иужесодержитзаписи).
СоздатьтриггерBEFOREINSERT,увеличивающийэтозначениена1.
Итак,приступим.ВнашейбазеданныхимеетсятаблицаTovar,вкоторойпервоеполеIDобъявленокакINTEGERNOTNULL.Ксожалению,поленебылообъявлено,какключевоеPRIMARYKEY.Изменимтаблицу,добавиввнеепервичныйключпополюID:
ALTERTABLETOVARADDPRIMARYKEY(ID);
Теперьсделаемэтополеавтоинкрементным:
/*Создаемгенератор*/
CREATEGENERATORGen_Tovar;
/*Присваиваемгенераторуначальноезначение*/
SETGENERATORGen_TovarTO0;
/*Создаемтриггер*/
SETTERM^;
CREATETRIGGERTr_TovarFORTovar
ACTIVEBEFOREINSERT
AS
BEGIN
IF(NEW.IDISNULL)THEN
NEW.ID=GEN_ID(Gen_Tovar,1);
END^
SETTERM;^
/*Завершаемтранзакцию:*/
COMMIT;
Операторыизданногопримерасоздаютавтоматическоеувеличениезначенияполяна1.Такимобразом,вставкапервойжезаписиустановитзначение1.Следующаязаписьбудет2итакдалее.Всеэтореализуетсявпределахтранзакции,тоестьдажееслимножествопользователейвноситизменениявтаблицу,значениягенераторавсегдабудутуникальны.Кстати,именнопотому,чтоизменениятаблицпроисходятвнутритранзакций,априложениюможетпотребоватьсяузнатьзначениеполядотого,кактранзакциязавершилась,настоятельнорекомендуетсявместопростогоприсваивания:
NEW.ID=GEN_ID(Gen_Tovar,1);
делатьэтовместеспроверкойнаNULL:
IF(NEW.IDISNULL)THENNEW.ID=GEN_ID(Gen_Tovar,1);
Теперьмыможемпроверитьработунашегоавтоинкремента.Создайтеследующийзапрос:
INSERTINTOTovar(Nazvanie,Stoimost)VALUES('Сахар',10.50);
INSERTINTOTovar(Nazvanie,Stoimost)VALUES('Крупа',8.20);
SELECT*FROMTovar;
Есливывсесделалиправильно,товтаблицепоявятсядвезаписи,аполеIDбудетавтоматическиувеличиватьсяна1:
Рис.3.6.Демонстрацияработыавтоинкрементногополя
Обратитевниманиенато,чтомывносилизначениятольковполяNazvanieиStoimost.ЗначениядляполяIDгенерировалисьтриггеромавтоматически.НезабудьтепередзакрытиемокнаInteractiveSQLзакрытьтранзакциюкомандойCOMMIT.
Вотличиеотхранимыхпроцедур,длятриггеровнепредусмотренразделвдеревесерверовутилитыIBConsole.Однакоувидетьнаштриггерможно.ТриггерсоздавалсядлятаблицыTovar.Выделитеее,нажмитеправуюкнопкумышиивконтекстномменювыберитекомандуProperties.Откроетсяокносвойствтаблицы,вкоторомследуетперейтинавкладкуMetadata.Вэтомокне,послеописаниясозданиятаблицы,выувидитеописаниенашеготриггераTr_Tovar.