Język SQL: Wyzwalacze

article-thumbnail

Wyzwalacz (ang. Trigger) to pewien zestaw poleceń, wykonywanych automatycznie. Wywoływany jest wtedy, gdy dojdzie do wykonania danej operacji na bazie danych, lub nastąpi określone zdarzenie. Pozwala więc na znaczną automatyzację powtarzalnych działań. Z tego względu jest bardzo przydatnym narzędziem. Można znaleźć dla niego wiele zastosować, jednak pierwszym sposobem jaki przychodzi na myśl jest użycie go jako tzw. loggera, czy systemu zapisującego informację o zmianach w bazie danych.

Warto jednak pamiętać, że nadmierna ilość wyzwalaczy może negatywnie wpłynąć na wydajność bazy danych. Składnia wygląda następująco:

CREATE TRIGGER nazwa_triggera [ BEFORE / AFTER ]  [ INSERT / UPDATE / DELETE ]
ON nazwa_tabeli [FOR EACH ROW]
BEGIN
    Kod akcji triggera
END;

Przykład 1 – automatyczne tworzenie logów

Jak wspomniałem we wstępie najbardziej intuicyjnym użyciem triggera jest tworzenie logów. Napisz więc taki skrypt. Zapisze on informacje takie jak: jaką informację wykonano, i który rekord został nią dotknięty.

DELIMITER //
CREATE TRIGGER resource_logger AFTER UPDATE 
ON resources 
FOR EACH ROW 
BEGIN 
	INSERT INTO `logs`(`log_id`, `type`, `resource_id`) VALUES( null, "UPDATE", OLD.id); 
END//
DELIMITER ;

Tak skonstruowany wyzwalacz zapisze interesujące nas informacje do tabeli logs. Zrobi to za każdym razem gdy wywołamy kwerendę typu UPDATE.

Przykład 2 – Kopiowanie usuwanych obiektów

Trigger’ów można też użyć do kopiowania zmienianych (w tym i usuwanych) obiektów bazodanowych. Przykładem może być stworzenie kopii usuwanego obiektu. Użyjemy do tego poza wyzwalaczem, także słowa kluczowego OLD, które zawiera wszystkie informacje dotyczące stanu początkowego zmienianego obiektu.

DELIMITER //
CREATE TRIGGER resource_backup BEFORE DELETE
ON resources 
FOR EACH ROW 
BEGIN 
	INSERT INTO `backup`(`backup_id`,`resource`, `description`) 
	VALUES(null,OLD.`resource`,OLD.`description`); 
END//
DELIMITER ;

Oczywiście, wyzwalacze można wykorzystać na wiele innych sposobów. Nie należy jednak ich nadużywać. Spowoduje to przeciążenie bazy danych, znaczne osłabienie jej wydajności.