Водич за Орацле ПЛ / СКЛ окидач: уместо, сложени (пример)

Преглед садржаја:

Anonim

Шта је окидач у ПЛ / СКЛ-у?

ТРИГГЕРС су ускладиштени програми које Орацле енгине аутоматски покреће када се на табели изврше ДМЛ изјаве попут уметања, ажурирања, брисања или када се десе неки догађаји. Код који треба извршити у случају окидача може се дефинисати према захтеву. Можете одабрати догађај након којег треба активирати окидач и време извршења. Сврха окидача је да одржи интегритет информација у бази података.

У овом упутству ћете научити-

  • Предности окидача
  • Врсте окидача у Орацле-у
  • Како створити окидач
  • : НОВО и: СТАРА клаузула
  • УМЕСТО Окидача
  • Сложени окидач

Предности окидача

Следе предности окидача.

  • Аутоматско генерисање неких изведених вредности колона
  • Спровођење референтног интегритета
  • Евидентирање догађаја и чување информација о приступу табели
  • Ревизија
  • Синхрона репликација табела
  • Изрицање безбедносних овлашћења
  • Спречавање неважећих трансакција

Врсте окидача у Орацле-у

Окидачи се могу класификовати на основу следећих параметара.

  • Класификација на основу времена
    • ПРЕ Окидача: Пали се пре него што се догоди наведени догађај.
    • ПОСЛЕ Окидача: Активира се након што се догодио наведени догађај.
    • УМЕСТО Окидача: Посебан тип. Сазнаћете више о даљим темама. (само за ДМЛ)
  • Класификација на основу нивоа
    • Окидач на нивоу СТАТЕМЕНТ: Покреће се једном за наведени исказ догађаја.
    • Окидач РЕДНОГ нивоа: Активира се за сваки запис на који је утицало у наведеном догађају. (само за ДМЛ)
  • Класификација заснована на догађају
    • ДМЛ окидач: Активира се када је наведен ДМЛ догађај (ИНСЕРТ / УПДАТЕ / ДЕЛЕТЕ)
    • ДДЛ окидач: Активира се када је наведен ДДЛ догађај (ЦРЕАТЕ / АЛТЕР)
    • Окидач ДАТАБАСЕ: Активира се када је наведен догађај базе података (ЛОГОН / ЛОГОФФ / СТАРТУП / СХУТДОВН)

Дакле, сваки окидач је комбинација горе наведених параметара.

Како створити окидач

Испод је синтакса за креирање окидача.

