Меню Закрыть

For each row sql

Содержание

рПДДЕТЦЛБ ДМС ФТЙЗЗЕТПЧ ЧЛМАЮЕОБ, ОБЮЙОБС У MySQL 5.0.2. фТЙЗЗЕТ РТЕДУФБЧМСЕФ УПВПК ЙНЕОПЧБООЩК ПВЯЕЛФ ВБЪЩ ДБООЩИ, ЛПФПТЩК УЧСЪБО У ФБВМЙГЕК, Й ПО ВХДЕФ БЛФЙЧЙЪЙТПЧБО, ЛПЗДБ УРЕГЙЖЙЮЕУЛПЕ УПВЩФЙЕ РТПЙУИПДЙФ ДМС ФБВМЙГЩ. оБРТЙНЕТ, УМЕДХАЭЙЕ ЙОУФТХЛГЙЙ УПЪДБАФ ФБВМЙГХ Й ЧЩЪЩЧБАФ ФТЙЗЗЕТ INSERT . пО УХННЙТХЕФ ЪОБЮЕОЙС, ЧУФБЧМЕООЩЕ Ч ПДЙО ЙЪ УФПМВГПЧ ФБВМЙГЩ:

ьФБ ЗМБЧБ ПРЙУЩЧБЕФ УЙОФБЛУЙУ ДМС УПЪДБОЙС Й ХДБМЕОЙС ФТЙЗЗЕТПЧ, РПЛБЪЩЧБЕФ ОЕЛПФПТЩЕ РТЙНЕТЩ ФПЗП, ЛБЛ ЙУРПМШЪПЧБФШ ЙИ. пВУХЦДЕОЙЕ ПЗТБОЙЮЕОЙК ОБ ЙУРПМШЪПЧБОЙЕ ДБОП Ч ТБЪДЕМЕ " 11.1. пЗТБОЙЮЕОЙС ОБ УПИТБОЕООЩЕ РПДРТПЗТБННЩ Й ФТЙЗЗЕТЩ".

6.1. уЙОФБЛУЙУ CREATE TRIGGER

ьФБ ЙОУФТХЛГЙС УПЪДБЕФ ОПЧЩК ФТЙЗЗЕТ. CREATE TRIGGER ВЩМБ ДПВБЧМЕОБ Ч MySQL 5.0.2. ч ОБУФПСЭЕЕ ЧТЕНС ЙУРПМШЪПЧБОЙЕ ФТЕВХЕФ РТЙЧЙМЕЗЙЙ SUPER .

фТЙЗЗЕТ УФБОПЧЙФУС УЧСЪБООЩН У ФБВМЙГЕК У ЙНЕОЕН tbl_name , ЛПФПТПЕ ДПМЦОП ПВТБФЙФШУС Л РПУФПСООПК ФБВМЙГЕ. чЩ ОЕ НПЦЕФЕ УЧСЪЩЧБФШ ФТЙЗЗЕТ У view ЙМЙ ФБВМЙГЕК TEMPORARY .

лПЗДБ ФТЙЗЗЕТ БЛФЙЧЙЪЙТПЧБО, РТЕДМПЦЕОЙЕ DEFINER ПРТЕДЕМСЕФ РТЙЧЙМЕЗЙЙ, ЛПФПТЩЕ РТЙНЕОСАФУС, ЛБЛ ПРЙУБОП ОЙЦЕ Ч ЬФПН ТБЪДЕМЕ.

trigger_time ЪБДБЕФ ЧТЕНС ДЕКУФЧЙС. ьФП НПЦЕФ ВЩФШ BEFORE ЙМЙ AFTER , ЮФПВЩ ЪБДБФШ, ЮФП ФТЙЗЗЕТ БЛФЙЧЙЪЙТХЕФУС РТЕЦДЕ ЙМЙ РПУМЕ ЙОУФТХЛГЙЙ, ЛПФПТБС БЛФЙЧЙЪЙТПЧБМБ ЬФП.

trigger_event ХЛБЪЩЧБЕФ ЧЙД ЙОУФТХЛГЙЙ, ЛПФПТБС БЛФЙЧЙЪЙТХЕФ ФТЙЗЗЕТ. ъДЕУШ trigger_event НПЦЕФ ВЩФШ ПДОЙН ЙЪ УМЕДХАЭЕЗП:

INSERT : ЧУСЛЙК ТБЪ, ЛПЗДБ ОПЧБС УФТПЛБ ЧУФБЧМЕОБ Ч ФБВМЙГХ. оБРТЙНЕТ, ЮЕТЕЪ ЛПНБОДЩ INSERT , LOAD DATA ЙМЙ REPLACE .

UPDATE : ЧУСЛЙК ТБЪ, ЛПЗДБ УФТПЛБ ЙЪНЕОСЕФУС. оБРТЙНЕТ, ЮЕТЕЪ ЙОУФТХЛГЙА UPDATE .

DELETE : ЧУСЛЙК ТБЪ, ЛПЗДБ УФТПЛБ ХДБМЕОБ ЙЪ ФБВМЙГЩ. оБРТЙНЕТ, ЮЕТЕЪ ЙОУФТХЛГЙЙ DELETE Й REPLACE . пДОБЛП, ЙОУФТХЛГЙЙ DROP TABLE Й TRUNCATE ПФОПУЙФЕМШОП ФБВМЙГЩ ое БЛФЙЧЙЪЙТХАФ ФТЙЗЗЕТ, РПФПНХ ЮФП ПОЙ ОЕ ЙУРПМШЪХАФ DELETE !

чБЦОП РПОСФШ, ЮФП trigger_event ОЕ РТЕДУФБЧМСЕФ МЙФЕТБМШОЩК ФЙР ЙОУФТХЛГЙЙ SQL, ЛПФПТБС БЛФЙЧЙЪЙТХЕФ ФТЙЗЗЕТ, РПУЛПМШЛХ ЬФП РТЕДУФБЧМСЕФ ФЙР ПРЕТБГЙЙ ФБВМЙГЩ. оБРТЙНЕТ, ФТЙЗЗЕТ INSERT БЛФЙЧЙЪЙТПЧБО ОЕ ФПМШЛП ЙОУФТХЛГЙЕК INSERT , ОП Й LOAD DATA , РПФПНХ ЮФП ПВЕ ЙОУФТХЛГЙЙ ЧУФБЧМСАФ УФТПЛЙ Ч ФБВМЙГХ.

оЕ НПЦЕФ ВЩФШ ДЧХИ ФТЙЗЗЕТПЧ ДМС ДБООПК ФБВМЙГЩ, ЛПФПТЩЕ ЙНЕАФ ФЕ ЦЕ УБНЩЕ ЧТЕНС ДЕКУФЧЙС Й УПВЩФЙЕ. оБРТЙНЕТ, чЩ ОЕ НПЦЕФЕ ЙНЕФШ ДЧБ ФТЙЗЗЕТБ BEFORE UPDATE ДМС ФБВМЙГЩ. оП чЩ НПЦЕФЕ ЙНЕФШ BEFORE UPDATE Й BEFORE INSERT ЙМЙ BEFORE UPDATE Й AFTER UPDATE .

