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 a CREATE , użyj LOCK TABLES myTable WRITE; po pierwsze, aby uniknąć niespójności danych i UNLOCK TABLES; po CREATE 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 ;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow