Trigger BEFORE sous SQL Server ?
Les triggers en mode Before, à l’instar de ce dont nous disposons sous Oracle ou sous PostgreSQL n’existent pas sous SQL Server. Dans Microsoft SQL Server, vous devez passer par un trigger du type INSTEAD OF. L’exemple ci-dessous permet de passer en majuscule la colonne film_titre de la table film lors d’une nouvelle saisie ou d’une modification du contenu de cette colonne !
La table FILM
CREATE TABLE film ( film_id INT IDENTITY(1,1) NOT NULL , film_titre VARCHAR(100), film_annee INT, film_duree INT , film_genre VARCHAR(50), CONSTRAINT film_pk PRIMARY KEY (film_id), CONSTRAINT film_uk UNIQUE(film_titre ,film_annee ), CONSTRAINT film_chk_annee CHECK(film_annee >= 1895) CONSTRAINT film_chk_duree CHECK (film_duree BETWEEN 30 AND 270), CONSTRAINT film_chk_genre CHECK (film_genre IS NOT NULL), CONSTRAINT film_chk_titre CHECK (film_titre IS NOT NULL) );
Trigger INSTEAD OF INSERT
CREATE TRIGGER instead_of_insert ON film INSTEAD OF INSERT AS BEGIN INSERT INTO film(film_titre,film_genre, film_duree, film_annee ) SELECT UPPER(film_titre),film_genre,film_duree,film_annee FROM inserted IF @@ERROR <>0 ROLLBACK TRANSACTION END GO
Trigger INSTEAD OF UPDATE
CREATE TRIGGER instead_of_update ON film INSTEAD OF UPDATE AS BEGIN IF UPDATE(film_titre) BEGIN UPDATE film SET film_titre=UPPER(inserted.film_titre) FROM inserted INNER JOIN film ON inserted.film_id=film.film_id END IF UPDATE(film_annee) BEGIN UPDATE film SET film_annee=inserted.film_annee FROM inserted INNER JOIN film ON inserted.film_id=film.film_id END IF UPDATE(film_duree) BEGIN UPDATE film SET film_duree=inserted.film_duree FROM inserted INNER JOIN film ON inserted.film_id=film.film_id END IF UPDATE(film_genre) BEGIN UPDATE film SET film_genre=inserted.film_genre FROM inserted INNER JOIN film ON inserted.film_id=film.film_id END IF @@ERROR <>0 ROLLBACK TRANSACTION END GO