trigger_stmt ЪБДБЕФ ЙОУФТХЛГЙА, ЛПФПТБС ВХДЕФ ЧЩРПМОЕОБ, ЛПЗДБ ФТЙЗЗЕТ БЛФЙЧЙЪЙТХЕФУС. еУМЙ чЩ ИПФЙФЕ ЧЩРПМОСФШ НОПЗП ЙОУФТХЛГЙК, ЙУРПМШЪХКФЕ ПРЕТБФПТОХА ЛПОУФТХЛГЙА BEGIN . END . ьФП ФБЛЦЕ ДБЕФ ЧПЪНПЦОПУФШ чБН ЙУРПМШЪПЧБФШ ФЕ ЦЕ УБНЩЕ ЙОУФТХЛГЙЙ, ЛПФПТЩЕ СЧМСАФУС ДПРХУФЙНЩНЙ ЧОХФТЙ УПИТБОЕООЩИ РПДРТПЗТБНН.

ъБНЕЮБОЙЕ : Ч ОБУФПСЭЕЕ ЧТЕНС ФТЙЗЗЕТЩ ОЕ БЛФЙЧЙЪЙТПЧБОЩ ЛБУЛБДОЩНЙ ДЕКУФЧЙСНЙ ЧОЕЫОЕЗП ЛМАЮБ. ьФП ПЗТБОЙЮЕОЙЕ ВХДЕФ УОЙНБФШУС ЛБЛ НПЦОП УЛПТЕЕ.

пВТБФЙФЕ ЧОЙНБОЙЕ : ДП MySQL 5.0.10 ФТЙЗЗЕТ ОЕ НПЦЕФ УПДЕТЦБФШ РТСНЩЕ УУЩМЛЙ Л ЙНЕОБН ФБВМЙГ. у MySQL 5.0.10, чЩ НПЦЕФЕ ЪБРЙУЩЧБФШ ЙНЕОБ, ЛБЛ РПЛБЪБОП Ч ЬФПН РТЙНЕТЕ:

рТЕДРПМПЦЙН, ЮФП чЩ ЧУФБЧМСЕФЕ УМЕДХАЭЙЕ ЪОБЮЕОЙС Ч ФБВМЙГХ test1 ЛБЛ РПЛБЪБОП ЪДЕУШ:

ч ТЕЪХМШФБФЕ ДБООЩЕ Ч ЮЕФЩТЕИ ФБВМЙГБИ ВХДХФ УМЕДХАЭЙЕ:

чЩ НПЦЕФЕ ПВТБФЙФШУС Л УФПМВГБН Ч РПДЮЙОЕООПК ФБВМЙГЕ (ФБВМЙГЕ, УЧСЪБООПК У ЧЩЪЩЧБАЭЕК), ЙУРПМШЪХС РУЕЧДПОЙНЩ OLD Й NEW . OLD. col_name ПВТБЭБЕФУС Л УФПМВГХ УХЭЕУФЧХАЭЕК УФТПЛЙ РТЕЦДЕ, ЮЕН ПОБ НПДЙЖЙГЙТХЕФУС ЙМЙ ХДБМЙФУС. NEW. col_name ПВТБЭБЕФУС Л УФПМВГХ ОПЧПК УФТПЛЙ, ЛПФПТБС ВХДЕФ ЧУФБЧМЕОБ, ЙМЙ ЦЕ Л УХЭЕУФЧХАЭЕК УФТПЛЕ РПУМЕ ФПЗП, ЛБЛ ПОБ НПДЙЖЙГЙТХЕФУС.

рТЕДМПЦЕОЙЕ DEFINER ПРТЕДЕМСЕФ МПЗЙО MySQL, ЛПФПТЩК ОХЦОП ЙУРПМШЪПЧБФШ РТЙ РТПЧЕТЛЕ РТЙЧЙМЕЗЙК ДПУФХРБ Ч ЧЩЪПЧЕ ФТЙЗЗЕТБ. ьФП ВЩМП ДПВБЧМЕОП Ч MySQL 5.0.17. еУМЙ ДБОП ЪОБЮЕОЙЕ user , ЬФП ДПМЦОП ВЩФШ МПЗЙОПН MySQL Ч ЖПТНБФЕ ‘ user_name ‘@’ host_name ‘ (ЛБЛ Ч ЛПНБОДЕ GRANT ). фТЕВХАФУС РЕТЕНЕООЩЕ user_name Й host_name . CURRENT_USER ФБЛЦЕ НПЦЕФ ВЩФШ ДБО ЛБЛ CURRENT_USER() . ъБДБООПЕ РП ХНПМЮБОЙА ЪОБЮЕОЙЕ DEFINER : РПМШЪПЧБФЕМШ, ЛПФПТЩК ЧЩРПМОСЕФ ЙОУФТХЛГЙА CREATE TRIGGER . ьФП ФБЛЦЕ, ЛБЛ DEFINER = CURRENT_USER .

еУМЙ чЩ ПРТЕДЕМСЕФЕ РТЕДМПЦЕОЙЕ DEFINER , чЩ ОЕ НПЦЕФЕ ХУФБОБЧМЙЧБФШ ЪОБЮЕОЙЕ Л МАВПНХ МПЗЙОХ, ЛТПНЕ чБЫЕЗП УПВУФЧЕООПЗП, ЕУМЙ чЩ ОЕ ЙНЕЕФЕ РТЙЧЙМЕЗЙА SUPER . ьФЙ РТБЧЙМБ ПРТЕДЕМСАФ ДПРХУФЙНЩЕ ЪОБЮЕОЙС РПМШЪПЧБФЕМС Ч DEFINER :

еУМЙ чЩ ОЕ ЙНЕЕФЕ РТЙЧЙМЕЗЙЙ SUPER , ЕДЙОУФЧЕООПЕ ДПРХУФЙНПЕ ЪОБЮЕОЙЕ user : чБЫ УПВУФЧЕООЩК МПЗЙО, ПРТЕДЕМЕООЩК ВХЛЧБМШОП ЙМЙ ЙУРПМШЪХС CURRENT_USER . чЩ ОЕ НПЦЕФЕ ХУФБОБЧМЙЧБФШ DEFINER Л ОЕЛПФПТПНХ ДТХЗПНХ МПЗЙОХ.

еУМЙ чЩ ЙНЕЕФЕ РТЙЧЙМЕЗЙА SUPER , чЩ НПЦЕФЕ ПРТЕДЕМСФШ МАВПЕ УЙОФБЛУЙЮЕУЛЙ ДПРХУФЙНПЕ ЙНС РПМШЪПЧБФЕМС. еУМЙ ФБЛПЗП МПЗЙОБ ЖБЛФЙЮЕУЛЙ ОЕ УХЭЕУФЧХЕФ, ВХДЕФ УЗЕОЕТЙТПЧБОП РТЕДХРТЕЦДЕОЙЕ.

