IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

aide création trigger


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Points : 35
    Points
    35
    Par défaut aide création trigger
    Bonjour à tous!

    je travaille sur SQL server management studio 2005

    et j'ai besoin de créer un trigger qui se déclenche quand on essaye d'insérer des données dans la table rappels, car dans cette table j'ai de données "date_rappel" qui sont vides.

    Je suis en train de faire une migration de données alors il faut que les champs de date_rappel vides soient remplis avec le champ date_echeance (moins 30 jours) qui est tjs rempli!

    j'ai essayé qqch comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE TRIGGER dbo.dateRap
       ON  dbo.tb_rappels
       AFTER INSERT
    AS 
    BEGIN
     
    	SET NOCOUNT ON;
     
     
    	IF [rp_date] like null
    	select [rp_ech]-30 into rp_date from tb_rappels WHERE tb_rappels.rp_cpt=new.rp_cpt
     
    END
    GO
    je sais qu'il est pas juste mais je ne me connais pas trop en triggers :S

    est-ce que quelqu'un aurait une syntaxe correcte??

    merci d'avance!

    Cristina!

    PS: les données à importer sont de type datetime et les nouvelles données devront être de type smalldatetime

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'Bonjour' + NULL + 'Cristina'
    Nous obtenons NULL

    De même on ne peut pas écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mesColonnes
    FROM dbo.maTable
    WHERE uneColonne = NULL
    Mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    @++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Points : 35
    Points
    35
    Par défaut
    ca joue, je vais essayer tout ca! et j'espère que ca fonctionne!

    dans les pires des cas, je px ajouter les valeurs manuellement car il y en a pas plus de 10 mais j'aimerais bien que ca soit "propre" pour après

    merci encore!

Discussions similaires

  1. Aide création Trigger
    Par Devilstuff dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/01/2010, 09h19
  2. [Aide] Création d'une interface Ajout/Suppression
    Par Fredods26 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 19/10/2006, 14h16
  3. création triggers et procédure stockées
    Par jhons dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/07/2006, 17h54
  4. Aide création requette MDX
    Par Tankian dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 23/05/2006, 17h23
  5. besoin d'aide sur trigger
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 18/07/2004, 22h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo