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 :

Table INSERTED non valide


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut Table INSERTED non valide
    Bonjour,

    Je reviens encore vers vous. Je post beaucoup en ce moment dans ma découverte des triggers.
    Mes recherches ne sont peut être pas pertinente mais j'avoue ne pas trouver ce qui m'intéresse.

    Voila ce que je fais : (Je suis dans un trigger, la table inserted existe bien.. (me semble t-il ?))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @Champ = 'SELECT ' + COLUMN_NAME + ' FROM INSERTED' FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'DOS_DOSSIER' AND ORDINAL_POSITION = @i
    EXEC sp_executesql @Champ, N'@resultat nvarchar(255) output', @resultat output
    @Champ = 'SELECT MaColonne FROM INSERTED'
    Message d'erreur 208 "Nom d'objet 'INSERTED' non valide."

    Au début j'avais fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @Champ = COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'DOS_DOSSIER' AND ORDINAL_POSITION = @i
    SET @Myval = (SELECT @Champ FROM INSERTED)
    Le résultat était :
    @Champ = MaColonne
    @MyVal = MaColnne
    Dans @Myval je récupérais juste la valeur présente dans @Champ et non la valeur de la colonne voulue..

    Si quelqu'un a une piste..
    Merci

    Je peux aussi vous montrer le code entier du trigger si d'après vous le problème est ailleurs.

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Vous faites du SQL dynamique. Ce dernier s'exécute hors contexte. Donc comme vous êtes hors de portée du déclencheur, la pseudo table inserted (comme deleted) n'existe pas, d'où votre message d'erreur.

    Commencez par expliquer clairement votre besoin fonctionnel. Car faire du SQL dynamique dans un curseur c'est pas franchement optimal.. C'est plutôt même franchement dégueulasse !

    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 confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Merci de votre retour.

    En fait ce que je cherche à faire c'est créer une requête ne contenant que les champs update dans ma table.

    J'avais pour idée de regarder dans les tables INSERTED et DELETED les champs qui ont réellement été modifié afin de crée une requête et de l'enregistrer dans une nouvelle table.

    Je voulais avant tout récupérer chaque nom de colonne pour faire la comparaison et ne pas être obligé de les lister (158 champs dans la table)

    Cela m'aurait permit de créer une requête avec les champs modifié (admettons qu'il n'y en est que trois) afin de la rejouer tel quel sur un autre serveur.

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Ce que vous voulez faire c'est de la traçabilité... Il existe des outils intégrés pour cela dans SQL Server comme Change Tracking ou CDC....

    En sus une table de 138 colonnes c'est totalement grotesque et n'est visiblement pas une table relationnelle.... Vous avez fait du tableur !
    Lisez ceci : http://blog.developpez.com/sqlpro/p1...mances_petites

    Voici une possibilité

    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
    CREATE TABLE T_TRACE_UPDATE
    (NOM_COLONNE   sysname,
     COL_AVANT     VARCHAR(32),
     COL_APRES     VARCHAR(32),
     COL_MAJ       BIT);
    GO 
     
    -- dans le déclencheur :
    INSERT INTO T_TRACE_UPDATE
    SELECT 'COL1' AS NOM_COLONNE,
           CAST(d.COL1 AS VARCHAR(32)) AS COL_AVANT, 
           CAST(i.COL1 AS VARCHAR(32)) AS COLAPRES, 
           CASE WHEN d.COL1 = i.COL1 THEN 1 ELSE 0 END AS COL1_MAJ
    FROM   inserted AS i
           JOIN deleted AS d
                ON i.??? = d.???       
    UNION ALL            
    SELECT 'COL2' AS NOM_COLONNE,
           CAST(d.COL2 AS VARCHAR(32)) AS COL_AVANT, 
           CAST(i.COL2 AS VARCHAR(32)) AS COL_APRES, 
           CASE WHEN d.COL2 = i.COL2 THEN 1 ELSE 0 END AS COL_MAJ
    FROM   inserted AS i
           JOIN deleted AS d
                ON i.??? = d.???  
    ...     
     
     
    -- une vue de synthse pour savoir qu'est ce qui a changé :
    SELECT * FROM T_TRACE_UPDATE WHERE COL_MAJ = 1
    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/ * * * * *

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Le projet est assez vieux maintenant et je ne suis pas responsable de l'appli principale ou de la base de données.

    Je vais donc m'adapter à ce qui existe actuellement.
    Malheureusement je ne suis pas très doué avec SQL et encore moins, par conséquent, avec les triggers.

    La dernière solution que vous me proposez m'intéresse mais elle m'oblige donc à écrire i.Col et d.Col. Or je veux le tester sur tous mes champs.
    Comme dis précédemment je dois faire avec toutes les colonnes et ne peut donc pas me permettre de toutes les lister.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par egautier18 Voir le message
    ...
    Comme dis précédemment je dois faire avec toutes les colonnes et ne peut donc pas me permettre de toutes les lister.
    Sauf que vous n'avez pas le choix !

    Quand on hérite d'une base de merde... on fait hélas de la merde !
    les américains résument cela très bien par :
    "garbage in, gargbage out" !

    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/ * * * * *

Discussions similaires

  1. table inserted non reconnue
    Par wsixpo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2011, 17h46
  2. Trigger INSERT : nom de colonne non valide
    Par arthuro45 dans le forum Développement
    Réponses: 6
    Dernier message: 13/09/2010, 21h58
  3. Réponses: 5
    Dernier message: 23/06/2009, 14h05
  4. Réponses: 2
    Dernier message: 19/11/2008, 06h09
  5. [Tomcat5] Insertion photo ds pdf. Chemin non valide?
    Par osmoze dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 21/09/2004, 11h12

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