иПФС ЧПЪНПЦОП УПЪДБФШ ФТЙЗЗЕТ У ОЕУХЭЕУФЧХАЭЙН ЪОБЮЕОЙЕН DEFINER , ДЕМБФШ ЬФПЗП ОЕ УМЕДХЕФ, РПУЛПМШЛХ ФТЙЗЗЕТ ОЕ ВХДЕФ БЛФЙЧЙЪЙТПЧБО, РПЛБ DEFINER ЖБЛФЙЮЕУЛЙ ОЕ УХЭЕУФЧХЕФ. йОБЮЕ, РПЧЕДЕОЙЕ ПФОПУЙФЕМШОП РТПЧЕТЛЙ РТЙЧЙМЕЗЙЙ ОЕПРТЕДЕМЕООП.

пВТБФЙФЕ ЧОЙНБОЙЕ: ФБЛ ЛБЛ MySQL Ч ОБУФПСЭЕЕ ЧТЕНС ФТЕВХЕФ, ЮФПВЩ ВЩМБ РТЙЧЙМЕЗЙС SUPER ДМС ЙУРПМШЪПЧБОЙС CREATE TRIGGER , ФПМШЛП ЧФПТПЕ ЙЪ РТЕДЫЕУФЧХАЭЙИ РТБЧЙМ РТЙНЕОСЕФУС. MySQL 5.1.6 ЧЧПДЙФ РТБЧП TRIGGER Й ФТЕВХЕФ, ЮФПВЩ ЬФБ РТЙЧЙМЕЗЙС ОБМЙЮЕУФЧПЧБМБ ДМС УПЪДБОЙС ФТЙЗЗЕТБ, ФБЛ ЮФП У ЬФПК ЧЕТУЙЙ ПВБ РТБЧЙМБ ТБВПФБАФ, Б SUPER ФТЕВХЕФУС ФПМШЛП ДМС ПРТЕДЕМЕОЙС ЪОБЮЕОЙС DEFINER ДТХЗПЗП, ЮЕН чБЫ УПВУФЧЕООЩК МПЗЙО.

оБЮЙОБС У MySQL 5.0.17, MySQL РТПЧЕТСЕФ РТЙЧЙМЕЗЙЙ ФТЙЗЗЕТБ РПДПВОП ЬФПНХ:

ч НПНЕОФ ЧЩЪПЧБ CREATE TRIGGER РПМШЪПЧБФЕМШ, ЛПФПТЩК ЧЩДБЕФ ЙОУФТХЛГЙА, ДПМЦЕО ЙНЕФШ РТЙЧЙМЕЗЙА SUPER .

рТЙ УТБВБФЩЧБОЙЙ ФТЙЗЗЕТБ РТЙЧЙМЕЗЙЙ РТПЧЕТЕОЩ ОБ УППФЧЕФУФЧЙЕ DEFINER . рПМШЪПЧБФЕМШ ДПМЦЕО ЙНЕФШ ЬФЙ РТЙЧЙМЕЗЙЙ:

SELECT ДМС РПДЮЙОЕООПК ФБВМЙГЩ, ЕУМЙ УУЩМЛЙ Л УФПМВГБН ФБВМЙГЩ РТПЙУИПДСФ ЮЕТЕЪ OLD. col_name ЙМЙ or NEW. col_name Ч ПРТЕДЕМЕОЙЙ ФТЙЗЗЕТБ.

UPDATE ДМС РПДЮЙОЕООПК ФБВМЙГЩ, ЕУМЙ УФПМВГЩ ФБВМЙГЩ СЧМСАФУС БДТЕУБФБНЙ SET NEW. col_name = value , ОБЪОБЮЕООЩНЙ Ч ПРТЕДЕМЕОЙЙ ФТЙЗЗЕТБ.

мАВЩЕ ДТХЗЙЕ РТЙЧЙМЕЗЙЙ ПВЩЮОП ФТЕВХАФУС ДМС ЙОУФТХЛГЙК, ЧЩРПМОЕООЩИ ФТЙЗЗЕТПН.

дП MySQL 5.0.17, MySQL РТПЧЕТСЕФ РТЙЧЙМЕЗЙЙ РПДПВОП ЬФПНХ:

рТЙ ЧЩЪПЧЕ CREATE TRIGGER РПМШЪПЧБФЕМШ, ЛПФПТЩК ЧЩДБЕФ ЙОУФТХЛГЙА, ДПМЦЕО ЙНЕФШ РТЙЧЙМЕЗЙА SUPER .

ч НПНЕОФ БЛФЙЧБГЙЙ ФТЙЗЗЕТБ РТЙЧЙМЕЗЙЙ РТПЧЕТЕОЩ ДМС РПМШЪПЧБФЕМС, ЮШЙ ДЕКУФЧЙС ЪБУФБЧЙМЙ ФТЙЗЗЕТ УТБВПФБФШ. ьФПФ РПМШЪПЧБФЕМШ ДПМЦЕО ЙНЕФШ МАВЩЕ РТЙЧЙМЕЗЙЙ, ЛПФПТЩЕ ФТЕВХАФУС ДМС ЙОУФТХЛГЙК, ЧЩРПМОСЕНЩИ ФТЙЗЗЕТПН.

Читайте также:  Arkhipov s laboratory dac 63

пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП ЧЧЕДЕОЙЕ РТЕДМПЦЕОЙС DEFINER НЕОСЕФ ЪОБЮЕОЙЕ CURRENT_USER() Ч ПРТЕДЕМЕОЙЙ ФТЙЗЗЕТБ: ЖХОЛГЙС CURRENT_USER() ТБВПФБЕФ УП ЪОБЮЕОЙЕН DEFINER Ч MySQL 5.0.17 (Й ЧЩЫЕ) ЙМЙ У ФЕН РПМШЪПЧБФЕМЕН, ЮШЙ ДЕКУФЧЙС ЪБУФБЧЙМЙ ЧЩРПМОЙФШУС ФТЙЗЗЕТ (ДП MySQL 5.0.17).

6.2. уЙОФБЛУЙУ DROP TRIGGER

ьФП ХОЙЮФПЦБЕФ ФТЙЗЗЕТ. йНС ВБЪЩ ДБООЩИ ПРГЙПОБМШОП. еУМЙ ПОП ОЕ ЪБДБОП, ФТЙЗЗЕТ ХДБМСЕФУС ЙЪ ЪБДБООПК РП ХНПМЮБОЙА ВБЪЩ ДБООЩИ, чЩЪПЧ DROP TRIGGER ВЩМ ДПВБЧМЕО Ч MySQL 5.0.2. йУРПМШЪПЧБОЙЕ ФТЕВХЕФ РТЙЧЙМЕЗЙЙ SUPER .

пВТБФЙФЕ ЧОЙНБОЙЕ: дП MySQL 5.0.10, ЙНС ФБВМЙГЩ ФТЕВПЧБМПУШ ЧНЕУФП ЙНЕОЙ УИЕНЩ ( table_name . trigger_name ). рТЙ ПВОПЧМЕОЙЙ У MySQL 5.0 ДП MySQL 5.0.10 ЙМЙ ЧЩЫЕ, чЩ ДПМЦОЩ ХДБМЙФШ ЧУЕ ФТЙЗЗЕТЩ РЕТЕД ПВОПЧМЕОЙЕН Й ЧОПЧШ УПЪДБФШ ЙИ ЧРПУМЕДУФЧЙЙ, ЙОБЮЕ ЧЩЪПЧ DROP TRIGGER ОЕ ТБВПФБЕФ РПУМЕ ПВОПЧМЕОЙС.

