crearea declanșatori

Rolul declanșatoare (a se vedea. Lecția 14) nu se limitează la punerea în aplicare a normelor de afaceri în baza de date de server. Acestea pot fi setate la valoarea câmpului auto-incrementează primit de la generator. Creați un declanșator:







CREATE TRIGGER BEF_INS_NAKLS PENTRU Nakls

INSERT ÎNAINTE DE ACTIVE

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

Prima linie în plus față de trăgaci numele BEF_INS_NAKLS (deși declanșatori nu se poate apela adresate după nume în procedura stocată sau SQL-interogări, ei, la fel ca toate baza de date a altor entități Server trebuie să aibă nume unice) indică, de asemenea, tabelul Nakls, pentru care este destinat. Linia următoare indică atunci când declanșatorul trebuie să fie activat (în cazul nostru - pentru a insera un nou record). A treia linie conține cuvântul cheie AS, care deschide corpul declanșatorului. Corpul de declanșare este întotdeauna (chiar dacă trăgaciul conține un singur operator, la fel ca în acest caz) ar trebui să se limiteze la o pereche de cuvinte cheie begin si end. În al cincilea rând este o singură declarație executabil în care noua valoare (NEW predicat) câmp NakllD i se atribuie o valoare obținută din funcția GEN_ID internă. Doi parametri se referă la generatorul de funcții indicat numele și valoarea la care ar trebui să crească valoarea curentă a generatorului ( „etapa“ a generatorului). Rețineți că, în INSERT și UPDATE declanșatori se poate referi la noua valoare câmpului, în cazul în care numele său este precedat de un predicat NOU, și DELETE și UPDATE declanșează - vechea valoare (predicat OLD).

ATENȚIE iniția câmp auto-incrementare cu ajutorul generatoarelor poate fi doar trigonometrie-gerah, a declanșat înainte de a introduce un nou record.

În mod similar VEG_SH5_G1KM8 crea declanseaza VEG__SH8_MOUEVOOK, VEG_1Y5_VOOK5, VER_1Y8_RAUMEYT8 autoincrement pentru alte domenii.

Desigur, cu ajutorul declanșatoare ar trebui să fie pus în aplicare cele mai multe reguli de afaceri. Vom lua în considerare numai acele acțiuni care trebuie să fie făcut la ștergerea datelor de pe bonul de livrare și atunci când eliminați titluri de carte din lista de cărți legate de proiectul de lege. date cu privire la toate cărțile aferente ar trebui să fie eliminate înainte de a elimina datele de pe factură. Acest lucru se face într-un astfel de declanșare simplu:

CREATE PENTRU BEFORE_DEL_NAKLS NAKLS TRIGGER

ÎNAINTE DE ACTIVE ȘTERGE AS

DELETE FROM MoveBook WHERE MNakl = NakllD; END







Ștergerea datelor pe o carte separată atrage după sine o logică mai complexă de acțiune: pe baza tipului de proiect de lege este necesară pentru a regla numărul de copii ale fondului de carte și soldul partenerului, precum și a schimba valoarea facturii:

CREATE TRIGGER BEFORE_DEL_MOVEBOOK PENTRU MOVEBOOK

ACTIVĂ ÎNAINTE DE ȘTERGE

/ * Pune tipul de factură partener TypeN variabilă cifru FirmN variabilă și coeficientul Coef * /

SELECT NType, NFirm DIN Nakls

ÎN: TypeN. FirmN;

IF (: TypeN IN (0,3,4 / 6)) ATUNCI

/ * Șterge cartea proiectul de lege asociat cu sosirea de cărți. Reducerea numărului de cărți în stoc * / UPDATE cărți

SET BQuan = BQuan-OLD.MQuan UNDE BookID = OLD.MBook; / * Reglarea echilibrului partenerului * / IF (: TypeN = 4) THEN / * Creșterea de echilibru de schimb Firmele * / UPDATE

SET FChgDelta = FChgDelta + OLD.MQuan * OLD.MPrice * Coef UNDE FirmID =: FirmN; ELSE

/ * Creșterea echilibrului financiar * / firme UPDATE

SET FFinDelta = FFinDelta + OLD.MQuan * OLD.MPrice * Coef UNDE FirmID =: FirmN; END else begin

/ * Șterge cartea proiectul de lege legate de îngrijirea de cărți. Creșterea numărului de cărți în stoc * / UPDATE cărți

UNDE BookID = OLD.MBook; IF: Firmele (TypeN = 4) THEN / * Scăderea balanței de schimb * / UPDATE

SET FChgDelta = FChgDelta + OLD.MQuan * OLD.MPrice *. Coef f UNDE FirmID =: FirmN; ELSE

/ * Reducerea echilibrului financiar * / firme UPDATE

SET FFinDelta = FFinDelta + OLD.MQuan * OLD.MPrice * Coef UNDE FirmID =: FirmN;

SET NSum = NSum-OLD, MQuan * OLD.MPrice * Coef UNDE NaklID = OLD.MNakl;

În cazul în care acest lucru se face, declanșatorul va putea face față cu sarcina de a scoate datele din cartea de factură, ci o încercare de a șterge toate informațiile de pe factură nu va fi posibil, ca declanșator încearcă să schimbe câmpul în factura șters. Cum de a rezolva această problemă? Faptul este că, în contrast pentru a declanșa procedurile nu pot fi transmise, ceea ce ar indica faptul că informațiile șterse de pe factură în ansamblu. După ce a primit o astfel de setare, declanșatorul pur și simplu nu ar schimba valoarea facturii, precum și corectarea echilibrului partenerului ar putea fi, în acest caz, pentru a face în BEF_DEL_NAKLS declanșa o singură dată pentru întreaga sumă, și nu de a face acest lucru pentru fiecare carte în parte. Cu toate acestea, repet, declanșatorul nu poate trece un parametru, și nu există nici variabile globale în baza de date. Când m-am întâlnit pentru prima dată această problemă, în practică, se părea insolubilă. Cu toate acestea, după unele ezitări, am găsit, cred, este o soluție acceptabilă. Am adăugat la masa de MOVEBOOK nou domeniu:

ALTER TABLE MOVEBOOK ADD IsDelNakl VARCHAR (1)

Acest câmp este în procesul de introducere a valorii de declanșare în F BEF_INS_MOVEBOOK:

CREATE TRIGGER BEF_INS_MOVEBOOK PENTRU MOVEBOOK ÎNAINTE DE INSERT CA INCEPE

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

Trigger BEF_DEL_NAKL în primul rând execută următoarea declarație:

UPDATE MoveBook SET IsDelNakl = "T" UNDE MNakl = OLD.NakllD;

Acum BEF_DEL_MOVEBOOK de declanșare poate analiza blocul de câmp și de corecție în valoarea facturii, în cazul în care câmpul T cuprinde:

IF (OLD.IsDelNakl O "T") ATUNCI UPDATE Nakls

SET NSum = NSum-OLD.MQuan * OLD.MPrice *: Coef UNDE NaklID = OLD.MNakl;

texte corecte declanșatori pot fi văzute folosind SQL Explorer. Pentru a face acest lucru, extindeți nodul de lângă o masă, și apoi extindeți nodul declanșatoare, selectați numele trăgaciului și faceți clic pe fila Text.