Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 28/01/2011, 23h04   #1
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Par défaut Peut-on simuler un update pour s'assurer du résultat avant ?

Bonjour,

Est-il possible de 'simuler' un UPDATE ?

Exemple : je fais un
Code :
1
2
3
UPDATE    MATABLE
SET              CHAMP1 = 999999
WHERE     (CHAMP2 = 0)
Je souhaiterais "voir" ce que cela donnera avant de le faire en réel. Pour éviter de faire une mauvaise requête update et avoir des mauvaises conséquences.

Merci pour vos infos
Thib
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 23h22   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
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 950
Points : 17 769
Points : 17 769
Il suffit de gérer une transaction en faisant un ROLLBACK...
Code :
1
2
3
4
5
6
7
8
9
10
 
BEGIN TRANSACTION
 
UPDATE MATABLE
SET    CHAMP1 = 999999
WHERE  CHAMP2 = 0
 
-- tout un tas d'autres requêtes
 
ROLLBACK TRANSACTION
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
Vieux 28/01/2011, 23h40   #3
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci j'ai essayé mais je ne comprends pas comment je peux 'constater' si mon update est correct.

Le rollback m'annule mon update

du coup, après si je fais un select pour voir mes enregistrements...je ne vois aucun changement ?
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 04h53   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 710
Points : 8 710
Bonjour,

Vous pouvez pour cela utiliser la clause OUTPUT :

Code :
1
2
3
4
5
6
7
8
BEGIN TRANSACTION
 
UPDATE MATABLE
SET CHAMP1 = 999999
OUTPUT INSERTED.CHAMP1, DELETED.CHAMP1
WHERE (CHAMP2 = 0)
 
ROLLBACK TRANSACTION
INSERTED et DELETED sont deux tables virtuelles qui ont exactement la même structure que la table qui subit l'UPDATE.
Elles reflètent respectivement les nouvelles et anciennes valeurs prises par les colonnes de lignes candidates à l'UPDATE.

Vous ne pouvez pas l'utiliser si un trigger est en place sur la table qui subit l'UPDATE, puisqu'on peut utiliser ces tables virtuelles également dans un trigger.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 11h21   #5
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci

Mais cette fois, j'obtiens une erreur
Citation:
La table cible 'F_COMPTET' de l'instruction*DML ne peut pas comporter de déclencheurs activés si l'instruction contient une clause OUTPUT sans clause INTO.
J'ai l'impression que cela me parle de ce que vous me disiez sur les triggers.
Je vais essayer de chercher sur le Net des infos sur la clause INTO pour voir si je peux y arriver....
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 11h25   #6
Membre du Club
 
Homme Stef
Consultant Essbase
Inscription : juin 2002
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stef
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant Essbase

Informations forums :
Inscription : juin 2002
Messages : 40
Points : 45
Points : 45
test en re7
asphp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 10h42   #7
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci pour ta réponse. Mais je ne la comprends pas : je suppose que tu me dis "test en recette" ? Mais je ne comprends pas de quoi tu parles.

En attendant, j'ai cherché la clause INTO sur le forum avec le OUTPUT. J'ai trouvé des exemples et je m'y suis adapté.
Cela fonctionne effectivement en mettant un INTO @MatableTempo


Je laisse ouvert le post pendant qq heures au cas où tu me réponds sur le test en re7...

Merci à tous pour votre aide
Thib
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 13h59   #8
Membre du Club
 
Homme Stef
Consultant Essbase
Inscription : juin 2002
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stef
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant Essbase

Informations forums :
Inscription : juin 2002
Messages : 40
Points : 45
Points : 45
test en re7 = si tu as un environnement iso-prod en recette, alors tu pourras faire des tests sur ta table en recette pour voir ce que cela donne, avant de passer en prod
asphp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 14h49   #9
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci pour l'explication.

Je suis un peu ds ce cas, car j'ai un SQL 2008 installé sur mon portable. Et lorsque j'ai un doute, je mets une copie de la base sur mon portable et c'est souvent d'abord sur lui que je fais mes essais.

De toute façon, j'évite de prendre des risques avec SQL Serveur : je fais toujours une sauvegarde avant de lancer des opérations qui peuvent avoir une conséquence.

Merci
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 10h03   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Comme vous l'a expliqué SQLPro, il suffit de faire une transaction annulée, mais de faire un SELECT avant le rollback :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
BEGIN TRANSACTION
 
UPDATE MATABLE
   SET CHAMP1 = 999999
 WHERE CHAMP2 = 0
 
-- tout un tas d'autres requêtes
SELECT *
  FROM MATABLE
 WHERE CHAMP2 = 0
 
ROLLBACK TRANSACTION
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h05.


 
 
 
 
Partenaires

Hébergement Web