лТПНЕ ФПЗП, ФТЙЗЗЕТЩ, УПЪДБООЩЕ Ч MySQL 5.0.16 ЙМЙ ЧЩЫЕ, ОЕ НПЗХФ ВЩФШ ХДБМЕОЩ Ч MySQL 5.0.15 ЙМЙ ОЙЦЕ. еУМЙ чЩ ЦЕМБЕФЕ ЧЩРПМОЙФШ ФБЛПК ЧПЪЧТБФ, чЩ ФБЛЦЕ ДПМЦОЩ Ч ЬФПН УМХЮБЕ ХДБМЙФШ ЧУЕ ФТЙЗЗЕТЩ Й ЪБОПЧП ЙИ РЕТЕУПЪДБФШ РПУМЕ УНЕОЩ ЧЕТУЙК.

6.3. йУРПМШЪПЧБОЙЕ ФТЙЗЗЕТПЧ

рПДДЕТЦЛБ ФТЙЗЗЕТПЧ ЧЛМАЮЕОБ, ОБЮЙОБС У MySQL 5.0.2. ьФПФ ТБЪДЕМ ПВУХЦДБЕФ, ЛБЛ ЙУРПМШЪПЧБФШ ФТЙЗЗЕТЩ Й ОЕЛПФПТЩЕ ЙИ ПЗТБОЙЮЕОЙК.

фТЙЗЗЕТ СЧМСЕФУС ЙНЕОПЧБООЩН ПВЯЕЛФПН ВБЪЩ ДБООЩИ, ЛПФПТЩК УЧСЪБО У ФБВМЙГЕК, Й БЛФЙЧЙЪЙТХЕФУС, ЛПЗДБ УРЕГЙЖЙЮЕУЛПЕ УПВЩФЙЕ РТПЙУИПДЙФ ДМС ЬФПК ФБВМЙГЩ. ьФП ПЮЕОШ ЪДПТПЧП, ЛПЗДБ чЩ ДПМЦОЩ ЧЩРПМОЙФШ РТПЧЕТЛЙ ЪОБЮЕОЙК, ЛПФПТЩЕ ВХДХФ ЧУФБЧМЕОЩ Ч ФБВМЙГХ ЙМЙ ЧЩРПМОСФШ ЧЩЮЙУМЕОЙС ОБ ЪОБЮЕОЙСИ, ЧЛМАЮБЕНЩИ Ч НПДЙЖЙЛБГЙЙ.

фТЙЗЗЕТ УЧСЪБО У ФБВМЙГЕК Й ПРТЕДЕМЕО, ЮФПВЩ БЛФЙЧЙЪЙТПЧБФШУС, ЛПЗДБ ДМС ФБВМЙГЩ ЧЩРПМОСЕФУС ЙОУФТХЛГЙС INSERT , DELETE ЙМЙ UPDATE . фТЙЗЗЕТ НПЦЕФ ВЩФШ ХУФБОПЧМЕО, ЮФПВЩ БЛФЙЧЙЪЙТПЧБФШУС РТЕЦДЕ ЙМЙ РПУМЕ ЧЩЪПЧБ ЙОУФТХЛГЙЙ. оБРТЙНЕТ, чЩ НПЦЕФЕ ЙНЕФШ ФТЙЗЗЕТ, УТБВБФЩЧБАЭЙК РЕТЕД ХДБМЕОЙЕН ЛБЦДПК УФТПЛЙ ЙЪ ФБВМЙГЩ, ЙМЙ РПУМЕ ЛБЦДПК НПДЙЖЙЛБГЙЙ ХЦЕ УХЭЕУФЧХАЭЕК УФТПЛЙ Ч ФБВМЙГЕ.

йНЕЕФУС РТПУФПК РТЙНЕТ, ЛПФПТЩК УЧСЪЩЧБЕФ ФТЙЗЗЕТ У ФБВМЙГЕК ДМС ЙОУФТХЛГЙК INSERT . ьФП ДЕКУФЧХЕФ ЛБЛ УХННБФПТ, ЮФПВЩ УХННЙТПЧБФШ ЪОБЮЕОЙС, ЧУФБЧМЕООЩЕ Ч ПДЙО ЙЪ УФПМВГПЧ ФБВМЙГЩ.

уМЕДХАЭЙЕ ЙОУФТХЛГЙЙ УПЪДБАФ ФБВМЙГХ Й ФТЙЗЗЕТ ДМС ОЕЕ:

лПНБОДБ CREATE TRIGGER УПЪДБЕФ ФТЙЗЗЕТ ins_sum , ЛПФПТЩК УЧСЪБО У ФБВМЙГЕК account . ьФП ФБЛЦЕ ЧЛМАЮБЕФ РТЕДМПЦЕОЙС, ЛПФПТЩЕ ПРТЕДЕМСАФ ЧТЕНС БЛФЙЧБГЙЙ, УПВЩФЙЕ ЧЩЪПЧБ, Й ЮФП ДЕМБФШ У БЛФЙЧЙТПЧБООЩН ФТЙЗЗЕТПН ДБМШЫЕ:

лМАЮЕЧПЕ УМПЧП BEFORE ХЛБЪЩЧБЕФ ЧТЕНС УТБВБФЩЧБОЙС. ч ЬФПН УМХЮБЕ ФТЙЗЗЕТ ДПМЦЕО БЛФЙЧЙЪЙТПЧБФШ РЕТЕД ЛБЦДПК УФТПЛПК, ЧУФБЧМЕООПК Ч ФБВМЙГХ. дТХЗПЕ ДПРХУФЙНПЕ ЛМАЮЕЧПЕ УМПЧП ЪДЕУШ: AFTER .

лМАЮЕЧПЕ УМПЧП INSERT ХЛБЪЩЧБЕФ УПВЩФЙЕ, ЛПФПТПЕ БЛФЙЧЙЪЙТХЕФ ФТЙЗЗЕТ. ч ЬФПН РТЙНЕТЕ ФТЙЗЗЕТ УТБВБФЩЧБЕФ ПФ ЙОУФТХЛГЙЙ INSERT . чЩ НПЦЕФЕ ФБЛЦЕ УПЪДБЧБФШ ФТЙЗЗЕТЩ ДМС ЙОУФТХЛГЙК DELETE Й UPDATE .

йОУФТХЛГЙС FOR EACH ROW ПРТЕДЕМСЕФ, ЮФП ФТЙЗЗЕТ ДПМЦЕО УТБВПФБФШ ПДЙО ТБЪ ДМС ЛБЦДПК УФТПЛЙ, ОБ ЛПФПТХА ЧПЪДЕКУФЧХЕФ ЙОУФТХЛГЙС Ч РТЙНЕТЕ. уПВУФЧЕООП ФТЙЗЗЕТ РТЕДУФБЧМСЕФ УПВПК Ч ДБООПН УМХЮБЕ РТПУФПК SET , ЛПФПТЩК ОБЛБРМЙЧБЕФ ЪОБЮЕОЙС, ЧУФБЧМЕООЩЕ Ч УФПМВЕГ amount . йОУФТХЛГЙС ПВТБЭБЕФУС Л УФПМВГХ ЛБЛ NEW.amount , ЮФП ПЪОБЮБЕФ "ЪОБЮЕОЙЕ УФПМВГБ amount , ЛПФПТПЕ ВХДЕФ ЧУФБЧМЕОП Ч ОПЧХА УФТПЛХ".

