Bonjour,
Essayez :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CREATE TRIGGER TR_A_I_tb_rappels
ON dbo.tb_rappels
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
UPDATE dbo.tb_rappels
SET rp_date = rp_ech - 30
FROM dbo.tb_rappels AS R
JOIN INSERTED AS I
ON R.rp_cpt = I.rp_cpt
WHERE R.rp_date IS NULL
END
GO |
Quelques petites remarques pour que vous puissiez vous en sortir avec les triggers :
- Vous pouvez omettre dbo. devant le nom de vos triggers : la démarche est bonne, mais un trigger est attaché à une table, donc il appartient forcément au même schéma que la table sur laquelle vous l'attachez
- LIKE est un opérateur qui permet de rechercher une séquence de caractères dans une chaîne de caractères : il ne permet pas de savoir, par comparaison, s'il n'y pas de valeur dans la colonne.
Vous pouvez donc écrire :
1 2 3 4
| IF 'j''aaime écrire des triggers' LIKE '%trigger%'
PRINT 'OK'
ELSE
PRINT 'KO' |
Affiche dans SSMS OK
- NULL n'est pas une valeur : c'est l'absence de valeur. La preuve, c'est que NULL n'est pas égal à lui-même :
1 2 3 4
| IF NULL = NULL
PRINT 'OK'
ELSE
PRINT 'KO' |
Affiche dans SSMS KO
Et NULL se propage (sauf si vous positionnez l'option de session SET CONCAT_NULL_YIELDS_NULL à OFF) : si nous exécutons :
SELECT 'Bonjour' + NULL + 'Cristina'
Nous obtenons NULL
De même on ne peut pas écrire :
1 2 3
| SELECT mesColonnes
FROM dbo.maTable
WHERE uneColonne = NULL |
Mais :
1 2 3
| SELECT mesColonnes
FROM dbo.maTable
WHERE uneColonne IS NULL |
Cela signifie donc bien que NULL n'est pas une valeur, mais un propriété : une valeur est NULL ou ne l'est pas.
- N'écrivez pas vos jointures dans un WHERE, mais en précisant votre prédication à l'aide de JOIN : c'est plus proche de la norme, cela vous permet de séparer les jointures des filtres du WHERE, et dans certains cas particuliers, cela s'avèrera plus rapide
- Les mises à jour de valeurs en SQL se font par l'instruction UPDATE. L'instruction SELECT vous permet de connaître le contenu d'une ou plusieurs tables.
Les insertions de lignes (tuple complet) se font avec INSERT, et les suppression de lignes (tuple complet) avec DELETE.
Seule l'instruction UPDATE permet de modifier les valeurs d'un tuple.
Dans les triggers, vous avez accès aux tables virtuelles INSERTED et DELETED, qui ont strictement la même structure que la table qui subit la modification de données :
- dans un trigger de type AFTER ou INSTEAD OF INSERT, seule la table virtuelle INSERTED est disponible. Celle-ci contient les lignes qui viennent d'être insérées par la transaction qui a déclenché le trigger,
- dans un trigger de type AFTER ou INSTEAD OF UPDATE, les tables virtuelles INSERTED et DELETED sont disponibles : INSERTED contient les nouvelles valeurs des lignes affectées par la transaction de modification, tandis que DELETED contient les anciennes valeurs de ces mêmes lignes.
- enfin dans un trigger de type AFTER ou INSTEAD OF DELETE, seule la table virtuelle DELETED est disponible. Celle-ci contient les lignes qui viennent d'être supprimées par la transaction qui a déclenché le trigger.
PS: les données à importer sont de type datetime et les nouvelles données devront être de type smalldatetime
Que voulez-vous dire ?
Si vous voulez modifier le type des colonnes et que nous n'êtes pas sûre de la façon de faire, postez le script DDL de votre table (sous SSMS : clic-droit sur la table > Générer un script de la table en tant que > CREATE TO > Nouvelle Fenêtre de l'Editeur de requêtes)
Si vous voulez aller un peu plus loin avec les triggers, jetez un œil ici
@++
Partager