Wyzwalacze Wyzwalacze: • podobnie jak procedury i funkcje, są

Transkrypt

Wyzwalacze Wyzwalacze: • podobnie jak procedury i funkcje, są
Wyzwalacze
Wyzwalacze:
•
podobnie jak procedury i funkcje, są nazwanymi blokami PL/SQL zawierającymi sekcje
deklaracji, wykonania i obsługi wyjątków;
•
nie akceptują argumentów;
•
muszą być składowane jako samodzielne obiekty w bazie danych i nie mogą występować
lokalnie w bloku lub w pakiecie;
•
są wykonywane niejawnie (lub inaczej uruchamiany (ang. firing)), o ile wystąpi zdarzenie
wyzwalające, którym może być, np. operacja DML (INSERT, UPDATE lub DELETE)
wykonywana dla tabeli lub odpowiedniego rodzaju perspektyw; uruchomienie lub
zamknięcie bazy danych oraz pewne rodzaje operacji DDL.
Wyzwalacze stosuje się między innymi:
•
Utrzymanie złożonych więzów integralności, niemożliwych do uzyskania przez więzy
deklaracji uaktywniane podczas tworzenia tabeli.
•
Kontrola danych w tabeli przez rejestrowanie dokonywanych zmian oraz autorów tych
zmian.
•
Automatyczne przekazywanie do innych programów informacji, że jest wymagane podjęcie
określonych działań w razie dokonania zmian w tabeli.
TWORZENIE WYZWALACZY
CREATE [OR REPLACE] TRIGGER nazwa_wyzwalacza
{BEFORE | AFTER | INSTEAD OF } zdarzenie_wyzwalające
[klauzula_z_odwolaniem]
[WHEN warunek_wyzwalacza]
[FOR EACH ROW]
tresc_wyzwalacza;
gdzie:
•
zdarzenie_wyzwalające – zdarzenie uruchamiające wyzwalacz (może również
zawierać odwołanie do tabeli lub perspektywy);
•
kaluzula_z_odwolaniem – jest wykorzystywany w celu odwołania do danych w
1
Wyzwalacze
modyfikowanym wierszu pod inną nazwą.
•
warunek_wyzwalacza – treść wyzwalacza jest wykonywana tylko przy warunku o
wartości TRUE;
Rodzaje wyzwalaczy:
•
Wyzwalacze DML – są uruchamiane przez instrukcje DML, a ich typ jest określany przez
typ instrukcji. Można definiować je dla operacji INSERT, UPDATE lub DELETE i
uruchamiać przed operacją lub po niej, a także w związku z operacjami dotyczącymi
wiersza lub instrukcji. Istnieje 12 możliwych typów wyzwalaczy DML: 3 rodzaje operacji x
2 rodzaje czasów x 2 możliwe poziomy:
◦ wiersza – wyzwalacz jest uruchamiany po jednym razie dla każdego wiersza,
którego dotyczy instrukcja (FOR EACH ROW);
◦ instrukcji – wyzwalacz jest uruchamiany jeden raz – przed lub po wykonaniu
instrukcji.
Dla tabeli może być zdefiniowana dowolna liczba wyzwalaczy włącznie z możliwością
zdefiniowania więcej niż jednego wyzwalacza dla określonego rodzaju instrukcji DML, np. można
zdefiniować 2 wyzwalacze AFTER DELETE poziomu instrukcji. Wszystkie wyzwalacze tego
samego typu będą uruchamiane sekwencyjnie.
Przykład 1
Niech STATYSTYKA_ETAT będzie tabelą przechowującą informacje o etatach oraz liczbie
zatrudnionych pracowników na poszczególnych etatach i sumie ich płac podstawowych.
CREATE TABLE statystyka_etat (
etat VARCHAR2(30),
ilu NUMBER(5),
suma_plac NUMBER(8,2)
);
CREATE OR REPLACE TRIGGER UaktualnijStatystyke
AFTER INSERT OR UPDATE OR DELETE ON pracownik
DECLARE
CURSOR A IS
SELECT etat e, COUNT(*) ile, SUM(placa_pod) suma
2
Wyzwalacze
FROM pracownik
GROUP BY etat;
BEGIN
DELETE FROM statystyka_etat;
FOR i IN A LOOP
INSERT INTO statystyka_etat VALUES(i.e, i.ile, i.suma);
END LOOP;
END UaktualnijStatystyke;
/
Algorytm uruchamiania wyzwalaczy podczas wykonywania instrukcji DML:
1. Wykonywanie wyzwalacza BEFORE na poziomie instrukcji, o ile taki istnieje.
2. Dla każdego wiersza, na którym wykonywana jest instrukcja:
•
wykonywanie wyzwalacza BEFORE na poziomie wiersza, o ile taki istnieje;
•
wykonywanie samej instrukcji, o ile tka istnieje;
•
wykonywanie wyzwalacza AFTER na poziomie wiersza, o ile taki istnieje.
3. Wykonywanie wyzwalacza AFTER na poziomie instrukcji, o ile taka istnieje.
Ćwiczenie 1
1. Utwórz tabelę Cwiczenie2 składającą się z dwóch pól: całkowitego A i łańcucha 50
znaków B.
2. Utwórz sekwencję o nazwie indeks o wartości początkowej 1 i wzrastający o 1.
3. Utwórz pakiet o nazwie pakiet_wyzwalaczy, który zawierać będzie globalną
zmienną całkowitą o nazwie licznik.
4. Utwórz wyzwalacz W1, który przed wykonaniem instrukcji UPDATE na tabeli
pracownik wyzeruje zmienną licznik pakietu. Wstawi do tabeli Cwiczenie2 wartości,
NEXTVAL sekwencji oraz komunikat 'BEFORE na poziomie instrukcji; licznik = ' z
podaniem aktualnej wartości zmiennej licznik oraz zwiększy wartość zmiennej
licznik o 1.
5. Utwórz wyzwalacz W2, który po wykonaniu instrukcji UPDATE na tabeli
pracownik wstawi do tabeli Cwiczenie2 wartości, NEXTVAL sekwencji oraz
komunikat 'AFTER na poziomie instrukcji 1; licznik = ' z podaniem aktualnej
wartości zmiennej licznik oraz zwiększy wartość zmiennej licznik o 1.
3
Wyzwalacze
6. Utwórz wyzwalacz W3, który po wykonaniu instrukcji UPDATE na tabeli
pracownik wstawi do tabeli Cwiczenie2 wartości, NEXTVAL sekwencji oraz
komunikat 'AFTER na poziomie instrukcji 2; licznik = ' z podaniem aktualnej
wartości zmiennej licznik oraz zwiększy wartość zmiennej licznik o 1.
7. Utwórz wyzwalacz W4, który przed wykonaniem instrukcji UPDATE dla każdego
wiersza tabeli pracownik wstawi do tabeli Cwiczenie2 wartości, NEXTVAL
sekwencji oraz komunikat 'BEFORE na poziomie wiersza 1; licznik = ' z podaniem
aktualnej wartości zmiennej licznik oraz zwiększy wartość zmiennej licznik o 1.
8. Utwórz wyzwalacz W5, który przed wykonaniem instrukcji UPDATE dla każdego
wiersza tabeli pracownik wstawi do tabeli Cwiczenie2 wartości, NEXTVAL
sekwencji oraz komunikat 'BEFORE na poziomie wiersza 2; licznik = ' z podaniem
aktualnej wartości zmiennej licznik oraz zwiększy wartość zmiennej licznik o 1.
9. Utwórz wyzwalacz W6, który przed wykonaniem instrukcji UPDATE dla każdego
wiersza tabeli pracownik wstawi do tabeli Cwiczenie2 wartości, NEXTVAL
sekwencji oraz komunikat 'BEFORE na poziomie wiersza 3; licznik = ' z podaniem
aktualnej wartości zmiennej licznik oraz zwiększy wartość zmiennej licznik o 1.
10. Utwórz wyzwalacz W7, który po wykonaniu instrukcji UPDATE dla każdego
wiersza tabeli pracownik wstawi do tabeli Cwiczenie2 wartości, NEXTVAL
sekwencji oraz komunikat 'AFTER na poziomie wiersza; licznik = ' z podaniem
aktualnej wartości zmiennej licznik oraz zwiększy wartość zmiennej licznik o 1.
11. Uaktualnić płacę podstawową o 10% tych pracowników, którzy są zatrudnieni w
zespole o identyfikatorze 10 lub 20.
12. Wyświetlić zawartość tabeli Cwiczenie2 z uporządkowaniem wierszy w kolejności
rosnącej wartości kolumny A.
Kolejność uruchamiania wyzwalaczy tego samego typu nie jest określona, ale można ją wymusić
definiując wyzwalacz łączący je w jeden.
Wyzwalacze na poziomie wiersza uruchamiają się raz dla wiersza przetwarzanego przez instrukcję
wyzwalającą. Wewnątrz wyzwalacza dostęp do danych w obecnie przetwarzanym wierszu można
uzyskać za pomocą identyfikatorów korelacji (specjalnego rodzaju zmiennych dowiązanych –
zmiennych
hosta
– PL/SQL, a kompilator
będzie je traktował
jako rekordy typu
4
Wyzwalacze
tabela_wyzwalająca%ROWTYPE): :new i :old.
Instrukcja wyzwalająca
Wartość :old
Wartość :new
INSERT
Nieokreślona – wszystkie pola mają Wartości, które będą wstawione
wartość NULL
po wykonaniu instrukcji.
UPDATE
Oryginalne wartości wiersza przed Nowe wartości, którymi będą
uaktualnieniem
uaktualnione pola po wykonaniu
instrukcji.
DELETE
Oryginalne wartości wiersza przed Nieokreślona – wszystkie pola
usunięciem
mają wartość NULL
Przykład 2
CREATE SEQUENCE zespol_ID
START WITH 70
INCREMENT BY 10;
CREATE OR REPLACE TRIGGER Wygeneruj_ID_Zespolu
BEFORE INSERT OR UPDATE ON zespol
FOR EACH ROW
BEGIN
SELECT zespol_ID.NEXTVAL INTO :new.id_zesp
FROM dual;
END;
/
INSERT INTO zespol (nazwa, adres)
VALUES ('statystyka', 'Gleboka 3');
INSERT INTO zespol
VALUES (-7, 'statyka', 'Plytka 3');
Nie można zmieniać wartości :new w wyzwalaczu AFTER. Wartość :old może być tylko odczytana.
Nie można przypisywać wartości :old i :new jako całych rekordów, jedynie uzyskać dostęp do
indywidualnych pól.
5
Wyzwalacze
Przykład 3
CREATE OR REPLACE TRIGGER Usun
BEFORE DELETE ON Cwiczenie2
FOR EACH ROW
DECLARE
zm Cwiczenie2%ROWTYPE;
BEGIN
// zm := :old;
NIEPOPRAWNE PRZYPISANIE
zm.A := :old.A;
zm.B := :old.B;
END;
/
Ponadto nie jest możliwe przekazania wartości :old i :new do procedur lub funkcji.
Klauzula REFERENCING występuje po zdarzeniu wywołującym, a przed klauzulą WHEN w
definicji wyzwalacza i ma składnię:
REFERENCING [OLD AS nowy_old] [NEW AS nowy_new]
Przykład 4
CREATE OR REPLACE TRIGGER Wygeneruj_ID_Zespolu
BEFORE INSERT OR UPDATE ON zespol
REFERENCING new AS nowy_zespol
FOR EACH ROW
BEGIN
SELECT zespol_ID.NEXTVAL INTO :nowy_zespol.id_zesp
FROM dual;
END;
/
Klauzula WHEN jest tylko prawidłowa na poziomie wiersza, a jej warunek jest sprawdzany dla
każdego wiersza i tylko gdy jest on prawdziwy wykonywana jest treść wyzwalacza.
Pseudorekordy :new i :old mogą być wykorzystane w warunku klauzuli WHEN ale odwołujemy się
wtedy do nich bez znaku dwukropka.
6
Wyzwalacze
WHEN (new.placa_pod > 1000)
lub równoważnie
BEGIN
IF :new.placa_pod > 1000 THEN … END IF;
...
END;
Na poziomie instrukcji INSERT, DELETE i UPDATE istnieją trzy boolowskie funkcje, które służą
do określania rodzaju operacji:
•
INSERTING – TRUE, gdy instrukcją wyzwalającą jest INSERT, wpp FALSE;
•
UPDATING – TRUE, gdy instrukcją wyzwalającą jest UPDATE, wpp FALSE;
•
DELETING – TRUE, gdy instrukcją wyzwalającą jest DELETE, wpp FALSE.
Ćwiczenie 2
Utworzyć wyzwalacz CW2, którego zadaniem będzie wyświetlenie odpowiedniego komunikatu o
wykonaniu jednej z instrukcji INSERT, UPDATE lub DELETE na tabeli pracownik.
•
Wyzwalacze zastępujące (ang. instead-of) – mogą być definiowane tylko dla perspektyw
(relacyjnych lub obiektowych) i uruchamiają się zamiast wyzwalającej je instrukcji DML.
Działają na poziomie wierszy. Wykorzystuje się je w celu:
▪ umożliwienia modyfikowania perspektyw;
▪ modyfikowania kolumn tabeli zagnieżdżonej będącej kolumną w perspektywie.
Perspektywa modyfikowalna to taka, dla której można wykonać instrukcję DML i nie zawiera:
•
operatorów zbioru (UNION, UNION ALL, MINUS);
•
funkcje agregujących;
•
klauzul GROUP BY, CONNECT BY lub START WITH;
•
operatora DISTNICT;
•
złączeń.
UWAGA: Można modyfikować perspektywy ze złączeniami o ile operacja DML modyfikuje tylko
jedną tabelę bazową w danym czasie lub
7
Wyzwalacze
Operacje DML
Dozwolone, jeżeli:
INSERT
Instrukcja nie odnosi się jawnie lub niejawnie do kolumn tabeli bez
zachowania kluczy.
UPDATE
Zmodyfikowane kolumny są odwzorowane na kolumny tabeli z zachowaniem
kluczy.
DELETE
W złączeniu istnieje dokładnie jedna tabela z zachowaniem kluczy.
Przykład 5
Tworzymy perspektywę opartą o wybrane dane pochodzące z dwóch tabel: pracownik i zespol.
Następnie poprzez perspektywę próbujemy wstawić nowe wiersze do tych tabel. Wykonanie
instrukcji kończy się niepowodzeniem. W kolejnym kroku definiujemy wyzwalacz zastępujący
instrukcję INSERT.
CREATE OR REPLACE VIEW Pracownik_adres AS
SELECT numer, nazwisko, etat, nazwa, adres
FROM pracownik, zespol
WHERE pracownik.id_zesp=pracownik.id_zesp;
INSERT INTO Pracownik_adres VALUES(1141, 'Kowalski', 'adiunkt', 'analiza','AK 13/15');
CREATE TRIGGER WstawPrzezPerspektywe
INSTEAD OF INSERT ON Pracownik_adres
DECLARE
z_id_zesp zespol.id_zesp%TYPE;
BEGIN
SELECT max(id_zesp) INTO z_id_zesp
FROM zespol;
z_id_zesp := z_id_zesp + 10;
INSERT INTO zespol VALUES(z_id_zesp, :new.nazwa, :new.adres);
INSERT INTO pracownik VALUES ( :new.numer, :new.nazwisko, :new.etat, 1000,
sysdate, 1800, 0, z_id_zesp, '34-3614919' );
END WstawPrzezPerspektywe;
/
8
Wyzwalacze
•
Wyzwalacze systemowe – począwszy od wersji Oracle8i wprowadzono możliwość
definiowania wyzwalaczy, które uruchamiają się w przypadku wystąpienia zdarzenia
systemowego takiego, jak uruchomienie lub zatrzymanie bazy danych. Wyzwalacz
systemowy można również uruchomić dla instrukcji DDL (CREATE, ALTER, DROP), jak
np. utworzenie tabeli.
CREATE [OR REPLACE] TRIGGER [schemat. ] nazwa_wyzwalacza
{BEFORE | AFTER} {lista_zdarzen_DDL | lita_zdarzen_bazy_danych}
ON {DATABASE | [schemat. ] SCHEMA}
[WHEN warunek]
tresc_wyzwalacza;
Zdarzenie
Dozwolony
Opis
parametr czasowy
STARTUP
AFTER
Uruchamia się wraz z uruchomieniem bazy danych
SHUTDOWN
BEFORE
Uruchamia się wraz z zatrzymaniem bazy danych.
Zdarzenie to może nie nastąpić z chwilą zatrzymania bazy
danych z powodu awarii.
SERVERERROR AFTER
Uruchamia się z chwilą wystąpienia błędu.
LOGON
AFTER
Uruchamia się po pomyślnym zalogowaniu użytkownika
do bazy danych.
LOGOFF
BEFORE
Uruchamia się na początku procesu wyrejestrowania
użytkownika z bazy danych.
CREATE
BEFORE, AFTER Uruchamia się przed lub po utworzeniu obiektu schematu.
DROP
BEFORE, AFTER Uruchamia się przed lub po usunięciu obiektu schematu.
ALTER
BEFORE, ALTER Uruchamia się przed lub po uaktualnieniu obiektu
schematu.
UWAGA: Tworzenie wyzwalaczy systemowych jest możliwe tylko dla użytkownika z
uprawnieniami ADMINISTER DATABASE TRIGGER.
Jeśli nie wyspecyfikujemy schematu dla słowa kluczowego SCHEMA, domyślnym będzie ten
schemat, który zawiera wyzwalacz.
9
Wyzwalacze
Atrybuty zdarzeń wyzwalacza systemowego:
Atrybut
Typ danych
Zdarzenie
Opis
SYSEVENT
VARCHAR2(20)
Wszystkie
Zwraca
zdarzenie
systemowe,
uruchomiło wyzwalacz.
INSTANCE_NUM
NUMBER
Wszystkie
Zwraca bieżący numer
zazwyczaj wartość 1.
DATABASE_NAME VARCHAR2(50)
Wszystkie
Zwraca nazwę bieżącej bazy danych.
SERVER_ERROR
NUMBER
SERVERERROR
Zwraca błąd znajdujący się na stosie błędów
wskazywany przez argument. Wartość 1
oznacza wierzchołek stosu.
IS_SERVERERROR
BOOLEAN
SERVERERROR
Pobiera numer błędu i zwraca TRUE o ile
błąd znajduje się na stosie błędów.
LOGIN_USER
VARCHAR2(30)
Wszystkie
Zwraca identyfikator użytkownika, który
uruchomił wyzwalacz.
które
egzemplarza,
DICTIONARY_OBJ_ VARCHAR2(20)
TYPE
CREATE, DROP, DELETE Zwraca typ obiektu słownika, dla którego
wykonano
operację
DDL,
która
spowodowała uruchomienie wyzwalacza.
DICTIONARY_OBJ_ VARCHAR2(30)
NAME
CREATE, DROP, DELETE Zwraca nazwę obiektu słownika, dla którego
wykonano
operację
DDL,
która
spowodowała uruchomienie wyzwalacza.
DICTIONARY_OBJ_ VARCHAR2(30)
OWNER
CREATE, DROP, DELETE Zwraca właściciela obiektu słownika, dla
którego wykonano operację DDL, która
spowodowała uruchomienie wyzwalacza.
DES_ENCRYPTED_ VARCHAR2(30)
PASSWORD
CREATE
USER
lub
ALTER Zwraca hasło zaszyfrowane algorytmem
DES
utworzonego
użytkownika
lub
użytkownika, dla którego zmodyfikowano
dane.
Przykład 6
create table t_ddl(
id VARCHAR2(30),
typ_obiektu VARCHAR2(20),
nazwa_obiektu VARCHAR2(30),
wlasciciel_obiektu VARCHAR2(30),
data_utworzenia date
);
10
Wyzwalacze
CREATE OR REPLACE TRIGGER Rejestruj
AFTER CREATE ON SCHEMA
BEGIN
INSERT INTO t_ddl
( id, typ_obiektu, nazwa_obiektu, wlasciciel_obiektu, data_utworzenia)
VALUES (USER, SYS.DICTIONARY_OBJ_TYPE, SYS.DICTIONARY_
OBJ_NAME, SYS.DICTIONARY_OBJ_OWNER,SYSDATE);
END;
/
Wyzwalacze systemowe a transakcje – wyzwalacz systemowy STARTUP, SHUTDOWN,
SERVERERROR oraz LOGON uruchamiają się jako oddzielna transakcja, która jest zatwierdzana
po pomyślnym wykonaniu wyzwalacza, natomiast wyzwalacze LOGOFF oraz związane z
operacjami DDL uruchamiają się w ramach bieżącej transakcji. W przypadku wyzwalacza DDL
bieżąca transakcja jest automatycznie zatwierdzana, co równocześnie zatwierdza działania
wykonane przez wyzwalacz. Działanie wyzwalacza LOGOFF również będzie zatwierdzone jako
część końcowej transakcji w sesji.
UWAGA:
•
Dla wyzwalaczy STARTUP i SHUTDOWN nie można określać żadnych warunków.
•
W wyzwalaczach SERVERERROR można także wykorzystać zmienną ERRNO w celu
śledzenia tylko wybranego błędu.
•
W wyzwalaczach LOGON i LOGOFF można sprawdzać identyfikator i nazwę
użytkownika, posługując się zmiennymi USERID i USERNAME.
•
W wyzwalaczach DDL można sprawdzać typ i nazwę modyfikowanego obiektu, a także
identyfikator i nazwę użytkownika.
Przestrzeń nazw jest zbiorem poprawnych identyfikatorów, dostępnych do wykorzystania jako
nazwy obiektów. Procedury, pakiety i tabele mają wspólną przestrzeń nazw. Wyzwalacze maja
osobną przestrzeń nazw, co oznacza, że wyzwalacze mogą mieć nazwę taką samą jak, np.
procedura, funkcja, czy tabela.
11
Wyzwalacze
Ograniczenia:
•
W wyzwalaczu nie można wydawać żadnych instrukcji sterowania transakcją – COMMIT,
ROLLBACK lub SAVEPOINT. Kompilator pozwoli na utworzenie wyzwalacza, ale przy
uruchomieniu wystąpi błąd.
•
W procedurach i funkcjach wewnątrz wyzwalaczy wydawać żadnych instrukcji sterowania
transakcją.
•
W treści wyzwalacza nie deklaruje się zmiennych LONG lub LONG RAW. Wartości :new
i :old nie mogą się odwoływać do kolumn tego typu w tabeli, dla której zdefiniowano
wyzwalacz.
•
Można odwoływać się i wykorzystywać kolumny typu LOB, ale nie można modyfikować
wartości tych kolumn. Dotyczy to również kolumn obiektowych.
•
W treści wyzwalacza można wykonywać instrukcję CALL.
Po utworzeniu wyzwalacza jego kod źródłowy jest składowany w perspektywie słownika danych
user_triggers. W perspektywie tej znajduje się kod wyzwalacza, dane określające klauzulę WHEN,
tabelę wyzwalającą oraz typ wyzwalacza.
SELECT trigger_type, table_name, trigger_event
FROM user_triggers
WHERE trigger_name = 'WstawPrzezPerspektywe';
Perspektywy:
•
all_triggers – zawierają informacje o wyzwalaczach dostępnych dla bieżącego
użytkownika, które mogą należeć do innego użytkownika;
•
dba_triggers – zawiera informacje na temat wyzwalaczy w bazie danych.
USUWANIE wyzwalacza:
DROP TRIGGER nazwa_wyzwalacza;
DEZAKTYWOWANIE wyzwalacza:
ALTER TRIGGER nazwa_wyzwalacza {DISABLE |ENABLE};
DEZAKTYWACJA wyzwalaczy na danej tabeli:
ALTER TABLE nazwa_tabeli
{DISABLE | ENABLE} ALL TRIGGERS;
Skompilowana forma wyzwalacza jest również przechowywana w słowniku danych. Wyzwalacz
12
Wyzwalacze
unieważniony będzie ponownie skompilowany przy następnym uruchomieniu.
TABELE MUTUJĄCE
Tabela mutująca jest tabelą, która w danej chwili jest modyfikowana przez instrukcję DML. W
przypadku wyzwalacza jest to tabela, dla której zdefiniowano wyzwalacz. Tabelami mutującymi
mogą być również tabele, które mogą wymagać uaktualnienia w wyniku kaskadowego usuwania
danych (DELETE CASCADE) przy występujących więzach integralności referencyjnej. Tabela
wiążąca jest tabelą, która może wymagać odczytu ze względu na więzy integralności referencyjnej.
W tabeli pracownik mamy zdefiniowane ograniczenia dla kolumn i klucze obce do tabel etat i
zespol. Tabele etat i zespol są zatem tabelami wiążącymi dla tabeli pracownik. Sama tabela
pracownik podlega mutacji podczas wykonywania dla niej instrukcji DML. Z powodu istneijących
więzów tabele etat i zepsol również wymagają modyfikacji i (lub) wykonania zapytań przez
instrukcję DML.
Instrukcje SQL wewnątrz wyzwalaczy nie mogą wykonywać następujących operacji:
•
Odczytywać lub modyfikować tabeli mutującej wskazanej w instrukcji wyzwalanej.
Zasada ta dotyczy samej tabeli wyzwalającej.
•
Odczytywać lub modyfikować kolumny klucza głównego, unikatowego lub obcego
tabeli wiążącej dla tabeli wyzwalającej. Jednak w razie potrzeby instrukcje SQL
mogą przeprowadzać modyfikacje innych kolumn.
Powyższe ograniczenia dotyczą wszystkich wyzwalaczy na poziomie wiersza. Na poziomie
instrukcji ograniczenia te są prawdziwe tylko wtedy, gdy wyzwalacz na poziomie instrukcji jest
uruchomiony w wyniku operacji kaskadowego usuwania.
13

Podobne dokumenty