юФПВЩ ЙУРПМШЪПЧБФШ ФТЙЗЗЕТ, ХУФБОПЧЙФЕ РЕТЕНЕООХА УХННБФПТБ Ч ОПМШ, ЧЩРПМОЙФЕ ЙОУФТХЛГЙА INSERT , Б ЪБФЕН РПУНПФТЙФЕ ФП, ЛБЛПЕ ЪОБЮЕОЙЕ РЕТЕНЕООБС ЙНЕЕФ РПЪЦЕ:

ч ЬФПН УМХЮБЕ ЪОБЮЕОЙЕ @sum РПУМЕ ЧЩРПМОЕОЙС ЛПНБОДЩ INSERT ТБЧОП 14.98 + 1937.50 — 100 ЙМЙ 1852.48 .

дМС ХОЙЮФПЦЕОЙС ФТЙЗЗЕТБ ЧЩРПМОЙФЕ DROP TRIGGER . чЩ ДПМЦОЩ ПРТЕДЕМЙФШ ЙНС УИЕНЩ, ЕУМЙ ФТЙЗЗЕТ ОЕ Ч ЪБДБООПК РП ХНПМЮБОЙА УИЕНЕ:

йНЕОБ ФТЙЗЗЕТПЧ УХЭЕУФЧХАФ Ч РТПУФТБОУФЧЕ ЙНЕО УИЕНЩ. ьФП ПЪОБЮБЕФ, ЮФП ЧУЕ ФТЙЗЗЕТЩ ДПМЦОЩ ЙНЕФШ ХОЙЛБМШОЩЕ ЙНЕОБ ЧОХФТЙ УИЕНЩ. фТЙЗЗЕТЩ Ч ТБЪМЙЮОЩИ УИЕНБИ НПЗХФ ЙНЕФШ ФП ЦЕ УБНПЕ ЙНС.

ч ДПРПМОЕОЙЕ Л ФТЕВПЧБОЙА, ЮФПВЩ ЙНС ФТЙЗЗЕТБ ВЩМП ХОЙЛБМШОЩН ДМС УИЕНЩ, ЙНЕАФУС ДТХЗЙЕ ПЗТБОЙЮЕОЙС ОБ ФЙРЩ ФТЙЗЗЕТПЧ, ЛПФПТЩЕ НПЦОП УПЪДБЧБФШ. чЩ ОЕ НПЦЕФЕ ЙНЕФШ ДЧБ ФТЙЗЗЕТБ ДМС ФБВМЙГЩ, ЛПФПТЩЕ ЙНЕАФ ФП ЦЕ УБНПЕ УПВЩФЙЕ Й ЧТЕНС БЛФЙЧБГЙЙ. оБРТЙНЕТ, чЩ ОЕ НПЦЕФЕ ПРТЕДЕМСФШ ДЧБ ФТЙЗЗЕТБ ФЙРБ BEFORE INSERT ЙМЙ AFTER UPDATE ДМС ФБВМЙГЩ. ьФП ТЕДЛП ДПМЦОП ВЩФШ ЪОБЮЙФЕМШОЩН ПЗТБОЙЮЕОЙЕН, РПУЛПМШЛХ ЪБРТПУФП НПЦОП ПРТЕДЕМЙФШ ФТЙЗЗЕТ, ЧЩРПМОСАЭЙК НОПЗП ЙОУФТХЛГЙК У РПНПЭША ЛПОУФТХЛГЙЙ BEGIN . END РПУМЕ FOR EACH ROW .

лМАЮЕЧЩЕ УМПЧБ OLD Й NEW ДБАФ ЧПЪНПЦОПУФШ чБН ПВТБФЙФШУС Л УФПМВГБН Ч УФТПЛБИ, ОБ ЛПФПТЩЕ ЧПЪДЕКУФЧХЕФ ФТЙЗЗЕТ OLD Й NEW ОЕ ЮХЧУФЧЙФЕМШОЩ Л ТЕЗЙУФТХ. ч ФТЙЗЗЕТЕ INSERT НПЦЕФ ЙУРПМШЪПЧБФШУС ФПМШЛП NEW. col_name : ОЕ ЙНЕЕФУС ОЙЛБЛПК УФБТПК УФТПЛЙ. ч ФТЙЗЗЕТЕ DELETE ОЕ ПЦЙДБЕФУС ОЙЛБЛПК ОПЧПК УФТПЛЙ, ФБЛ ЮФП НПЦЕФ ЙУРПМШЪПЧБФШУС ЙУЛМАЮЙФЕМШОП OLD. col_name . ч ФТЙЗЗЕТЕ UPDATE чЩ НПЦЕФЕ ЙУРПМШЪПЧБФШ OLD. col_name , ЮФПВЩ ПВТБФЙФШУС Л УФПМВГБН УФТПЛЙ РТЕЦДЕ, ЮЕН ПОЙ ЙЪНЕОСФУС, Й NEW. col_name , ЮФПВЩ ПВТБФЙФШУС Л ОЙН ХЦЕ РПУМЕ ЧОЕУЕОЙС ЙЪНЕОЕОЙК.

