Trigger BEFORE sous SQL Server ?

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

 

Base de données / , , , ,