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 :

TRIGGER - DELETE dans FOR UPDATE ne passe pas dans INSTEAD OF DELETE


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut TRIGGER - DELETE dans FOR UPDATE ne passe pas dans INSTEAD OF DELETE
    Bonjour,

    j'ai une table avec deux triggers :
    1. TRIGGER FOR UPDATE qui supprime éventuellement des tuples de sa table en fonction de leurs états
    2. TRIGGER INSTEAD OF DELETE qui réécrit la cascade


    Lors du DELETE qui figure dans mon premier TRIGGER, le deuxième n'est pas appelé, donc ma réécriture de cascade ne fonctionne pas, donc ma suppression non plus. A part passer par une procédure stockée, y a-t-il une solution (configuration ou autre ?? ). Je n'aimerais pas passer par la procédure stockée car il faudrait faire un curseur pour parcourir les tuples du TRIGGER ensembliste, et c'est trop lent.

    Merci d'avance de votre aide !

  2. #2
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    J'ai tenté d'activer la récursivité des TRIGGERS, toujours pas bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET RECURSIVE_TRIGGERS ON | OFF

  3. #3
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    L'option NESTED TRIGGERS est également activée...

  4. #4
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    Voici ma table avec les deux TRIGGERS. C'est une table de test, elle n'est pas très propre.

    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
    CREATE TABLE [dbo].[Test2] (
      [Id] int NULL,
      [iValue] int NULL
    )
    ON [PRIMARY]
    GO
     
    CREATE TRIGGER [dbo].[Test2_tru] ON [dbo].[Test2]
    WITH EXECUTE AS CALLER
    FOR UPDATE
    AS
    BEGIN
      DELETE FROM Test2
    END
    GO
     
    CREATE TRIGGER [dbo].[Test2_trd] ON [dbo].[Test2]
    WITH EXECUTE AS CALLER
    INSTEAD OF DELETE
    AS
    BEGIN
      INSERT INTO Test SELECT COUNT(Id), 'toto', COUNT(Id) FROM DELETED
    END
    GO
    Si le TRIGGER INSTEAD OF DELETE était appelé, les tuples ne devraient pas se supprimer, et je devrais trouver des données dans mon autre table "Test", ce qui n'est pas le cas.

  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
    D'abord il est inutile de faire un curseur comme vous le suggérer, ensuiste tout dépend du code de vos trigger.
    postez les !

    En effet il n'y a pas de raison que cela marche mal... Démonstration :

    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 DATABASE DB_TEST_TRIGGER;
    GO
     
    USE DB_TEST_TRIGGER;
    GO
     
    CREATE TABLE T1 
    (T1_ID    INT NOT NULL IDENTITY PRIMARY KEY,
     T1_DATA  VARCHAR(32));
    GO 
     
    CREATE TABLE T2 
    (T2_ID    INT NOT NULL IDENTITY PRIMARY KEY,
     T2_DATA  VARCHAR(32));
    GO
    Le déclencheur UPDATE de T1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER E1
    ON T1
    FOR UPDATE
    AS
        DELETE T2;
    GO
    le déclencheur INSTAED OF DELETE de T2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TRIGGER E2
    ON T2
    INSTEAD OF DELETE
    AS
       UPDATE T2
       SET T2_DATA = UPPER(T2_DATA)
    GO
    Les données de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO T1 VALUES ('UN UN UN UN ');
    INSERT INTO T1 VALUES ('DEUX DEUX ');
     
    INSERT INTO T2 VALUES ('un un un un ');
    INSERT INTO T2 VALUES ('deux deux ');
    On lance un update sur T1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE T1
    SET T1_DATA = UPPER(T1_DATA);
    Résultat de T2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM T2
     
    T2_ID       T2_DATA
    ----------- --------------------------------
    1           UN UN UN UN 
    2           DEUX DEUX .
    La majusculisation a été effectuée !

    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 éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    Le code de mes TRIGGERS est assez long. C'est pourquoi j'ai fait un exemple succin illustrant mon problème. Le code que j'ai posté ne fonctionne pas chez moi. Ensuite, la solution CURSOR serait envisagée si je devais passer par les procédures stockées. Si pas de SP, pas de CURSOR. C'est clair pour moi.

    La différence entre mon code et le votre se trouve dans le TRIGGER FOR UPDATE. Je DELETE des tuples de la même table, vous supprimez des tuples d'une autre table. Les TRIGGERS FOR UPDATE et INSTEAD OF DELETE sont sur la même table ! Je pense que c'est la source du problème.

  7. #7
    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 : 43
    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
    Par défaut
    Si pas de SP, pas de CURSOR. C'est clair pour moi.
    C'est faux quand même.
    Si cela n'est pas possible, c'est que votre conception est fausse.

    Votre second trigger doit être un AFTER et pas un INSTEAD OF

    @++

  8. #8
    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 : 43
    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
    Par défaut
    Bonjour,

    Sans le code, difficile de vous aider ...

    @++

Discussions similaires

  1. VBA ne passe pas dans BO xi-r2
    Par faressam dans le forum Administration-Migration
    Réponses: 10
    Dernier message: 27/06/2008, 14h10
  2. Ma requête SQL SELECT ne passe pas dans next()
    Par Somato dans le forum Bases de données
    Réponses: 17
    Dernier message: 02/06/2008, 15h45
  3. pourquoi je ne passe pas dans mon action
    Par fk04 dans le forum Struts 1
    Réponses: 5
    Dernier message: 03/10/2007, 21h20
  4. Ctrl -] ne passe pas dans une console avec vim
    Par Celelibi dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/03/2006, 13h35
  5. Réponses: 8
    Dernier message: 26/10/2005, 03h52

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