уФПМВЕГ, ЙНЕОПЧБООЩК OLD ФПМШЛП ДМС ЮФЕОЙС. чЩ НПЦЕФЕ ПВТБФЙФШУС Л ЬФПНХ УФПМВГХ (ЕУМЙ чЩ ЙНЕЕФЕ РТЙЧЙМЕЗЙА SELECT , ОП ОЕ ЙЪНЕОСЕФЕ ЕЗП. уФПМВЕГ, ЙНЕОПЧБООЩК NEW НПЦЕФ ХРПНЙОБФШУС, ЕУМЙ чЩ ЙНЕЕФЕ РТЙЧЙМЕЗЙА SELECT ДМС ОЕЗП. ч ФТЙЗЗЕТЕ BEFORE чЩ НПЦЕФЕ ФБЛЦЕ ЙЪНЕОСФШ ЪОБЮЕОЙЕ У SET NEW. col_name = value , ЕУМЙ чЩ ЙНЕЕФЕ РТЙЧЙМЕЗЙА UPDATE ДМС ЬФПЗП. ьФП ПЪОБЮБЕФ, ЮФП чЩ НПЦЕФЕ ЙУРПМШЪПЧБФШ ФТЙЗЗЕТ, ЮФПВЩ ЙЪНЕОЙФШ ЪОБЮЕОЙС, ЛПФПТЩЕ ВХДХФ ЧУФБЧМЕОЩ Ч ОПЧХА УФТПЛХ, ЙМЙ ЙУРПМШЪПЧБФШ ЬФП, ЮФПВЩ НПДЙЖЙГЙТПЧБФШ УФТПЛХ.

ч ФТЙЗЗЕТЕ BEFORE ЪОБЮЕОЙЕ NEW ДМС УФПМВГБ AUTO_INCREMENT : 0, Б ОЕ БЧФПНБФЙЮЕУЛЙ УЗЕОЕТЙТПЧБООЩК РПТСДЛПЧЩК ОПНЕТ, ЛПФПТЩК ВХДЕФ УЗЕОЕТЙТПЧБО, ЛПЗДБ ОПЧБС ЪБРЙУШ ЖБЛФЙЮЕУЛЙ ЧУФБЧМЕОБ.

OLD Й NEW РТЕДУФБЧМСАФ УПВПК MySQL-ТБУЫЙТЕОЙС ФТЙЗЗЕТПЧ.

йУРПМШЪХС ЛПОУФТХЛГЙА BEGIN . END , чЩ НПЦЕФЕ ПРТЕДЕМСФШ ФТЙЗЗЕТ, ЛПФПТЩК ЧЩРПМОСЕФ НОПЗП ЙОУФТХЛГЙК. чОХФТЙ ВМПЛБ BEGIN чЩ ФБЛЦЕ НПЦЕФЕ ЙУРПМШЪПЧБФШ ДТХЗПК УЙОФБЛУЙУ, ЛПФПТЩК РПЪЧПМСЕФУС ЧОХФТЙ УПИТБОЕООЩИ РПДРТПЗТБНН, ФЙРБ ХУМПЧОЩИ ЧЩТБЦЕОЙК Й ГЙЛМПЧ. пДОБЛП, ФПЮОП ЛБЛ ДМС УПИТБОЕООЩИ РПДРТПЗТБНН, ЕУМЙ чЩ ЙУРПМШЪХЕФЕ РТПЗТБННХ mysql , ЮФПВЩ ПРТЕДЕМЙФШ ФТЙЗЗЕТ, ОЕПВИПДЙНП РЕТЕПРТЕДЕМЙФШ ПРЕТБФПТОЩК ТБЪДЕМЙФЕМШ mysql ФБЛ, ЮФПВЩ чЩ НПЗМЙ ЙУРПМШЪПЧБФШ ; ЛБЛ ПРЕТБФПТОЩК ТБЪДЕМЙФЕМШ ЧОХФТЙ ПРЙУБОЙС ФТЙЗЗЕТБ. уМЕДХАЭЙК РТЙНЕТ ЙММАУФТЙТХЕФ ЬФЙ НПНЕОФЩ. ьФП ПРТЕДЕМСЕФ ФТЙЗЗЕТ UPDATE , ЛПФПТЩК РТПЧЕТСЕФ ОПЧПЕ ЪОБЮЕОЙЕ, ЛПФПТПЕ ОХЦОП ЙУРПМШЪПЧБФШ ДМС НПДЙЖЙГЙТПЧБОЙС ЛБЦДПК УФТПЛЙ, Й ЙЪНЕОСЕФ ЪОБЮЕОЙЕ, ЮФПВЩ ПУФБЧБФШУС ЧОХФТЙ ДЙБРБЪПОБ ПФ 0 ДП 100. ьФП ДПМЦОП ВЩФШ ФТЙЗЗЕТПН ФЙРБ BEFORE , РПФПНХ ЮФП ЪОБЮЕОЙЕ ДПМЦОП ВЩФШ РТПЧЕТЕОП РТЕЦДЕ, ЮЕН ПОП ЙУРПМШЪХЕФУС, ЮФПВЩ НПДЙЖЙГЙТПЧБФШ УФТПЛХ:

Читайте также:  Что делать если гугл не открывает страницы

нПЦЕФ ВЩФШ РТПЭЕ ПРТЕДЕМЙФШ УПИТБОЕООХА РТПГЕДХТХ ПФДЕМШОП Й ЪБФЕН ЧЩЪЧБФШ ЕЕ ЙЪ ФТЙЗЗЕТБ РТПУФПК ЙОУФТХЛГЙЕК CALL . ьФП ФБЛЦЕ ЧЩЗПДОП, ЕУМЙ чЩ ИПФЙФЕ ЧЩЪЩЧБФШ ФХ ЦЕ УБНХА РПДРТПЗТБННХ ЙЪОХФТЙ ОЕУЛПМШЛЙИ ФТЙЗЗЕТПЧ.

йНЕАФУС ОЕЛПФПТЩЕ ПЗТБОЙЮЕОЙС ОБ ФП, ЮФП НПЦЕФ РПСЧМСФШУС Ч ЙОУФТХЛГЙСИ:

фТЙЗЗЕТ ОЕ НПЦЕФ ЙУРПМШЪПЧБФШ ЙОУФТХЛГЙА CALL , ЮФПВЩ ЧЩЪЧБФШ УПИТБОЕООЩЕ РТПГЕДХТЩ, ЛПФПТЩЕ ЧПЪЧТБЭБАФ ДБООЩЕ РПМШЪПЧБФЕМА ЙМЙ РТЙНЕОСАФ ДЙОБНЙЮЕУЛЙК SQL. рТПГЕДХТБН РПЪЧПМСЕФУС ЧПЪЧТБФЙФШ ДБООЩЕ ФТЙЗЗЕТХ ЮЕТЕЪ РБТБНЕФТЩ OUT ЙМЙ INOUT .

фТЙЗЗЕТ ОЕ НПЦЕФ ЙУРПМШЪПЧБФШ ЙОУФТХЛГЙЙ, ЛПФПТЩЕ СЧОП ЙМЙ ОЕСЧОП ОБЮЙОБАФ ЙМЙ ЪБЛБОЮЙЧБАФ ФТБОЪБЛГЙА, ФЙРБ START TRANSACTION , COMMIT ЙМЙ ROLLBACK .

дП MySQL 5.0.10 ФТЙЗЗЕТ ОЕ НПЦЕФ УПДЕТЦБФШ РТСНЩЕ УУЩМЛЙ Л ЙНЕОБН ФБВМЙГ.

MySQL ПВТБВБФЩЧБЕФ ПЫЙВЛЙ Ч ЧЩРПМОЕОЙЙ ФТЙЗЗЕТПЧ УМЕДХАЭЙН ПВТБЪПН:

еУМЙ РТПВМЕНЩ У ФТЙЗЗЕТПН BEFORE , ПРЕТБГЙЙ ОБ УППФЧЕФУФЧХАЭЕК УФТПЛЕ РТПУФП ОЕ ЧЩРПМОСАФУС.

фТЙЗЗЕТ BEFORE БЛФЙЧЙЪЙТПЧБО РПРЩФЛПК ЧУФБЧЙФШ ЙМЙ ЙЪНЕОЙФШ УФТПЛХ, ОЕЪБЧЙУЙНП ПФ ФПЗП, ХДБЮОПК МЙ ВЩМБ РПРЩФЛБ.

фТЙЗЗЕТ AFTER ЧЩРПМОЕО ФПМШЛП, ЕУМЙ ФТЙЗЗЕТ BEFORE Й ПРЕТБГЙС УП УФТПЛПК (ЧНЕУФЕ!) ЧЩРПМОСАФУС ХУРЕЫОП.

пЫЙВЛБ Ч ФТЙЗЗЕТЕ BEFORE ЙМЙ AFTER ЧЩЪЩЧБЕФ УВПК ЧУЕК ЙОУФТХЛГЙЙ, ЛПФПТБС ЧЩЪЧБМБ ФТЙЗЗЕТ.

дМС ФТБОЪБЛГЙПООЩИ ФБВМЙГ УВПК ЙОУФТХЛГЙЙ ДПМЦЕО ЧЩЪЧБФШ ПВТБФОХА РЕТЕНПФЛХ ЧУЕИ ЙЪНЕОЕОЙК, ЧЩРПМОСЕНЩИ ЙОУФТХЛГЙЕК. уВПК ФТЙЗЗЕТБ ФБЛЦЕ ЧЩЪЩЧБЕФ ПВТБФОХА РЕТЕНПФЛХ, РПУЛПМШЛХ СЧМСЕФУС РТЙЮЙОПК УВПС ЛПНБОДЩ Ч ГЕМПН. дМС ОЕФТБОЪБЛГЙПООЩИ ФБВМЙГ ФБЛБС ПВТБФОБС РЕТЕНПФЛБ ОЕ НПЦЕФ ВЩФШ ЧЩРПМОЕОЩ, ФБЛ ЮФП, ИПФС ПРЕТБФПТОЩК УВПК РТПЙЪПЫЕМ, МАВЩЕ ЙЪНЕОЕОЙС, ЧЩРПМОЕООЩЕ ДП ПЫЙВЛЙ, ПУФБАФУС Ч УЙМЕ.

6.4. MySQL 5 FAQ РП ФТЙЗЗЕТБН

6.4.1: йНЕЕФУС МЙ ЖПТХН ДМС ПВУХЦДЕОЙС ФТЙЗЗЕТПЧ Ч MySQL?

6.4.2: MySQL 5.1 ЙНЕЕФ ФТЙЗЗЕТЩ ПРЕТБФПТОПЗП ХТПЧОС ЙМЙ ХТПЧОС УФТПЛЙ?

ч MySQL 5.1 ЧУЕ ФТЙЗЗЕТЩ FOR EACH ROW , ФП ЕУФШ ФТЙЗЗЕТ БЛФЙЧЙЪЙТПЧБО ДМС ЛБЦДПК УФТПЛЙ, ЛПФПТБС ЧУФБЧМЕОБ, НПДЙЖЙГЙТХЕФУС ЙМЙ ХДБМЕОБ. MySQL 5.1 ОЕ РПДДЕТЦЙЧБЕФ ЙУРПМШЪПЧБОЙЕ ФТЙЗЗЕТПЧ FOR EACH STATEMENT .

6.4.3: йНЕЕФУС МЙ МАВПЕ ЪОБЮЕОЙЕ РП ХНПМЮБОЙА ДМС ФТЙЗЗЕТПЧ?

оЕСЧОП. MySQL ЙНЕЕФ УРЕГЙЖЙЮЕУЛПЕ УРЕГЙБМШОПЕ РПЧЕДЕОЙЕ ДМС ОЕЛПФПТЩИ УФПМВГПЧ TIMESTAMP , Б ФБЛЦЕ ДМС УФПМВГПЧ, ЛПФПТЩЕ ПРТЕДЕМЕОЩ, ЙУРПМШЪХС AUTO_INCREMENT .

6.4.4: лБЛ ХРТБЧМСФШ ФТЙЗЗЕТБНЙ Ч MySQL?

ч MySQL 5.1 ФТЙЗЗЕТ НПЦЕФ ВЩФШ УПЪДБО, ЙУРПМШЪХС ЙОУФТХЛГЙА CREATE TRIGGER , Б ХДБМЕО ЙОУФТХЛГЙЕК DROP TRIGGER .

йОЖПТНБГЙС ПФОПУЙФЕМШОП ФТЙЗЗЕТПЧ НПЦЕФ ВЩФШ РПМХЮЕОБ, ЪБРТБЫЙЧБС ФБВМЙГХ INFORMATION_SCHEMA.TRIGGERS .

6.4.5: йНЕЕФУС МЙ УРПУПВ РТПУНПФТЕФШ ЧУЕ ФТЙЗЗЕТЩ Ч ЛПОЛТЕФОПК ВБЪЕ ДБООЩИ?

дБ. чЩ НПЦЕФЕ РПМХЮБФШ ТБУРЕЮБФЛХ ЧУЕИ ФТЙЗЗЕТПЧ, ПРТЕДЕМЕООЩИ Ч ВБЪЕ ДБООЩИ dbname , ЪБРТПУПН Л ФБВМЙГЕ INFORMATION_SCHEMA.TRIGGERS РТЙНЕТОП ФБЛ:

чЩ НПЦЕФЕ ФБЛЦЕ ЙУРПМШЪПЧБФШ ЙОУФТХЛГЙА SHOW TRIGGERS , ЛПФПТБС СЧМСЕФУС УРЕГЙЖЙЮЕУЛПК ДМС MySQL.

6.4.6: зДЕ ИТБОСФУС ФТЙЗЗЕТЩ?

фТЙЗЗЕТЩ Ч ОБУФПСЭЕЕ ЧТЕНС УПИТБОЕОЩ Ч .TRG -ЖБКМБИ, ПДЙО ФБЛПК ЖБКМ ОБ ФБВМЙГХ. дТХЗЙНЙ УМПЧБНЙ, ФТЙЗЗЕТ РТЙОБДМЕЦЙФ ФБВМЙГЕ.

ч ВХДХЭЕН, НЩ РМБОЙТХЕН ЙЪНЕОСФШ ЬФП ФБЛ, ЮФПВЩ ЙОЖПТНБГЙС ФТЙЗЗЕТБ ЧЛМАЮБМБУШ Ч .FRM -ЖБКМ, ЛПФПТЩК ПРТЕДЕМСЕФ УФТХЛФХТХ ФБВМЙГЩ. фБЛЦЕ РМБОЙТХЕФУС УДЕМБФШ ФТЙЗЗЕТЩ ХТПЧОС ВБЪЩ ДБООЩИ, ЮФПВЩ РТЙЧЕУФЙ ЙИ Ч УПЗМБУЙЕ У SQL-УФБОДБТФПН.

6.4.7: нПЦЕФ ФТЙЗЗЕТ ЧЩЪЩЧБФШ УПИТБОЕООХА РТПГЕДХТХ?

6.4.8: нПЦЕФ ФТЙЗЗЕТ ПВТБЭБФШУС Л ФБВМЙГБН?

фТЙЗЗЕТ НПЦЕФ ПВТБЭБФШУС Л УФБТЩН Й ОПЧЩН ДБООЩН Ч УПВУФЧЕООПК ФБВМЙГЕ. юЕТЕЪ УПИТБОЕООХА РТПГЕДХТХ, НОПЗПФБВМЙЮОХА НПДЙЖЙЛБГЙА ЙМЙ ЙОУФТХЛГЙА ХДБМЕОЙС ФТЙЗЗЕТ НПЦЕФ ФБЛЦЕ ЧПЪДЕКУФЧПЧБФШ Й ОБ ДТХЗЙЕ ФБВМЙГЩ.

6.4.9: нПЦЕФ ФТЙЗЗЕТ ЧЩЪЩЧБФШ ЧОЕЫОАА РТЙЛМБДОХА РТПЗТБННХ ЮЕТЕЪ UDF?

оЕФ, ОЕ Ч ОБУФПСЭЕЕ ЧТЕНС.

6.4.10: нПЦЕФ ФТЙЗЗЕТ НПДЙЖЙГЙТПЧБФШ ФБВМЙГЩ ОБ ХДБМЕООПН УЕТЧЕТЕ?

дБ. фБВМЙГБ ОБ ХДБМЕООПН УЕТЧЕТЕ НПЗМБ ВЩ НПДЙЖЙГЙТПЧБФШУС, ЙУРПМШЪХС ФЙР РБНСФЙ FEDERATED .

Думаю, самое время заняться еще одним типом именованных блоков PL/SQL, а именно триггеры таблиц БД. Сам по себе триггер БД, является именованным блоком PL/SQL и после компиляции хранится, в соответствующих словарях данных вашей БД. Но он имеет ряд особенностей. Процедуры или функции, которые мы с вами уже разбирали могут вызывать или быть вызваны другими процедурами, при этом им могут быть переданы параметры. Триггер — не может быть вызван из другой процедуры БД и не принимает никаких параметров при вызове. Само название говорит о том, что этот блок PL/SQL — срабатывает при определенном событии, а именно при запуске операций DMLINSERT, UPDATE, DELETE. Существуют так же так называемые системные триггеры, которые срабатывают на события самой БД. Но о них чуть позже. В основном триггеры используются для:

  1. Реализации сложных ограничений целостности данных, которые невозможно осуществить через описательные ограничения, устанавливаемые при создании таблиц.
  2. Организации всевозможных видов аудита. Например, слежения за изменениями в какой-либо важной таблице БД.
  3. Автоматического оповещения других модулей о том, что делать в случае изменения информации содержащейся в таблице БД.
  4. Для реализации так называемых "бизнес правил".
  5. Для организации каскадных воздействий на таблицы БД.

В принципе по ходу работы можете придумать еще что-нибудь! Вообще триггеры очень удобная и полезная вещь в БД. Так же триггеры имеют определенные правила активации (firing), а именно:

  1. До момента сработки одного из операторов DMLINSERT, UPDATE, DELETE.
  2. После момента сработки одного из операторов DMLINSERT, UPDATE, DELETE.
Читайте также:  Flow exe что это

Синтаксис команды для создания триггера, следующий:

Где:

  • имя_триггера — собственно имя вашего триггера.
  • активизирующее_событие — указывает момент активации триггера BEFORE до срабатывания оператора DML, AFTER после срабатывания оператора DML.
  • ссылка_на_таблицу — собственно таблица, для которой создан триггер.
  • FOR EACH ROW — если указано активируется от воздействия на строку если нет, то после любого оператора DML.
  • условие_срабатывания — если TRUE триггер срабатывает, если FALSE нет.
  • тело_триггера — собственно тело триггера.

Для полноты картины определимся с таким фактом, что триггеры имеют собственное пространство имен (namespace). Что это означает, само понятие namespace — применимо вообще во многих языках программирования. В пределах одного пространства имен не может быть двух функций или процедур с одинаковым именем! Так вот, так как пространство имен у триггеров свое, то может иметь место ситуация, когда какой-либо триггер имеет тоже имя, что и процедура или функция в пределах одной схемы (не путать с пространством имен это разные вещи!). Но двух триггеров с одинаковым именем не бывает! Так же триггер, может иметь имя совпадающее с именем таблицы, для которой он создан. Но лучше этого не делать, а дать триггеру имя указывающее на то, что он производит! Вообще, по моему мнению, такое понятие как имя для триггера по большому счету архаично! Ведь триггер нельзя "позвать" из процедуры или функции — это запрещено! Так нафига ему имя! Можно было сделать что-то вроде универсальной цифровой маркировки. Хотя имя дает триггеру осмысленность, что улучшает чтение кода БД! Теперь давайте посмотрим на типы триггеров и моменты срабатывания и что все это значит. Итак:

Категории Значение Комментарии
Оператор INSERT, UPDATE, DELETE Определяет какой оператор DML вызывает активацию (firing) триггера.
Момент времени BEFORE, AFTER Определяет момент активации триггера: до или после выполнения оператора.
Уровень Строка или оператор Если триггер является строковым он активируется один раз для каждой из строк, на которую воздействует оператор вызывающий срабатывания триггера (опция FOR EACH ROW). Если триггер является операторным то он активируется один раз до или после оператора.

Если посмотреть внимательнее, то значения заданные для оператора, момента времени и уровня, определяют тип триггера. Всего получается 12 возможных типов — 3 оператора, 2 момента времени, 2 уровня. Количество триггеров, для отдельной таблицы в принципе не ограничивается в версии Oracle 8i и выше, но делать их слишком много нет смысла. Так же триггер может срабатывать от нескольких операторов DML, если это необходимо. Вот собственно, основная теоретическая часть по триггерам БД. Далее попробуем это на практике.

Is it possible somehow to execute some code for each row of an select without using a cursor?

In my case: I’m having a temp table to store some data for a complexe script. At the end i want to pint some informations of this table (limited by some conditions) to the output.

Currently I’m using a cursor with a select to limit the rows of the table. In this cursor I’m using

to generate the output.

There must be an easier way to do such things.

2 Answers 2

Executing a print statement for each row in a result set pretty much requires a cursor or an approach similar to this

You are still looping thru each row, but you avoid a cursor. Since you are using a table var you instead of a cursor you avoid table locking, but this is not necessarily a better approach. You can process row by row in a variety of possible ways such as adding an "processed column" or numbering all of the selected rows 1..n and iterating based on the rownumber

You can only avoid row by row processing if you can perform a set-based operation. There is not enough information in your question to see if this is avoidable in TSQL

Now, writing a CLR proc may be more flexible as you have a much richer programming model, and there is little overhead to looping through each row of the result set within the CLR proc. Making a database call from the CLR proc for each row that a database call from each row in TSQL

EDIT — I see someone already added one possible way to convert you print statements into a set oriented operation. i.e.

This is OK, in fact optimal what I was referring to when I said performing a set operation. A set based operation is always preferred when possible . It may not be obvious, but string concatenation can also get very slow in this example too if many rows are involved.

I said that using a temp var avoids table locking. This is not precisely true as sql server does write temp vars to a table in tempdb. What I really meant was that you avoid locking a production table and since you are guaranteed to be the only user of this table, you don’t compete for concurrent access.

I also made no attempt to make optimize this. For example, the inner loop could track the id and the where condition becomes where id>@id (you will also want a primary key defined on id). Since the temp table is not updated during each loop iteration I would expect it to be faster.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.