Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
17
Добавлен:
19.11.2019
Размер:
494.91 Кб
Скачать

Переменные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.

Реализацияавтоинкрементныхключевыхполей

Длясозданияполя,значениекоторогоавтоматическиувеличиваетсянаединицу,нужносделатьнесколькодействий:

  1. Создатьгенератордляключевогополя.КлючевоеполедолжноиметьтипINTEGER,бытьNOTNULLиобъявленокакPRIMARYKEY.Собственно,генераторможноиспользоватьдлялюбогоавтоинкрементногополя,необязательноключевого.Ночащевсегогенераторыиспользуютименнодляключевыхполей.

  2. Присвоитьгенераторузначение0(илииное,еслитаблицаперенесенаиздругойБД,иужесодержитзаписи).

  3. Создатьтриггер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.