CREATE [ OR REPLACE ] TRIGGER 
[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON[FOR EACH ROW][WHEN ]DECLAREBEGINEXCEPTIONEND;

Објашњење синтаксе:

  • Горња синтакса приказује различите опционалне изјаве присутне у стварању окидача.
  • ПРЕ / ПОСЛЕ ће одредити време догађаја.
  • ИНСЕРТ / УПДАТЕ / ЛОГОН / ЦРЕАТЕ / итд. назначиће догађај за који треба активирати окидач.
  • Клаузула ОН ће одредити на којем је објекту горе наведени догађај валидан. На пример, ово ће бити име табеле на којој се може догодити ДМЛ догађај у случају ДМЛ окидача.
  • Команда "ЗА СВАКИ РЕД" ће одредити окидач нивоа РОВ.
  • Клаузула ВХЕН ће навести додатни услов у којем окидач треба да се активира.
  • Декларацијски дио, дио извршења, дио за руковање изнимкама исти је као и код осталих ПЛ / СКЛ блокова. Декларација и део за руковање изузецима нису обавезни.

: НОВО и: СТАРА клаузула

У окидачу на нивоу реда, окидач се активира за сваки сродни ред. А понекад је потребно знати вредност пре и после ДМЛ израза.

Орацле је обезбедио две клаузуле у окидачу на нивоу РЕЦОРД-а да држе ове вредности. Ове клаузуле можемо користити за упућивање на старе и нове вредности унутар тела окидача.

  • : НОВО - Садржи нову вредност за колоне основне табеле / ​​погледа током извршавања окидача
  • : ОЛД - Садржи стару вредност колона основне табеле / ​​погледа током извршавања окидача

Ову клаузулу треба користити на основу ДМЛ догађаја. Испод табеле биће наведено која је клаузула важећа за који ДМЛ израз (ИНСЕРТ / УПДАТЕ / ДЕЛЕТЕ).

ИНСЕРТ АЖУРИРАЊЕ ИЗБРИШИ
:НОВА ВАЖИ ВАЖИ ИНВАЛИДНО. У случају брисања нема нове вредности.
: СТАРО ИНВАЛИДНО. У уметнутом случају нема старе вредности ВАЖИ ВАЖИ

УМЕСТО Окидача

„УМЕСТО Окидача“ је посебна врста окидача. Користи се само у ДМЛ окидачима. Користи се када ће се на сложеном приказу догодити било који ДМЛ догађај.

Размотримо пример у коме је приказ направљен из 3 основне табеле. Када се било који ДМЛ догађај изда преко овог приказа, то ће постати неваљано јер су подаци преузети из 3 различите табеле. Дакле, у овом ИНСТЕАД ОФ се користи окидач. Окидач УМЕСТО ОФ користи се за директну модификацију основних табела уместо за модификовање приказа за дати догађај.

Пример 1 : У овом примеру ћемо створити сложени приказ из две основне табеле.

  • Табле_1 је емп табле и
  • Табела_2 је табела одељења.

Тада ћемо видети како се окидач ИНСТЕАД ОФ користи за издавање АЖУРИРАЊА изјаве о детаљима локације на овом сложеном приказу. Такође ћемо видети како је: НЕВ и: ОЛД корисно у окидачима.

  • Корак 1: Стварање табеле 'емп' и 'депт' са одговарајућим колонама
  • Корак 2: Попуњавање табеле вредностима узорка
  • Корак 3: Креирање погледа за горе створену табелу
  • Корак 4: Ажурирање приказа пре окидача уместо окидача
  • Корак 5: Израда окидача уместо окидача
  • Корак 6: Ажурирање приказа након окидача уместо окидача

Корак 1) Стварање табеле 'емп' и 'депт' са одговарајућим колонама

CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept(Dept_no NUMBER,Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/

Објашњење кода

  • Линија кода 1-7 : Стварање табеле 'емп'.
  • Линија кода 8-12 : Стварање „одељења“ табеле.

Оутпут

Табела је креирана

Корак 2) Пошто смо креирали табелу, попунићемо је табелом примерима вредности и стварањем приказа за горње табеле.

BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN');COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10);COMMIT;END;/

Објашњење кода

  • Линија кода 13-19 : Уметање података у 'депт' табелу.
  • Линија кода 20-26: Уметање података у табелу 'емп'.

Оутпут

Завршена ПЛ / СКЛ процедура

Корак 3) Стварање приказа за горе створену табелу.

CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;

Објашњење кода

  • Линија кода 27-32: Стварање приказа 'гуру99_емп_виев'.
  • Линија кода 33: Упит за гуру99_емп_виев.

Оутпут

Поглед створен

ИМЕ ЗАПОСЛЕНОГ ДЕПТ_НАМЕ ЛОКАЦИЈА
ЗЗЗ ХР сад
ИИИ ПРОДАЈА УК
КСКСКС ФИНАНСИЈСКИ ЈАПАН

Корак 4) Ажурирање приказа пре него окидач.

BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/

Објашњење кода

  • Линија кода 34-38: Ажурирајте локацију „КСКСКС“ на „ФРАНЦЕ“. Покренуо је изузетак јер ДМЛ изрази нису дозвољени у сложеном приказу.

Оутпут

ОРА-01779: не може изменити колону која се пресликава у табелу која није сачувана кључем

ОРА-06512: на линији 2

Корак 5) Да бисмо избегли грешку приликом ажурирања приказа у претходном кораку, у овом кораку ћемо користити „уместо окидача“.

CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/

Објашњење кода

  • Редак кода 39: Стварање ИНСТЕАД ОФ окидача за догађај 'УПДАТЕ' у приказу 'гуру99_емп_виев' на нивоу РЕД. Садржи изјаву за ажурирање за ажурирање локације у основној табели 'депт'.
  • Редак кода 44: Изјава о ажурирању користи „: НЕВ“ и „: ОЛД“ за проналажење вредности колона пре и после ажурирања.

