Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/03/2011, 15h42   #1
Invité de passage
 
Inscription : avril 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 5
Points : 1
Points : 1
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 :
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 :
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.
wsixpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 13h24   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
3
4
 
 
SELECT 'CREATE TRIGGER TRG_' + TABLE_NAME + ' ON ' + TABLE_NAME + ' FOR ... '
FROM INFORMATION_SCHEMA.TABLES
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 16h10   #3
Invité de passage
 
Inscription : avril 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 5
Points : 1
Points : 1
Bonjour,

Merci pour cette idée, je vais essayer de créer mes triggers par soft suivants la structure des tables.
wsixpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 17h46   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h45.


 
 
 
 
Partenaires

Hébergement Web