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

Langage SQL Discussion :

table inserted non reconnue


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 10
    Points
    10
    Par défaut table inserted non reconnue
    Bonjour à tous,

    En fait, je tourne en rond depuis ce matin à la recherche d'une solution.

    J’explique.

    Je suis dans un trigger que je veux rendre le plus dynamiquement possible, car il sera dupliqué sur plusieurs tables de ma base (si il marche un jour...).

    Dans ce trigger, j'ai besoin de comparer les champs avant et après insertion afin d'insérer des valeurs dans une autre table. Pour cela, j'utilise les tables inserted & deleted.

    Comme je l'ai expliqué plus haut, il faut que ce soit dynamique donc je ne veux pas écrire une comparaison pour chaque colonne de la table et recommencer cela pour chaque table donc, je parcours le schéma de ma table pour avoir le nom des colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE curseur1 CURSOR for select Column_name,Data_type  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME= '' + @tablename + '' and Column_name <> 'evolution'
    OPEN curseur1;
    FETCH curseur1 INTO @nomcol,@datatype;
     WHILE @@FETCH_STATUS = 0
     BEGIN
     
     ......
     FETCH curseur1 INTO @nomcol,@datatype ;
     END
    CLOSE curseur1;
    DEALLOCATE curseur1;
    cela marche bien.
    Maintenant je voudrais récupérer la valeur avant et après insertion de la colonne @nomcol et c'est là que rien ne va plus, car je n'arrive pas à faire une requête sql dynamique à l'intérieur de ma boucle sur la table inserted ou deleted.

    par exemple si je place ce code dans ma boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET @Sql = 'SELECT @old_Name = ' + @nomcol + ' FROM deleted';
    SET @ParmDefinition = N' @old_Name varchar(30) OUTPUT'; 
    EXECUTE sp_executesql @Sql, @ParmDefinition, @old_Name=@oldName OUTPUT;
    => il ne connait plus la table deleted car il la considère comme une table de ma base apparemment.

    Avez-vous une idée ?

    Merci de votre aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Quand vous utilisez EXECUTE, la chaine est executée dans un contexte différent. Ainsi, vos éventuelles variables ainsi que vos pseudo tables inserted et deleted n'existe pas !

    Mais un tel trigger va être une catastrophe !

    Pourquoi ne pas au moins générer vos ordres de creation de trigger à partir de vos tables systèmes, afin de créer facilement vos triggers ? (les tables inserted et deleted ont la meme structure que la table mise à jour.)

    Vos triggers seront au moins plus performants (effectivement par contre, il faudra les modifier à chaque modification de table...)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    SELECT 'CREATE TRIGGER TRG_' + TABLE_NAME + ' ON ' + TABLE_NAME + ' FOR ... '
    FROM INFORMATION_SCHEMA.TABLES

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Merci pour cette idée, je vais essayer de créer mes triggers par soft suivants la structure des tables.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    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 858
    Points : 52 996
    Points
    52 996
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Vos triggers seront au moins plus performants (effectivement par contre, il faudra les modifier à chaque modification de table...)
    Pas du tout, vous pouvez automatiser la création de vos triggers en plaçant le code de création dynamique d'un trigger DML dans un trigger DDL de type CREATE TABLE ou ALTER TABLE....

    A +

Discussions similaires

  1. Table INSERTED non valide
    Par egautier18 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 16/10/2013, 16h04
  2. [MySQL] $table non reconnu
    Par alexisd dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 14/07/2008, 18h47
  3. Réponses: 0
    Dernier message: 23/06/2008, 16h26
  4. [Tables Access] Problème avec AUTO_INCREMENT non reconnu
    Par GuixInDaMixx dans le forum VB.NET
    Réponses: 4
    Dernier message: 15/05/2008, 18h01
  5. Creation de table, caractère non reconnu
    Par Missvan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/02/2004, 13h28

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