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 :

Trigger de suppression de plusieurs records


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 7
    Par défaut Trigger de suppression de plusieurs records
    Bonjour,
    Est ce qu'on peut utiliser un triggers pour faire une vérification avant de supprimer des enregistrements?
    Je m'explique : En fait avant de supprimer un (ou plusieurs) enregistrements de la table (table1) je veux vérifier si cette ces enregistrements existe dans une autre table indépendante (table2) donc j'ai crée un trigger de suppression voici le code :
    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 ri_delete_table1 ON dbo.table1
    FOR DELETE 
    AS
    BEGIN TRANSACTION
    DECLARE @code VARCHAR(15)
    SELECT @code = code FROM Deleted
    IF EXISTS(SELECT code FROM table2 WHERE code = @code)
    	BEGIN
    		RAISERROR ('Impossible de supprimer cet élément !',16,1)
    		ROLLBACK TRANSACTION
    	END
    ELSE
    	COMMIT TRANSACTION
    Ce Trigger fonction si je supprime 1 seul enregistrement par contre si je supprime plusieurs enregistrements il supprime tous sans faire la vérification
    Merci d'avance de votre aide

  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
    1) Le trigger est déclenché par l'ordre SQL qui est lancé, quelque soit le nombre de ligne que l'ordre SQL impacte.

    Si vous supprimez 32 758 125 lignes avec DELETE FROM MaTable, le trigger ne sera déclenché qu'une seule fois.

    Il faut donc n'utiliser dans un trigger QUE DU CODE ENSEMBLISTE (requête) et JAMAIS de variable.

    2) le delete est déjà opéré, mais la transaction n'est pas achevée. Cela veut dire que si vous vouliez utiliser le trigger à la place de contraintes d'intégrité absente, ce n'est pas possible.

    3) le trigger étant à l'intérieur de la transaction le BEGIN TANSACTION n'a pas de sens et le COMMIT est implicite

    4) en principe une sous requête sans calcul d'agrégat, dans la clause EXISTS s'introduit par SELECT *.

    Votre trigger se résume donc à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER ri_delete_table1 ON dbo.table1
    FOR DELETE 
    AS
     
    IF EXISTS(SELECT * 
              FROM   table2 
              WHERE  code IN  (SELECT code 
                               FROM Deleted))
       BEGIN
          RAISERROR ('Impossible de supprimer cet élément !', 16, 1)
          ROLLBACK TRANSACTION
       END
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/s...ransactsql/#L5

    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 du Club
    Inscrit en
    Décembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 7
    Par défaut
    Merci SqlPro, je vais refaire tous mes Triggers en tenant compte de toutes vos remarques.
    Dorénavant pour détourner ce problème je rajouterai un filtre a mon delete
    A+

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

Discussions similaires

  1. Suppression de plusieurs enregistrements à la fois
    Par vinzom dans le forum Access
    Réponses: 3
    Dernier message: 04/07/2006, 00h09
  2. Requête suppression de plusieurs lignes
    Par rane dans le forum Requêtes
    Réponses: 20
    Dernier message: 29/06/2006, 20h22
  3. Suppression d'un record dans le cas d'un doublant
    Par nassu dans le forum Access
    Réponses: 1
    Dernier message: 30/05/2006, 07h11
  4. [Hibernate2]suppression de plusieurs enreg de base de donnée
    Par michaelbob dans le forum Hibernate
    Réponses: 2
    Dernier message: 15/05/2006, 16h48
  5. suppression sur plusieurs tables
    Par Jean-Matt dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/06/2005, 11h46

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