SQL

Triggery

  • 2008-09-06 14:49
  • 0 komentarzy
  • 15570 odsłon
  • Oceń ten tekst jako pierwszy

Strona w budowie
Ktoś pracuje nad tą stroną, jej zawartość może się wkrótce zmienić. Prosimy o cierpliwość!



Wikipedia: Wyzwalacz (ang. trigger) jest to procedura wykonywana automatycznie jako reakcja na pewne zdarzenia w tabeli bazy danych. Wyzwalacze mogą ograniczać dostęp do pewnych danych, rejestrować zmiany danych lub nadzorować modyfikacje danych.

Tworzenie triggera:
 
CREATE TRIGGER nazwa [BEFORE | AFTER] [INSERT | UPDATE | DELETE] ON tabela FOR EACH ROW instrukcja


Przykład:
 
CREATE TRIGGER usun AFTER DELETE ON uzytkownicy
FOR EACH ROW
BEGIN
    DELETE FROM uprawnienia WHERE userID = OLD.userID;
END

Tak utworzony trigger usunie za każdym razem uprawnienia użytkownika zaraz po tym jak owy użytkownik zostanie usunięty.
Oczywiście można tworzyć znacznie bardziej skomplikowane triggery. Możemy stworzyć dwie tabele odpowiedzialne za grupy użytkowników, np. Komercyjny i prywatny i trzecią odpowiedzialną za ogólny wygląd.

CREATE TABLE `users` (
  `userID` INT(10) NOT NULL AUTO_INCREMENT,
  `userEmail` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userPassword` VARCHAR(66) COLLATE utf8_polish_ci NOT NULL,
  `userStatus` INT(1) NOT NULL,
  `userType` INT(1) NOT NULL,
  PRIMARY KEY (`userID`),
  UNIQUE KEY `userEmail` (`userEmail`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='Konta użytkowników' AUTO_INCREMENT=5 ;


CREATE TABLE `firmy` (
  `userID` INT(10) NOT NULL,
  `userName` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userLastName` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userCompany` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userAdress` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userPhone` VARCHAR(30) COLLATE utf8_polish_ci NOT NULL,
  `userZip` VARCHAR(6) COLLATE utf8_polish_ci NOT NULL,
  `userNIP` VARCHAR(10) COLLATE utf8_polish_ci NOT NULL,
  `userREGON` VARCHAR(14) COLLATE utf8_polish_ci NOT NULL,
  PRIMARY KEY (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


CREATE TABLE `prywatni` (
  `userID` INT(10) NOT NULL,
  `userName` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userSex` enum('','kobieta','mężczyzna') COLLATE utf8_polish_ci NOT NULL,
  `userBirth` DATE NOT NULL,
  `userZip` VARCHAR(6) COLLATE utf8_polish_ci NOT NULL,
  `userAvatar` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  `userEducation` enum('','Podstawowe','Średnie','Wyższe niepełne','Wyższe','Podyplomowe') COLLATE utf8_polish_ci NOT NULL,
  `userCivilStatus` enum('','zajęty','wolny') COLLATE utf8_polish_ci NOT NULL,
  `userPhoto` VARCHAR(255) COLLATE utf8_polish_ci NOT NULL,
  PRIMARY KEY (`userID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


A teraz zapewne fajnie by było, gdyby trzeba było tworzyć tylko jedno zapytanie. Tworzymy zatem triggera, który będzie po wykonaniu instrukcji INSERT dla tabeli "users" dodawał użytkowników do odpowiednich grup.

DROP TRIGGER IF EXISTS `mainInsert`//
CREATE TRIGGER `mainInsert` AFTER INSERT ON `users`
 FOR EACH ROW BEGIN
  IF NEW.userType > 0
  THEN
  INSERT INTO firmy SET userID = NEW.userID;
  ELSEIF NEW.userType < 1
  THEN
  INSERT INTO prywatni SET userID = NEW.userID;
  END IF;
END
//

W tym przykładzie jako DELIMITER ustawiamy //