Сөйтіп, деректер файлдары толығымен қалпына келтіріледі.
Өзгерістер журналының файлы толығымен толтырылған кезде,
журнал ауыстырылады жəне LGWR ҥрдісі жаңа файлды бастайды.
Журнал ауыстырылған кезде ARCH ҥрдісі толтырылған файлды
журналдау файлдарының мҧрағатына жазады. Мҧрағаттау аяқталған
кезде, өзгерістер журналының файлы қолжетімді болып белгіленеді.
Өзгерістер журналының мҧрағаттық файлдары сенімді сақталу керек,
себебі олар жҥйені қалпына келтіру ҥшін қажет болуы мҥмкін.
12.9. Oracle-
дегі триггерлер
Триггерлерді, сақталатын рəсімдерді жəне жай ғана скрипттерді
қҧру ҥшін (Oracle-де олар атаусыз блоктар деп аталады) Oracle-дің өз
тілі қҧрылған. Бҧл тіл PL/SQL (Program Language SQL) деп аталады.
Әрбір кесте ҥшін 12 триггер қҧруға болады. Триггердің шаблоны
мынадай:
CREATE TRIGGER [name] (триггерді шақыру оқиғасы)...
(триггерді шектеу міндетті емес)
BEGIN
(триггердің əрекет етуі)
END;
Триггерді анықтау кезінде қанша рет орындалу керектігін
көрсетуге
болады: əрбір өзгертілетін жол ҥшін (row trigger) немесе қанша жол
өзгертілетініне тəуелсіз (statement trigger) барлық орындалатын тіркес
ҥшін бір рет.
Row trigger — триггердің жиі пайдаланылатын тҥрі. Әрбір жол
ҥшін бір рет орындалады. Мысалы, егер SQL-тіркес UPDATE кестедегі
бірнеше жолды жаңартса, онда триггер UPDATE тіркесімен
өзгертілетін əрбір жол ҥшін шақырылады. Егер тіркес бірде бір жолға
əсер етпесе, онда триггер шақырылмайды.
Statement trigger — бірде бір жол өзгертілмесе де, кестедегі
өзгертілген жолдар санына тəуелсіз шақырылады. Мысалы, егер
DELETE тіркесі кестеден бірнеше жолды жойса, онда DELETE тіркесі
деңгейінің триггері кестеден қанша жол жойылатынына тəуелсіз бір
рет қана шақырылады.
Триггердің айқындау кезінде тіркеске дейін немесе кейін - (trigger
timing) триггердің орындалу сəтін көрсету керек. BEFORE жəне
AFTER тіркес триггерлеріне жəне жол триггерлеріне қолданбалы.
INSTEAD-OF (орнына) — Oracle қолданатын триггердің тағы бір
тҥрі.
INSTEAD-OF триггерлері тек Oracle8i редакциясында қолжетімді.
Олар көп кестелі жəне объектті көріністерде пайдаланылуы мҥмкін.
Олар басқа триггерлерге қарағанда DML-тіркестері (INSERT, UPDATE
жəне DELETE) орындаудың орнына қолданылады.
Көріністі INSERT, UPDATE жəне DELETE көмегімен қалыпты
кесте ретінде тҥрлендіруге болады жəне тиісті өзгеріс ҥшін INSTEAD-
OF триггер іске қосылады. INSTEAD-OF триггерлер əрбір өзгертілетін
жол ҥшін активтендіріледі.
INSTEAD-OF триггерлерінің мҥмкіндіктерін көрсету ҥшін əрбір
бөлімнің менеджерлерін атап өтетін триггерді (view manager_info)
жасаймыз:
CREATE VIEW manager_info AS
SELECT d.deptno, d.deptname, e.empno, e.empname
FROM emp e, dept d
WHERE e.empno = d.manager_num;
Енді көріністегі ендірмені өңдейтін INSTEAD-OF триггерін
айқындаймыз.
view
manager_info-ге
ендірме
dept
кестенің
manager_num бағанын жаңарту операциясына трансляциялануы
мүмкін.
Триггерде бөлім менеджері көрсеткен бөлімде ең болмағанда бір
жҧмысшы жҧмыс істеу керектігін көрсететін шектеуді айқындауға
болады.
CREATE TRIGGER manager_info_insert
INSTEAD OF INSERT ON manager_info
--жаңа
менеджер туралы ақпарат
REFERENCING NEW AS n
FOR EACH ROW
DECLARE
empCount NUMBER;
BEGIN
/* Бірінші тексеру бөлім жҧмысшыларының саны бірден артық
екенін растау ҥшін орындалады */
SELECT COUNT(*) INTO empCount
FROM emp e
WHERE e.deptno =:n.deptno;
/* Егер жҧмысшы жеткілікті болса, онда оны менеджер қылу
керек*/
IF empCount >= 1 THEN
UPDATE dept d SET
manager_num = :n.empno
WHERE d.deptno = :n.deptno;
END IF;
END;