Оутпут

Окидач је створен

Корак 6) Ажурирање приказа након окидача уместо окидача. Сада грешка неће доћи јер ће „уместо окидача“ управљати операцијом ажурирања овог сложеног приказа. А када се код изврши, локација запосленог КСКСКС биће ажурирана на „Француска“ из „Јапана“.

BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;

Објашњење кода:

  • Линија кода 49-53: Ажурирање локације „КСКСКС“ у „ФРАНЦУСКА“. Успешан је јер је окидач 'УМЕСТО' зауставио стварни приказ ажурирања који је приказан и извршио ажурирање основне табеле.
  • Редак кода 55: Провера ажурираног записа.

Излаз:

ПЛ / СКЛ процедура је успешно завршена

ИМЕ ЗАПОСЛЕНОГ ДЕПТ_НАМЕ ЛОКАЦИЈА
ЗЗЗ ХР сад
ИИИ ПРОДАЈА УК
КСКСКС ФИНАНСИЈСКИ ФРАНЦУСКА

Сложени окидач

Сложени окидач је окидач који вам омогућава да одредите радње за сваку од четири временске тачке у телу појединачног окидача. Четири различита временска места која подржава су као у наставку.

  • ПРЕ ИЗЈАВЕ - ниво
  • ПРЕ РЕДА - ниво
  • ПОСЛЕ РЕДА - ниво
  • ПОСЛЕ ИЗЈАВЕ - ниво

Пружа могућност комбиновања радњи за различито време у исти окидач.

CREATE [ OR REPLACE ] TRIGGER 
FOR[INSERT | UPDATE | DELET… .]ON ‭ ‬BEFORE STATEMENT ISBEGIN;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN;END EACH ROW;AFTER EACH ROW ISBEGIN;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN;END AFTER STATEMENT;END;

Објашњење синтаксе:

  • Горња синтакса приказује стварање окидача 'ЦОМПОУНД'.
  • Декларативни одељак је уобичајен за све блокове извршења у телу окидача.
  • Ова 4 временска блока могу бити у било којој секвенци. Није обавезно имати сва ова 4 временска блока. Можемо створити окидач ЦОМПОУНД само за времена која су потребна.

Пример 1 : У овом примеру ћемо створити окидач за аутоматско попуњавање колоне зараде са подразумеваном вредношћу 5000.

CREATE TRIGGER emp_trigFOR INSERTON empCOMPOUND TRIGGERBEFORE EACH ROW ISBEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30);COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;

Објашњење кода:

  • Кодна линија 2-10 : Стварање сложеног окидача. Креиран је за временско одређивање ПРИЈЕ РЕДА за попуњавање зараде са заданом вриједношћу 5000. Ово ће промијенити плату на задану вриједност '5000' прије уметања записа у табелу.
  • Линија кода 11-14 : Уметните запис у табелу 'емп'.
  • Редак кода 16 : Провера уметнутог записа.

Излаз:

Окидач је направљен

ПЛ / СКЛ процедура је успешно завршена.

ЕМП_НАМЕ ЕМП_НО ПЛАТА МЕНАЏЕР ДЕПТ_НО
ЦЦЦ 1004 5000 ААА 30

Омогућавање и онемогућавање окидача

Окидачи могу бити омогућени или онемогућени. Да бисте омогућили или онемогућили окидач, потребно је дати израз АЛТЕР (ДДЛ) за окидач који га онемогућава или омогућава.

Испод је синтакса омогућавања / онемогућавања окидача.

ALTER TRIGGER 
 [ENABLE|DISABLE];ALTER TABLE 
 [ENABLE|DISABLE] ALL TRIGGERS;

Објашњење синтаксе:

  • Прва синтакса показује како омогућити / онемогућити појединачни окидач.
  • Друга изјава показује како омогућити / онемогућити све окидаче на одређеној табели.

Резиме

У овом поглављу научили смо о ПЛ / СКЛ окидачима и њиховим предностима. Такође смо научили различите класификације и разговарали УМЕСТО окидача и окидача ЦОМПОУНД.