Attention, ceci est uniquement valable in SQL Server Créer une trigger qui renvois une erreur dans un cas précis -- On donne un nom à la trigger et on lui dit sur quelle table il opère -- Ici le trigger opère sur la table "offre" CREATE TRIGGER date_offre_posterieure_date_vente ON offre -- On lui dit l'action pour laquelle il doit s'exécuter (ici après un insert) -- On pourrait aussi avoir "after delete" ou "after update" AFTER INSERT AS BEGIN -- On déclare les variables avec leur types -- Ces déclarations doivent toujours être au début du trigger declare @dateOffre SMALLDATETIME declare @idBien INTEGER declare @dateMiseVente SMALLDATETIME -- "inserted" est une table temporaire qui renvois le tuple inséré -- On pourrait aussi avoir "deleted" à la place de inserted, et dans le cas d'un UPDATE -- On a les deux (deleted et inserted) -- La syntaxe de @variable = attribut va attribuer la valeur de l'attribut du tuple -- dans la variable définie plus tot select @idBien = id_bien, @dateOffre = date_offre from inserted -- Ensuite on peut simplement utiliser la variable n'importe où dans une query select @dateMiseVente = date_mise_en_vente from bien where id_bien = @idBien -- on crée une condition (dans lequel il faut annuler l'insert) if @dateOffre < @dateMiseVente begin -- on génère une erreur raiserror('La date de l''offre doit être postérieur à la date de la mise en vente.', 7, 1) -- On annule l'insert rollback transaction -- On met fin à la trigger return end -- si la condition ne corresponds aps, alors l'insert est bien inséré END On peut aussi faire un curseur pour itérer sur plusieurs lignes d’une requète SQL -- Ici on déclare une variable curseur pour une certaine query (que l'on va itérer) DECLARE crsrClientA_F CURSOR FOR SELECT nom, adresse FROM Client WHERE UPPER(SUBSTRING(nom,1,1)) IN ('A','B','C','D','E','F') -- On ouvre le curseur et on récupère le premier élément dans des variables OPEN crsrClientA_F FETCH crsrClientA_F INTO @nom, @adresse -- Tant que le dernier fetch a trouvé quelque chose, on va print le nom et l'addresse WHILE @@FETCH_STATUS = 0 BEGIN PRINT @nom + ' habite à ' + @adresse -- A la fin de la boucle, on refait un fetch pour récupérer la valeur suivante -- La boucle s'arretera quand ce fetch rattera FETCH crsrClientA_F INTO @nom, @adresse END -- Une fois terminé on peut fermer le curseur et le désallouer CLOSE crsrClientA_F DEALLOCATE crsrClientA_F