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 :

[SQL2008][SQL2012] Trigger, Inserted dans la fonction EXEC


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    [Edit]
    Tellement concentrer sur mon problème que j'en oublie les bonnes manières...

    Donc...

    Bonjours messieurs, j'ai un petit problème dans un trigger
    [/Edit]


    Le trigger suivant plante en disant que le table Inserted n'existe pas.
    Il s'agit d'un trigger pour loger / historiser dans une autre table.


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    ALTER TRIGGER [dbo].[InsUpd_Histo]
       ON [dbo].[Grilles_actif]
       AFTER INSERT,UPDATE
    AS 
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
     
        -- Insert statements for trigger here
     
     
            DECLARE @Val varchar(max)
            DECLARE @Name varchar(max)
            DECLARE InsUpd CURSOR FOR    (
                                SELECT Name
                                FROM sys.columns
                                where OBJECT_NAME(object_id)='Grilles_actif'
                            )
            OPEN InsUpd
            SET @Val=''
            FETCH NEXT FROM InsUpd INTO @Name
            WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @Val=@Val+','+@Name
                FETCH NEXT FROM InsUpd INTO @Name
            END
            CLOSE InsUpd
            DEALLOCATE InsUpd
     
            SET @Val =  ' INSERT INTO Grilles'+
                        ' ('+SUBSTRING(@Val,2,len(@Val)-1)+')'+
                        ' SELECT '+SUBSTRING(@Val,2,len(@Val)-1) +
                        ' FROM inserted'
     
            EXEC(@Val)
     
    END
    * Merci *

  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
    Par défaut
    Bonjour,

    En effet, EXEC est executé dans un nouveau context, dans lequel la table INSERTED n'existe pas, puisqu'elle n'existe que dans le trigger...

    Vous semblez vouloir tracer des modifications en base de données. Avez vous envisagé l'utilisation de Change Data Capture ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Avez vous envisagé l'utilisation de Change Data Capture ?
    Non, mais je vais regarder si ça le fait maintenant


    ... j'ai une version standard ...

  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 997
    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 997
    Billets dans le blog
    6
    Par défaut
    Alors utilisez CHANGE_TRACKING !
    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
    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
    Et en plus Change tracking, c'est synchrone

    En outre, le curseur dans le trigger, ce n'est pas très beau, d'autant que ce n'est pas nécessaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @liste_colonnes nvarchar(max)
     
    SELECT	@liste_colonnes = CASE
    		WHEN @liste_colonnes IS NULL THEN ''
    		ELSE @liste_colonnes + ', '
    	END + name
    FROM	sys.columns
    WHERE	object_id = object_id('dbo.Grilles_actif')
    @+

Discussions similaires

  1. [SQL2008][SQL2012]Trigger + Dead Lock
    Par Donpi dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/01/2013, 15h25
  2. Trigger insert dans une table
    Par dhiaeddine2012 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/03/2012, 12h55
  3. insertion dans une fonction
    Par solom7 dans le forum Requêtes
    Réponses: 11
    Dernier message: 02/02/2010, 09h45
  4. Insertion d'un INSERT dans une fonction
    Par marco01 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/04/2009, 12h51
  5. Annuler une insertion dans un Trigger
    Par dreamanoir dans le forum Oracle
    Réponses: 2
    Dernier message: 10/01/2005, 13h04

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