SQLite - Triggers
Wyzwalacze SQLite są
funkcjami wywołania zwrotnego bazy danych, które są automatycznie wykonywane /
wywoływane, gdy wystąpi określone zdarzenie bazy danych. Poniżej
przedstawiono ważne punkty dotyczące wyzwalaczy SQLite -
·
Wyzwalacz SQLite może być określony jako
uruchamiany, gdy wystąpi DELETE, INSERT lub UPDATE konkretnej tabeli bazy
danych lub gdy wystąpi UPDATE na jednej lub kilku określonych kolumnach tabeli.
·
W tej chwili SQLite obsługuje tylko
wyzwalacze FOR EACH ROW, a nie dla wyzwalaczy FOR EACH STATEMENT. W
związku z tym jawne określenie FOR EACH ROW jest opcjonalne.
·
Zarówno klauzula WHEN, jak i akcje
wyzwalające mogą uzyskiwać dostęp do elementów wstawianego, usuwanego lub
aktualizowanego wiersza za pomocą odwołań do formularza NEW.column-name i OLD.column-name ,
gdzie column-name jest nazwą kolumny z kolumny tabeli z którą powiązany jest
wyzwalacz.
·
Jeśli podano klauzulę WHEN, podane
instrukcje SQL są wykonywane tylko dla wierszy, dla których klauzula WHEN jest
prawdziwa. Jeśli nie podano klauzuli WHEN, instrukcje SQL są wykonywane
dla wszystkich wierszy.
·
Słowo kluczowe BEFORE lub AFTER określa,
kiedy akcje wyzwalacza będą wykonywane względem wstawiania, modyfikacji lub
usuwania powiązanego wiersza.
·
Wyzwalacze są automatycznie usuwane, gdy
tabela, z którą są powiązane, jest odrzucana.
·
Tabela, która ma zostać zmodyfikowana,
musi istnieć w tej samej bazie danych, co tabela lub widok, do którego
dołączony jest wyzwalacz, i należy użyć tylko nazwatabeli nie bazadanych.nazwatabeli.
·
Specjalna funkcja SQL RAISE() może być
używana w programie wyzwalającym do wywołania wyjątku.
Składnia
Poniżej znajduje się podstawowa składnia
tworzenia wyzwalacza.
CREATE TRIGGER nazwa_wyzwalacza
[BEFORE|AFTER] nazwa_zdarzenia
ON nazwa_tabeli
BEGIN
-- Trigger logika....
END;
Tutaj nazwa_zdarzenia może
być operacją bazy danych INSERT, DELETE lub UPDATE w
wymienionej tabeli nazwa_tabeli. Opcjonalnie można podać FOR
EACH ROW po nazwie tabeli.
Poniżej przedstawiono składnię dotyczącą tworzenia
wyzwalacza w operacji UPDATE na jednej lub kilku określonych kolumnach tabeli.
CREATE TRIGGER nazwa_wyzwalacza [BEFORE|AFTER] UPDATE
OF nazwa_kolumny
ON nazwa_tabeli
BEGIN
-- Trigger logika....
END;
Przykład
Rozważmy przypadek, w którym chcemy zachować test
kontrolny dla każdego rekordu wprowadzanego do tabeli PRACOWNIK, który tworzymy
ponownie w następujący sposób (Usuń tabelę PRACOWNIK, jeśli już ją posiadasz).
sqlite> CREATE TABLE PRACOWNIK(
ID INT
PRIMARY KEY NOT NULL,
nazwisko TEXT
NOT NULL,
wiek INT NOT NULL,
adres CHAR(50),
pensja REAL
);
Aby zachować wersję próbną badania, utworzymy nową
tabelę o nazwie AUDYT, w której będą umieszczane komunikaty dziennika, za
każdym razem, gdy pojawi się wpis w tabeli PRACOWNIK dla nowego rekordu.
sqlite> CREATE TABLE AUDYT(
prac_id INT
NOT NULL,
wprowadz_dane
TEXT NOT NULL
);
Tutaj ID to identyfikator rekordu AUDIT, a PRAC_ID to
identyfikator, który będzie pochodził z tabeli PRACOWNIK, a DANE będzie
przechowywać znacznik czasu, gdy rekord zostanie utworzony w tabeli PRACOWNIK. Teraz
stwórzmy wyzwalacz na tabeli PRACOWNIK w następujący sposób -
sqlite>
CREATE TRIGGER audyt_log AFTER INSERT
ON PRACOWNIK
BEGIN
INSERT INTO
AUDYT(PRAC_ID, WPROWADZ_DANE)
VALUES (new.ID,
datetime('now'));
END;
Teraz rozpoczniemy rzeczywistą pracę, Zacznijmy
wstawiać rekord do tabeli PRACOWNIK, co powinno spowodować utworzenie rekordu dziennika
inspekcji w tabeli AUDYT. Utwórz jeden rekord w tabeli PRACOWNIK w
następujący sposób:
sqlite>
INSERT INTO PRACOWNIK (id,nazwisko,wiek,adres,pensja)
VALUES (11, 'Paweł', 32, 'Białołęka', 4500
);
Spowoduje to utworzenie jednego rekordu w tabeli PRACOWNIK,
który jest następujący:
id nazwisko wiek
adres pensja
---------- ----------
---------- ---------- ----------
11 Paweł 32 Białołęka 4500.0
W tym samym czasie, jeden rekord zostanie utworzony w
tabeli AUDYT. Ten rekord jest wynikiem wyzwalacza, który utworzyliśmy w
operacji INSERT w tabeli PRACOWNIK. W podobny sposób można tworzyć
wyzwalacze w operacjach UPDATE i DELETE w zależności od wymagań.
prac_id wprowadz_dane
---------- -------------------
11 2018-06-10 19:16:02
Wyświetlanie wyzwalaczy
Możesz wyświetlić wszystkie wyzwalacze
z tabeli sqlite_master w następujący sposób:
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';
Powyższe polecenie SQLite wyświetli tylko jeden wpis w
następujący sposób:
name
----------
audyt_log
Jeśli chcesz wyświetlić listę wyzwalaczy w dół dla
konkretnej tabeli, użyj klauzuli AND z nazwą tabeli w następujący sposób:
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'PRACOWNIK';
Powyższe polecenie SQLite wyświetli również tylko
jedną pozycję -
name
----------
audyt_log
Usuwanie wyzwalaczy
Poniżej znajduje się polecenie DROP, które można
wykorzystać do usunięcia istniejącego wyzwalacza.
sqlite> DROP TRIGGER trigger_name;
Brak komentarzy:
Prześlij komentarz