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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite 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
    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 998
    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 998
    Billets dans le blog
    6
    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 émérite 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
    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 émérite 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
    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 998
    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 998
    Billets dans le blog
    6
    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 émérite 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
    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 !

+ 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