poniedziałek, 24 września 2018

SQLite wyzwalacze


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