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

MS SQL Server Discussion :

[SQL2005]Trigger On delete, insert, update(colonne)


Sujet :

MS SQL Server

  1. #1
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut [SQL2005]Trigger On delete, insert, update(colonne)
    Bonjour à tous,

    Est-il possible de faire un trigger en mettant un nom de champ entre parentheses pour un UPDATE (comme sur Oracle).

    Exemple :
    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
    16
    if exists (select name from sysobjects 
    WHERE name='trig_update_nbre_produits' 
    AND type='TR')
    DROP TRIGGER trig_update_nbre_produits
    GO
    CREATE TRIGGER trig_update_nbre_produits
    ON produit FOR INSERT, DELETE, UPDATE(id_cat)
    AS
    BEGIN	
    	UPDATE categorie 
    	SET categorie.nombre_produits =
    		(SELECT COUNT(p.id_prod) FROM produit p
    			WHERE p.id_cat = categorie.id_cat);
     	PRINT 'Exécution du trigger de MAJ : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
    END
    GO
    Voici le diagramme de données de ma base. J'ai rajouté la colonne 'nombre_produits' dans la table 'categorie'.

    Merci beaucoup !

    PS : Le diagramme de données généré par Enterprise Manager est en fichier attaché.
    Images attachées Images attachées  
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Possible comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TRIGGER trig_update_nbre_produits
    ON produit FOR INSERT, DELETE, UPDATE
    AS
    BEGIN	
       IF UPDATE(id_cat)
       BEGIN     
    	UPDATE categorie 
    	SET categorie.nombre_produits =
    		(SELECT COUNT(p.id_prod) FROM produit p
    			WHERE p.id_cat = categorie.id_cat)
     	PRINT 'Exécution du trigger de MAJ : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
       END
    END
    GO
    Cepandant considérez l'utilisation des tables DELETED et INSERTED. Comme vous n'avez pas indiqué ce que fait ce trigger difficile de vous aider plus en avant.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Merci pour la réponse.

    Le trigger permet la mise à jour de la colonne 'nombre_produits' dans la table 'categorie', lors d'un delete, insert ou update (uniquement la colonne 'id_cat' dans la table 'produit') sur la table produit.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  4. #4
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Ne faut-il pas faire plutot 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
    16
    17
    18
    19
    20
    21
    22
    23
    if exists (select name from sysobjects 
    WHERE name='trig_update_nbre_produits' 
    AND type='TR')
    DROP TRIGGER trig_update_nbre_produits
    GO
    CREATE TRIGGER trig_update_nbre_produits
    ON produit FOR INSERT, DELETE, UPDATE
    AS
    if update(id_cat)
    	UPDATE categorie 
    	SET categorie.nombre_produits =
    		(SELECT COUNT(p.id_prod) FROM produit p
    			WHERE p.id_cat = categorie.id_cat);
     	PRINT 'Exécution du trigger de MAJ : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
     
    BEGIN	
    	UPDATE categorie 
    	SET categorie.nombre_produits =
    		(SELECT COUNT(p.id_prod) FROM produit p
    			WHERE p.id_cat = categorie.id_cat);
     	PRINT 'Exécution du trigger de MAJ : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
    END
    GO
    Parce que sinon, le code n'est exécuté que pour le UPDATE non ?

    Et que m'apporterait l'utilisation des tables inserted et deleted dans ce cas ?
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    UPDATE() est une fonction. A ne pas confondre avec UPDATE matAble qui est un ordre SQL...

    Quant à votre code il est faux pour plusieurs raisonj :
    1) la syntaxe du IF n'admet qu'une seule instruction
    2) vous n'utilisez toujours pas les tables inserted et deleted.

    Postez le DDL de vos tables ainsi qu'un jeu d'essais afin que l'on vous aide.
    En cela vous respecterez la charte de postage :
    http://www.developpez.net/forums/showthread.php?t=96701

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonsoir,

    Voici la DDL des deux tables concernées (je pensais que le diagramme de données suffisait...) :

    Table 'produit' :
    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
    16
    17
    18
    19
    20
    CREATE TABLE [dbo].[produit](
    	[id_prod] [char](15) NOT NULL,
    	[id_cat] [char](5) NULL,
    	[titre_prod] [varchar](30) NULL,
    	[detail_prod] [varchar](30) NULL,
    	[image_prod] [varchar](30) NULL,
    	[nouv_prod] [bit] NULL,
    	[prom_prod] [bit] NULL,
    	[sel_prod] [bit] NULL,
    	[poids_prod] [tinyint] NULL,
    	[dispo_prod] [bit] NULL,
    	[delai_prod] [varchar](30) NULL,
    	[prixht_prod] [decimal](8, 2) NULL,
    	[prixhtprom_prod] [decimal](8, 2) NULL,
    	[tauxtva_prod] [decimal](4, 2) NULL,
     CONSTRAINT [pk_produit] PRIMARY KEY CLUSTERED 
    (
    	[id_prod] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Table 'categorie' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE [dbo].[categorie](
    	[Id_cat] [char](5) NOT NULL,
    	[Nom_cat] [varchar](30) NULL,
    	[nombre_produits] [int] NULL,
     CONSTRAINT [pk_cat] PRIMARY KEY CLUSTERED 
    (
    	[Id_cat] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Je ne vois toujours pas l'utilité d'utiliser les tables inserted et deleted pour ce que je veux. Il suffit de mettre un update (instruction SQL) sur la colonne 'nombre_produits' de la table 'categorie'.

    Merci beaucoup.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Je ferais donc 3 triggers pour éviter de TOUT reclaculer car votre trigger au fur et à mesure de la montée en charge va prendre de plus en plus de temps...

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    CREATE TRIGGER trig_update_nbre_produits
    ON produit FOR UPDATE
    AS
    BEGIN	
       COMMIT
       IF UPDATE(id_cat)
    	UPDATE categorie 
    	SET nombre_produits = 
    		(SELECT COUNT(p.id_prod) 
                     FROM produit p
    		 WHERE p.id_cat = categorie.id_cat)
    END
    GO
     
     
    CREATE TRIGGER trig_update_nbre_produits
    ON produit FOR INSERT
    AS
    BEGIN	
       COMMIT
       UPDATE categorie 
       SET nombre_produits = nombre_produits +
    		(SELECT COUNT(p.id_prod) 
                     FROM   inserted i
    		 WHERE  i.id_cat = categorie.id_cat)
    END
    GO
     
     
    CREATE TRIGGER trig_update_nbre_produits
    ON produit FOR INSERT
    AS
    BEGIN	
       COMMIT
       UPDATE categorie 
       SET nombre_produits = nombre_produits -
    		(SELECT COUNT(p.id_prod) 
                     FROM   deleted d
    		 WHERE  d.id_cat = categorie.id_cat)
    END
    GO
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Ok, Merci.

    Pourquoi faut-il mettre un commit avant l'execution de l'update dans le trigger ?
    Ca marche sans. Et je crois que le commit, doit etre mis à la fin ?

    J'ai apporté quelques petites corrections aux triggers que voici :

    Trigger ON INSERT :
    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
    16
    17
    if exists (select name from sysobjects 
    where name='trig_insert_nbre_produits' 
    AND type='TR')
    drop trigger trig_insert_nbre_produits
    GO
    create trigger trig_insert_nbre_produits
    on produit for insert
    as
    begin
    	update categorie 
    	set categorie.nombre_produits = categorie.nombre_produits + 
    		   (select count(i.id_prod)
    			from inserted i
    			where i.id_cat = categorie.id_cat);
     	PRINT 'Exécution du trigger for insert : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
    end
    GO
    Trigger ON UPDATE :
    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
    16
    17
    18
    if exists (select name from sysobjects 
    where name='trig_update_nbre_produits' 
    AND type='TR')
    drop trigger trig_update_nbre_produits
    GO
    create trigger trig_update_nbre_produits
    on produit for update
    as
    begin
    	if update(id_cat)
    	update categorie 
    	set nombre_produits = 
    		   (select count(p.id_prod)
    			from produit p
    			where p.id_cat = categorie.id_cat);
     	PRINT 'Exécution du trigger for update : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
    END
    GO
    Trigger ON DELETE :
    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
    16
    17
    if exists (select name from sysobjects 
    where name='trig_delete_nbre_produits' 
    AND type='TR')
    drop trigger trig_delete_nbre_produits
    GO
    create trigger trig_delete_nbre_produits
    on produit for delete
    as
    begin
    	update categorie 
    	set categorie.nombre_produits = categorie.nombre_produits -
    		   (select count(d.id_prod)
    			from deleted d
    			where d.id_cat = categorie.id_cat);
     	PRINT 'Exécution du trigger for delete : Actualisation de la colonne nombre_produits effectuée sur la table categorie' ;
    END
    GO
    Et ca marche sans probleme.

    Merci.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Plus vous validerez tôt la transaction et moins elle durera. Moins elle durera et moins vous aurez de blocage...

    En particulier pour l'update !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Génération des méthodes DELETE, INSERT, UPDATE
    Par noftal dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/12/2013, 15h13
  2. [2005] TRIGGER insert,update et delete
    Par lbh85 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 15/04/2013, 11h56
  3. Réponses: 4
    Dernier message: 21/01/2011, 14h53
  4. [trigger] insert update et delete
    Par kooljy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/07/2006, 08h56
  5. Redirect de la page après un insert/update/delete
    Par mchicoix dans le forum XMLRAD
    Réponses: 5
    Dernier message: 25/02/2005, 09h31

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