Създаване на тригери

Ролята на тригери (вж. Урок 14) не се ограничава до изпълнението на бизнес правилата в базата данни на сървъра. Те могат да бъдат настроени на автоматично увеличава стойността поле, получено от генератора. Създаване на спусъка:







CREATE TRIGGER BEF_INS_NAKLS ЗА Nakls

Активни преди INSERT

NEW.NakllD = GEN_ID (GEN_NAKLS, 1); END

Първият ред в допълнение към спусъка на име BEF_INS_NAKLS (макар и тригери не могат да се обаждат, отправени към тях по име в съхранената процедура или SQL-заявки, те, както и всички други субекти на базата данни на сървъра, трябва да имат уникални имена) също посочва маса Nakls, за които е предназначена. Следващият ред показва, когато спусъка трябва да се активира (в нашия случай - за вмъкване на нов запис). Третият ред съдържа ключовата AS, който се отваря тялото на спусъка. Тялото на спусъка е винаги (дори и ако спусъка съдържа един-единствен оператор, тъй като в този случай), трябва да се ограничи до един чифт започват и завършват ключови думи. В петата линия е един изпълним декларация, в която новата стойност (предикат NEW) поле NakllD получава стойност, получена от функцията по вътрешен GEN_ID. Две параметри се отнасят до генератора за функция показва името и стойността на които трябва да се увеличи текущата стойност на генератора ( "стъпка" на генератора). Имайте предвид, че в листовката на и актуализира тригери могат да се отнасят до ново поле стойност, ако името му се предхожда от предикат NEW и изтриване, и UPDATE води - до старата стойност (OLD предикат).

ВНИМАНИЕ започне поле автоматично увеличение с помощта на генератори може да бъде само триг-gerah, задейства, преди да поставите нов рекорд.

По същия начин се създаде VEG_SH5_G1KM8 задейства VEG__SH8_MOUEVOOK, VEG_1Y5_VOOK5, VER_1Y8_RAUMEYT8 autoincrement за други области.

Разбира се, с помощта на тригери следва да се изпълнява голяма част от бизнес правила. Ще разгледаме само тези действия, които трябва да се направи, когато изтривате данни на известието за доставка и когато премахнете заглавия на книги от списъка с книги, свързани с проектозакона. данни за всички сродни книги трябва да бъдат премахнати, преди да премахнете данните за фактурата. Това се прави по такъв прост тригер:

CREATE TRIGGER BEFORE_DEL_NAKLS ЗА NAKLS

АКТИВНОТО ПРЕДИ DELETE AS

Изтрива от MoveBook КЪДЕТО MNakl = NakllD; END







Изтриване на данни за отделна книга е свързано с по-сложна логика на действие: въз основа на вида на сметката е необходимо да се коригира броя на копията на книгата състав и балансът на партньора, както и промяна на стойността на фактурата:

CREATE TRIGGER BEFORE_DEL_MOVEBOOK ЗА MOVEBOOK

ACTIVE, изтрийте

/ * Сложете вида на фактура променлива партньор TypeN шифър променлива FirmN и коефициент Коеф * /

SELECT NType, NFirm ОТ Nakls

В: TypeN. FirmN;

IF (: TypeN В (0,3,4 / 6)) ТОГАВА

/ * Изтрива книгата на законопроекта, свързани с пристигането на книги. Намалете броя на книги в наличност * / актуализиране на книги

SET BQuan = BQuan-OLD.MQuan КЪДЕТО BookID = OLD.MBook; / * Регулиране на баланса на партньора * / IF (: TypeN = 4), след това / * Увеличете обмен баланс * / актуализиране на фирмите,

SET FChgDelta = FChgDelta + OLD.MQuan * OLD.MPrice *: Coeff КЪДЕТО FirmID =: FirmN; ELSE

/ * Увеличаване на финансовия баланс * / актуализиране на фирмите,

SET FFinDelta = FFinDelta + OLD.MQuan * OLD.MPrice *: Coeff КЪДЕТО FirmID =: FirmN; КРАЙ ELSE ЗАПОЧНЕТЕ

/ * Изтрива книгата на законопроекта, свързани с грижата за книги. Увеличаване на броя на книги в наличност * / актуализиране на книги

КЪДЕТО BookID = OLD.MBook; IF (: TypeN = 4), след това / * Намаляване обмен баланс * / UPDATE Фирмите

SET FChgDelta = FChgDelta + OLD.MQuan * OLD.MPrice *. Коеф е КЪДЕТО FirmID =: FirmN; ELSE

/ * Намаляване на финансовия баланс * / актуализиране на фирмите,

SET FFinDelta = FFinDelta + OLD.MQuan * OLD.MPrice *: Coeff КЪДЕТО FirmID =: FirmN;

SET NSum = NSum-а, MQuan * OLD.MPrice *: Coeff КЪДЕТО NaklID = OLD.MNakl;

Ако това бъде направено, спусъка ще се справи със задачата за премахване на данните от книгата на фактурата, а е опит за изтриване на цялата информация във фактурата няма да бъде възможно, тъй като спусъка се опитва да промени областта на изтрити фактура. Как да се реши този проблем? Факт е, че за разлика от задействане не могат да бъдат приети процедури, които да сочат, че изтритата информация във фактурата като цяло. След получаване на такава обстановка, спусъка, просто няма да се промени размера на фактурата, както и корекция на баланса на партньора може да е в този случай да се направи в BEF_DEL_NAKLS задействат еднократно за цялата сума, а не да го направят за всяка отделна книга. Но, повтарям, спусъка не може да премине параметър, и няма глобални променливи в базата данни. Когато се срещнахме за първи път този проблем на практика изглежда неразтворим. Въпреки това, след известно колебание, Аз открих, считам, че е приемливо решение. Добавих към маса MOVEBOOK ново поле:

ALTER TABLE MOVEBOOK ДОБАВИ IsDelNakl VARCHAR (1)

Това поле е в процес на въвеждане на стойността на спусъка F BEF_INS_MOVEBOOK:

CREATE TRIGGER BEF_INS_MOVEBOOK ЗА MOVEBOOK ПРЕДИ INSERT AS BEGIN

NEW.MovelD = GEN_ID (GEN_MOVEBOOK, 1); END

Trigger BEF_DEL_NAKL първо изпълнява следното изявление:

UPDATE MoveBook SET IsDelNakl = "T" КЪДЕТО MNakl = OLD.NakllD;

Сега BEF_DEL_MOVEBOOK задействане може да анализира блока поле и корекция на размера на фактура, ако областта Т включва:

IF (OLD.IsDelNakl О "T") и след това актуализиране Nakls

SET NSum = NSum-OLD.MQuan * OLD.MPrice *: Coeff КЪДЕТО NaklID = OLD.MNakl;

Правилно текстове тригери могат да се видят с помощта на SQL Explorer. За да направите това, разширяване на възел в непосредствена близост до една маса, а след това се разширява тригери възел, изберете името на спусъка и щракнете върху раздела Text.