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 :

accès aux tables deleted et inserted


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut accès aux tables deleted et inserted
    Bonjour,

    J'utilise le client Microsoft SQL server Management Studio qui va interroger SQL server 2005.
    Dans la base centreFormation, j'ai supprimé un enregistrement dans la table dbo.activite.
    Je souhaite maintenant accéder à la pseudo table deleted qui a copié l'enregistrement supprimé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    use centreFormation
    go
    select * from deleted
    go
    Cela renvoie le message d'erreur : Nom d'objet 'deleted' non valide.
    Comment afficher le contenu de la pseudo table deleted ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Bonjour,

    ces tables ne sont accessibles que dans le contexte d'exécution d'un trigger. Avez-vous un trigger sur cette table ?
    Emmanuel T.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut pseudo table inserted
    Accès possible que par un trigger, OK. J'en ai un sur la table mais c'est à titre de test car je ne maîtrise pas vraiment, de plus il ne fonctionne pas.
    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
    (if OBJECT_ID(Activite.recup_anc_lib) is not null
    	drop trigger recup_anc_lib
    go
     
    create trigger Activite.recup_anc_lib on activite
    for update
    as
    declare		@libelleOld varchar(25),
    			@numeroActiviteOld smallint,
    /*instruction select qui affecte une valeur a une variable*/
    select @numeroActiviteOld=numero, @libelleOld=libelle
    from inserted;
    go
     
    /*Insère l'ancien libellé dans la table Activite*/
    declare		@libelleOld varchar(25),
    			@numeroActiviteOld smallint
    update Activite set libelle=@libelleOld
    where numero=@numeroActiviteOld;
    go
    Il génère le code d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Msg*207, Niveau*16, État*1, Ligne*1
    Nom de colonne non valide*: 'recup_anc_lib'.
    Msg*156, Niveau*15, État*1, Procédure*recup_anc_lib, Ligne*8
    Syntaxe incorrecte vers le mot clé 'select'.
     
    (0*ligne(s) affectée(s))

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Il faut faire un petit peu attention, il y a une virgule qui traîne.

    Essayez ça :

    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
    CREATE TRIGGER TR_recup_anc_lib ON activite
    FOR UPDATE
    AS
    declare		@libelleOld varchar(25),
    			@numeroActiviteOld smallint
    /*instruction select qui affecte une valeur a une variable*/
    SELECT @numeroActiviteOld=numero, @libelleOld=libelle
    FROM inserted;
    go
     
    /*Insère l'ancien libellé dans la table Activite*/
    declare		@libelleOld varchar(25),
    			@numeroActiviteOld smallint
    UPDATE Activite SET libelle=@libelleOld
    WHERE numero=@numeroActiviteOld;
    go
    Emmanuel T.

  5. #5
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Citation Envoyé par kagemaru
    ces tables ne sont accessibles que dans le contexte d'exécution d'un trigger. Avez-vous un trigger sur cette table ?
    Juste une petite remarque : la clause OUTPUT des instructions DML permet aussi d'accéder à ces tables virtuelles

    Ce trigger est faux parce qu'il n'est pas ensembliste.
    En effet que se passera-t-il si on UPDATE plusieurs lignes de la table Activite ?
    Vous pouvez lire ce que j'ai écrit à ce sujet.

    Du coup, une seule instruction suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER TR_recup_anc_lib
    	ON dbo.Activite
    	FOR UPDATE
    AS
    BEGIN
    	UPDATE		dbo.Activite
    	SET		libelle = D.libelle
    	FROM		dbo.Activite AS A
    	INNER JOIN	DELETED AS D ON A.numero = D.numero
    END
    Dans un trigger sur

    - UPDATE, vous avez accès aux tables virtuelles INSERTED et DELETED, qui reflètent respectivement les nouvelles et anciennes valeurs prises par les lignes affectées par l'UPDATE;

    - INSERT, vous avez accès à la table virtuelle INSERTED, qui reflète seulement les nouvelles lignes ajoutées à la table;

    - DELETE, vous avez accès à la table virtuelle DELETED, qui reflète seulement les lignes supprimées de la table.

    @++

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    En effet, je ne pense jamais à cette option qui peut permettre d'éviter l'utilisation de triggers.
    Emmanuel T.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut tables deleted et inserted
    Merci pour vos réponses, je vais tester la solution de Kagemaru...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Je viens de tester te trigger de Kagemaru en concaténant la chaîne test à l'ancien libellé. Cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
     
    ALTER TRIGGER [TR_recup_anc_lib]
    	ON [dbo].[Activite]
    	FOR UPDATE
    AS
    BEGIN
    	UPDATE	dbo.Activite
    	SET		libelle = D.libelle+'test'
    	FROM	dbo.Activite AS A, DELETED AS D
    	WHERE	A.numero = D.numero
    END
    et ça fonctionne !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Rectification : c'est la solution de Elsuket que j'ai testé et qui fonctionne.

  10. #10
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Ne mettez pas le prédicat de jointure dans la clause WHERE :

    - Ce n'est plus à la norme,
    - Cela peut causer des problèmes de performance dans certains cas,
    - Cela permet de distinguer directement dans votre code les jointures des filtres

    @++

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

Discussions similaires

  1. Accès aux tables par les users
    Par BRUN NICOLAS dans le forum Sécurité
    Réponses: 2
    Dernier message: 13/02/2007, 10h58
  2. pas d'accès aux tables tout en ayant les droits ?
    Par electrosat03 dans le forum Access
    Réponses: 15
    Dernier message: 12/12/2006, 18h45
  3. Interdire l'acces aux tables etc..
    Par lagratteCchouette dans le forum Sécurité
    Réponses: 4
    Dernier message: 17/07/2006, 21h29
  4. [ODBC] Nux - Accès aux tables liées
    Par Artusamak dans le forum Access
    Réponses: 3
    Dernier message: 04/07/2006, 16h57
  5. Réponses: 3
    Dernier message: 30/05/2006, 19h09

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