MySQL
WYZWALACZE
Szukaj…
Składnia
- UTWÓRZ [DEFINER = {użytkownik | CURRENT_USER}] TRIGGER nazwa_wyzwalacza czas_wyzwolenia_wyzwolenie_wydarzenia WŁĄCZONA nazwa_bloku DLA KAŻDEGO WIERSZA [kolejność_wyzwalacza]
- czas_wyzwolenia: {PRZED | PO }
- trigger_event: {INSERT | AKTUALIZACJA | USUNĄĆ }
- trigger_order: {FOLLOWS | PRECEDES} inna_nazwa_wyzwalacza
Uwagi
Należy zwrócić uwagę na dwa punkty, jeśli już używasz wyzwalaczy na innych bazach danych:
DLA KAŻDEGO WIERSZA
FOR EACH ROW
jest obowiązkową częścią składni
Nie można ustawić wyzwalacza instrukcji (raz przez zapytanie), jak w przypadku Oracle. To bardziej kwestia wydajności niż brakująca funkcja
UTWÓRZ LUB WYMIEŃ SPUST
CREATE OR REPLACE
nie jest obsługiwane przez MySQL
MySQL nie zezwala na tę składnię, zamiast tego musisz użyć:
DELIMITER $$
DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...
$$
DELIMITER ;
Uważaj, to nie jest transakcja atomowa :
- będziesz stracić starą spust jeśli
CREATE
zawieść - przy dużym obciążeniu mogą wystąpić inne operacje między
DROP
aCREATE
, użyjLOCK TABLES myTable WRITE;
po pierwsze, aby uniknąć niespójności danych iUNLOCK TABLES;
poCREATE
aby zwolnić tabelę
Basic Trigger
Utwórz tabelę
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
Utwórz wyzwalacz
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)
Instrukcja CREATE TRIGGER tworzy wyzwalacz o nazwie ins_sum, który jest powiązany z tabelą kont. Zawiera także klauzule, które określają czas akcji wyzwalacza, zdarzenie wyzwalające i co zrobić, gdy aktywuje się wyzwalacz
Wstaw wartość
Aby użyć wyzwalacza, ustaw zmienną akumulatora (@sum) na zero, wykonaj instrukcję INSERT, a następnie sprawdź, jaką wartość ma zmienna:
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
W tym przypadku wartość @sum po wykonaniu instrukcji INSERT wynosi 14,98 + 1937,50 - 100 lub 1852.48.
Upuść spust
mysql> DROP TRIGGER test.ins_sum;
Jeśli upuścisz tabelę, wszystkie wyzwalacze dla tabeli również zostaną usunięte.
Rodzaje wyzwalaczy
wyczucie czasu
Istnieją dwa modyfikatory czasu działania wyzwalacza:
-
BEFORE
wyzwalacz zostanie aktywowany przed wykonaniem żądania, -
AFTER
wyzwoleniu strzału po zmianie.
Poruszające wydarzenie
Istnieją trzy zdarzenia, do których można przypisać wyzwalacze:
-
INSERT
-
UPDATE
-
DELETE
Przed wstawieniem przykładu wyzwalacza
DELIMITER $$
CREATE TRIGGER insert_date
BEFORE INSERT ON stack
FOR EACH ROW
BEGIN
-- set the insert_date field in the request before the insert
SET NEW.insert_date = NOW();
END;
$$
DELIMITER ;
Przed aktualizacją przykład wyzwalacza
DELIMITER $$
CREATE TRIGGER update_date
BEFORE UPDATE ON stack
FOR EACH ROW
BEGIN
-- set the update_date field in the request before the update
SET NEW.update_date = NOW();
END;
$$
DELIMITER ;
Po usunięciu przykładu wyzwalacza
DELIMITER $$
CREATE TRIGGER deletion_date
AFTER DELETE ON stack
FOR EACH ROW
BEGIN
-- add a log entry after a successful delete
INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;
$$
DELIMITER ;