OVH Cloud OVH Cloud

Interrogation concernant le type de données timestamp ??

6 réponses
Avatar
News Groups
Bonjour,

Dans un post passé je me posais une question concernant l'instruction UPDATE
dans une procédure stockée, suivant ce type de cas :
> Si dans la table
> T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> on trouve :
> 1, DUPONT, MARCEL
> et que l'on veuille modifier MARCEL en Jacques, alors l'update donne :
>
> UPDATE T_CLIENT
> SET CLI_NOM = 'DUPONT',
> CLI_PRENOM = 'Jacques'
> WHERE CLI_ID = 1

Il m'a été répondu que :
".. une seule colonne n'est effectivement réellement mise à jour...Cela
permet de faire de l'update générique plutôt que du SQL dynamique ..."
et
".. Il ne faut pas faire de différence entre colonnes modifiées et colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera rien
pour SQL
Server..."

J'ai appliqué cela et ça marche.

Mais j'ai ajouté une colonne de type timestamp dans ma table et si je fais
un update avec des valeurs identiques à celles existantes,
la valeur timestamp se modifie, alors que je pensais qu'il n'en serait rien
??!!
Soit, pour la table :
T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
où on trouve :
1, DUPONT, MARCEL
-- valeur timestamp : 0X0000002D33
Aprés Update:
UPDATE T_CLIENT
SET CLI_NOM = 'DUPONT',
CLI_PRENOM = 'MARCEL'
WHERE CLI_ID = 1
-- valeur timestamp : 0X0000002D35

J'ai peut-être rien compris à ce type de données Timestamp et quelque chose
m'échappe ??!!

Quelqu'un peut-il m'aider à éclaircir cela ?

Merci, Thierry.

6 réponses

Avatar
Fred BROUARD
timestamp est un type spécifique à SQL Server et en voie d'abandon. Il servait à
marqué les insertions et modif notamment dans le cadre de la réplication (numéro
de versdion). Il est à éviter car ce mot clef (timestamp) est utilisé dans la
norme SQL comme combiné dateheure. A ce jour il est d'aileurs remplacé par
rowversion.

Mais que voulez vous faire ?

A +

News Groups a écrit:
Bonjour,

Dans un post passé je me posais une question concernant l'instruction UPDATE
dans une procédure stockée, suivant ce type de cas :

Si dans la table
T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
on trouve :
1, DUPONT, MARCEL
et que l'on veuille modifier MARCEL en Jacques, alors l'update donne :

UPDATE T_CLIENT
SET CLI_NOM = 'DUPONT',
CLI_PRENOM = 'Jacques'
WHERE CLI_ID = 1




Il m'a été répondu que :
".. une seule colonne n'est effectivement réellement mise à jour...Cela
permet de faire de l'update générique plutôt que du SQL dynamique ..."
et
".. Il ne faut pas faire de différence entre colonnes modifiées et colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera rien
pour SQL
Server..."

J'ai appliqué cela et ça marche.

Mais j'ai ajouté une colonne de type timestamp dans ma table et si je fais
un update avec des valeurs identiques à celles existantes,
la valeur timestamp se modifie, alors que je pensais qu'il n'en serait rien
??!!
Soit, pour la table :
T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
où on trouve :
1, DUPONT, MARCEL
-- valeur timestamp : 0X0000002D33
Aprés Update:
UPDATE T_CLIENT
SET CLI_NOM = 'DUPONT',
CLI_PRENOM = 'MARCEL'
WHERE CLI_ID = 1
-- valeur timestamp : 0X0000002D35

J'ai peut-être rien compris à ce type de données Timestamp et quelque chose
m'échappe ??!!

Quelqu'un peut-il m'aider à éclaircir cela ?

Merci, Thierry.








--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Patrice
Ce type de donnée sert justement à "versionner" les mises à jour et la
colonne est donc mis à jour automatiquement à chaque "update".
Peut-être veux tu tu un type DATETIME ou SMALLDATETIME ?



Patrice
--

"News Groups" a écrit dans le message de
news:41f61d3e$0$2518$
Bonjour,

Dans un post passé je me posais une question concernant l'instruction


UPDATE
dans une procédure stockée, suivant ce type de cas :
> Si dans la table
> T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> on trouve :
> 1, DUPONT, MARCEL
> et que l'on veuille modifier MARCEL en Jacques, alors l'update donne :
>
> UPDATE T_CLIENT
> SET CLI_NOM = 'DUPONT',
> CLI_PRENOM = 'Jacques'
> WHERE CLI_ID = 1

Il m'a été répondu que :
".. une seule colonne n'est effectivement réellement mise à jour...Cela
permet de faire de l'update générique plutôt que du SQL dynamique ..."
et
".. Il ne faut pas faire de différence entre colonnes modifiées et


colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera


rien
pour SQL
Server..."

J'ai appliqué cela et ça marche.

Mais j'ai ajouté une colonne de type timestamp dans ma table et si je fais
un update avec des valeurs identiques à celles existantes,
la valeur timestamp se modifie, alors que je pensais qu'il n'en serait


rien
??!!
Soit, pour la table :
T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
où on trouve :
1, DUPONT, MARCEL
-- valeur timestamp : 0X0000002D33
Aprés Update:
UPDATE T_CLIENT
SET CLI_NOM = 'DUPONT',
CLI_PRENOM = 'MARCEL'
WHERE CLI_ID = 1
-- valeur timestamp : 0X0000002D35

J'ai peut-être rien compris à ce type de données Timestamp et quelque


chose
m'échappe ??!!

Quelqu'un peut-il m'aider à éclaircir cela ?

Merci, Thierry.







Avatar
News Groups
Le Hic est bien là !!
J'ai créé cette colonne de type timestamp pour justement l'utiliser pour sa
propriété de "versionning"
afin de vérifier l'hypothése :
".. Il ne faut pas faire de différence entre colonnes modifiées et colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera rien
pour SQL Server..."
Et cette vérification je l'a fait par le test suivant
> Soit, pour la table :
> T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> où on trouve :
> 1, DUPONT, MARCEL
> j'execute l'Update:
> UPDATE T_CLIENT
> SET CLI_NOM = 'DUPONT',
> CLI_PRENOM = 'MARCEL'
> WHERE CLI_ID = 1


Normalement la valeur de timestamp ne devrai pas changer si SQL Server ne
tient pas compte des "colonnes non modifiées"
Or cette valeur change (de 0X0000002D33 à 0X0000002D35)

C'est pourquoi je n'y comprend plus rien ??!!
Peux -tu m'apporter plus d'infos ?

Merci,
Thierry.


"Patrice" a écrit dans le message de news:

Ce type de donnée sert justement à "versionner" les mises à jour et la
colonne est donc mis à jour automatiquement à chaque "update".
Peut-être veux tu tu un type DATETIME ou SMALLDATETIME ?



Patrice
--

"News Groups" a écrit dans le message de
news:41f61d3e$0$2518$
> Bonjour,
>
> Dans un post passé je me posais une question concernant l'instruction
UPDATE
> dans une procédure stockée, suivant ce type de cas :
> > Si dans la table
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > on trouve :
> > 1, DUPONT, MARCEL
> > et que l'on veuille modifier MARCEL en Jacques, alors l'update donne :
> >
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'Jacques'
> > WHERE CLI_ID = 1
>
> Il m'a été répondu que :
> ".. une seule colonne n'est effectivement réellement mise à jour...Cela
> permet de faire de l'update générique plutôt que du SQL dynamique ..."
> et
> ".. Il ne faut pas faire de différence entre colonnes modifiées et
colonnes
> non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera
rien
> pour SQL
> Server..."
>
> J'ai appliqué cela et ça marche.
>
> Mais j'ai ajouté une colonne de type timestamp dans ma table et si je


fais
> un update avec des valeurs identiques à celles existantes,
> la valeur timestamp se modifie, alors que je pensais qu'il n'en serait
rien
> ??!!
> Soit, pour la table :
> T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> où on trouve :
> 1, DUPONT, MARCEL
> -- valeur timestamp : 0X0000002D33
> Aprés Update:
> UPDATE T_CLIENT
> SET CLI_NOM = 'DUPONT',
> CLI_PRENOM = 'MARCEL'
> WHERE CLI_ID = 1
> -- valeur timestamp : 0X0000002D35
>
> J'ai peut-être rien compris à ce type de données Timestamp et quelque
chose
> m'échappe ??!!
>
> Quelqu'un peut-il m'aider à éclaircir cela ?
>
> Merci, Thierry.
>
>
>
>
>




Avatar
bruno reiter [MVP]
si tu fais un update en changeant le contenu d'une colonne par la même
chose, il y a effectivement update.

tu dois toi-même gérer par trigger le fait de défaire l'update (avec un
ROLLBACK) en regardant la valeur avant et après dans les pseudos tables
inserted et deleted. ATTENTION on défait l'ensemble de la transaction (pb
transactions imbriquées, définies par l'utilisateur et multi-lignes).

br

"News Groups" wrote in message
news:41f66ddb$0$2502$
Le Hic est bien là !!
J'ai créé cette colonne de type timestamp pour justement l'utiliser pour


sa
propriété de "versionning"
afin de vérifier l'hypothése :
".. Il ne faut pas faire de différence entre colonnes modifiées et


colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera


rien
pour SQL Server..."
Et cette vérification je l'a fait par le test suivant
> > Soit, pour la table :
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > où on trouve :
> > 1, DUPONT, MARCEL
> > j'execute l'Update:
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'MARCEL'
> > WHERE CLI_ID = 1
Normalement la valeur de timestamp ne devrai pas changer si SQL Server ne
tient pas compte des "colonnes non modifiées"
Or cette valeur change (de 0X0000002D33 à 0X0000002D35)

C'est pourquoi je n'y comprend plus rien ??!!
Peux -tu m'apporter plus d'infos ?

Merci,
Thierry.


"Patrice" a écrit dans le message de news:

> Ce type de donnée sert justement à "versionner" les mises à jour et la
> colonne est donc mis à jour automatiquement à chaque "update".
> Peut-être veux tu tu un type DATETIME ou SMALLDATETIME ?
>
>
>
> Patrice
> --
>
> "News Groups" a écrit dans le message de
> news:41f61d3e$0$2518$
> > Bonjour,
> >
> > Dans un post passé je me posais une question concernant l'instruction
> UPDATE
> > dans une procédure stockée, suivant ce type de cas :
> > > Si dans la table
> > > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > > on trouve :
> > > 1, DUPONT, MARCEL
> > > et que l'on veuille modifier MARCEL en Jacques, alors l'update donne


:
> > >
> > > UPDATE T_CLIENT
> > > SET CLI_NOM = 'DUPONT',
> > > CLI_PRENOM = 'Jacques'
> > > WHERE CLI_ID = 1
> >
> > Il m'a été répondu que :
> > ".. une seule colonne n'est effectivement réellement mise à


jour...Cela
> > permet de faire de l'update générique plutôt que du SQL dynamique ..."
> > et
> > ".. Il ne faut pas faire de différence entre colonnes modifiées et
> colonnes
> > non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera
> rien
> > pour SQL
> > Server..."
> >
> > J'ai appliqué cela et ça marche.
> >
> > Mais j'ai ajouté une colonne de type timestamp dans ma table et si je
fais
> > un update avec des valeurs identiques à celles existantes,
> > la valeur timestamp se modifie, alors que je pensais qu'il n'en serait
> rien
> > ??!!
> > Soit, pour la table :
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > où on trouve :
> > 1, DUPONT, MARCEL
> > -- valeur timestamp : 0X0000002D33
> > Aprés Update:
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'MARCEL'
> > WHERE CLI_ID = 1
> > -- valeur timestamp : 0X0000002D35
> >
> > J'ai peut-être rien compris à ce type de données Timestamp et quelque
> chose
> > m'échappe ??!!
> >
> > Quelqu'un peut-il m'aider à éclaircir cela ?
> >
> > Merci, Thierry.
> >
> >
> >
> >
> >
>
>




Avatar
Med Bouchenafa
Comme te l'as expliqué Bruno, un UPDATE est un UPDATE et SQL Server n'est pas censé savoir que tu as
écrasé des données strictement identiques.
Cela ne devrait d'ailleurs te gêner en rien.
Une colonne de type TIMESTAMP est utilisée pour faire du verrouillage optimistique.
Je ramène une ligne du serveur sur mon poste de travail et je libère tout verrou sur le serveur.
Dans cette ligne, j'ai ramené des données et une certaine valeur de TIMESTAMP
Je prend le temps de siroter mon café avant d'apporter une modification à ma ligne.
Mais avant de valider, je veux être certain que personne d'autre n'a modifié entre temps cette même
ligne
Sinon, je vais écrasé les modifications faites par quelqu'un d'autre.
Pour cela, je lis, à partir du serveur, le contenu de TIMESTAMP et le compare à celui que j'ai dans
ma ligne.
Si la valeur est identique, je suis certain que personne d'autre n'a modifié la ligne.
Sinon, je dois peut-être afficher un message à l'utilisateur lui disant que quelqu'un d'autre a
modifié la ligne.
Doit-il écraser ou bien rapatrier le nouvelle ligne ?

C'est ça le but ultime du TIMESTAMP qui existe dans SQL Server depuis l'origine.

--
Bien cordialement
Med Bouchenafa






"News Groups" a écrit dans le message de news:
41f66ddb$0$2502$
Le Hic est bien là !!
J'ai créé cette colonne de type timestamp pour justement l'utiliser pour sa
propriété de "versionning"
afin de vérifier l'hypothése :
".. Il ne faut pas faire de différence entre colonnes modifiées et colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera rien
pour SQL Server..."
Et cette vérification je l'a fait par le test suivant
> > Soit, pour la table :
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > où on trouve :
> > 1, DUPONT, MARCEL
> > j'execute l'Update:
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'MARCEL'
> > WHERE CLI_ID = 1
Normalement la valeur de timestamp ne devrai pas changer si SQL Server ne
tient pas compte des "colonnes non modifiées"
Or cette valeur change (de 0X0000002D33 à 0X0000002D35)

C'est pourquoi je n'y comprend plus rien ??!!
Peux -tu m'apporter plus d'infos ?

Merci,
Thierry.


"Patrice" a écrit dans le message de news:

> Ce type de donnée sert justement à "versionner" les mises à jour et la
> colonne est donc mis à jour automatiquement à chaque "update".
> Peut-être veux tu tu un type DATETIME ou SMALLDATETIME ?
>
>
>
> Patrice
> --
>
> "News Groups" a écrit dans le message de
> news:41f61d3e$0$2518$
> > Bonjour,
> >
> > Dans un post passé je me posais une question concernant l'instruction
> UPDATE
> > dans une procédure stockée, suivant ce type de cas :
> > > Si dans la table
> > > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > > on trouve :
> > > 1, DUPONT, MARCEL
> > > et que l'on veuille modifier MARCEL en Jacques, alors l'update donne :
> > >
> > > UPDATE T_CLIENT
> > > SET CLI_NOM = 'DUPONT',
> > > CLI_PRENOM = 'Jacques'
> > > WHERE CLI_ID = 1
> >
> > Il m'a été répondu que :
> > ".. une seule colonne n'est effectivement réellement mise à jour...Cela
> > permet de faire de l'update générique plutôt que du SQL dynamique ..."
> > et
> > ".. Il ne faut pas faire de différence entre colonnes modifiées et
> colonnes
> > non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera
> rien
> > pour SQL
> > Server..."
> >
> > J'ai appliqué cela et ça marche.
> >
> > Mais j'ai ajouté une colonne de type timestamp dans ma table et si je
fais
> > un update avec des valeurs identiques à celles existantes,
> > la valeur timestamp se modifie, alors que je pensais qu'il n'en serait
> rien
> > ??!!
> > Soit, pour la table :
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > où on trouve :
> > 1, DUPONT, MARCEL
> > -- valeur timestamp : 0X0000002D33
> > Aprés Update:
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'MARCEL'
> > WHERE CLI_ID = 1
> > -- valeur timestamp : 0X0000002D35
> >
> > J'ai peut-être rien compris à ce type de données Timestamp et quelque
> chose
> > m'échappe ??!!
> >
> > Quelqu'un peut-il m'aider à éclaircir cela ?
> >
> > Merci, Thierry.
> >
> >
> >
> >
> >
>
>




Avatar
Patrice
Je pense que cette phrase s'appliquait au contexte d'une procédure stockée.

Dans la SP, il est bien plus simple de mettre à jour toutes les colonnes
sans se préoccuper de savoir lesquelles sont mises à jour. Pour SQL Server,
si un UPDATE est lancé c'est une mise à jour même si les valeurs sont
identiques.

Tu peux :
- soit tester dans la SP si une colonne en particulier est modifiée (et si
oui mettre à jour toutes les colonnes, sinon ne pas appeler l'UPDATE)
- soit accepter qu'une "validation" par l'utilisateur soit effectivement
considérée comme une modification y compris si il n'a fait en réalité aucune
modification (est-ce fréquent ?)
- cela peut aussi être traité au niveau de l'interface utilisateur (par
exemple si le bouton "Valider" n'est pas actif tant qu'aucune donnée n'a été
modifiée, ce cas ne devrait pas se présenter)

Patrice
--

"News Groups" a écrit dans le message de
news:41f66ddb$0$2502$
Le Hic est bien là !!
J'ai créé cette colonne de type timestamp pour justement l'utiliser pour


sa
propriété de "versionning"
afin de vérifier l'hypothése :
".. Il ne faut pas faire de différence entre colonnes modifiées et


colonnes
non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera


rien
pour SQL Server..."
Et cette vérification je l'a fait par le test suivant
> > Soit, pour la table :
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > où on trouve :
> > 1, DUPONT, MARCEL
> > j'execute l'Update:
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'MARCEL'
> > WHERE CLI_ID = 1
Normalement la valeur de timestamp ne devrai pas changer si SQL Server ne
tient pas compte des "colonnes non modifiées"
Or cette valeur change (de 0X0000002D33 à 0X0000002D35)

C'est pourquoi je n'y comprend plus rien ??!!
Peux -tu m'apporter plus d'infos ?

Merci,
Thierry.


"Patrice" a écrit dans le message de news:

> Ce type de donnée sert justement à "versionner" les mises à jour et la
> colonne est donc mis à jour automatiquement à chaque "update".
> Peut-être veux tu tu un type DATETIME ou SMALLDATETIME ?
>
>
>
> Patrice
> --
>
> "News Groups" a écrit dans le message de
> news:41f61d3e$0$2518$
> > Bonjour,
> >
> > Dans un post passé je me posais une question concernant l'instruction
> UPDATE
> > dans une procédure stockée, suivant ce type de cas :
> > > Si dans la table
> > > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > > on trouve :
> > > 1, DUPONT, MARCEL
> > > et que l'on veuille modifier MARCEL en Jacques, alors l'update donne


:
> > >
> > > UPDATE T_CLIENT
> > > SET CLI_NOM = 'DUPONT',
> > > CLI_PRENOM = 'Jacques'
> > > WHERE CLI_ID = 1
> >
> > Il m'a été répondu que :
> > ".. une seule colonne n'est effectivement réellement mise à


jour...Cela
> > permet de faire de l'update générique plutôt que du SQL dynamique ..."
> > et
> > ".. Il ne faut pas faire de différence entre colonnes modifiées et
> colonnes
> > non modifiées..Il faut UPDATEr toutes les colonnes et cela ne changera
> rien
> > pour SQL
> > Server..."
> >
> > J'ai appliqué cela et ça marche.
> >
> > Mais j'ai ajouté une colonne de type timestamp dans ma table et si je
fais
> > un update avec des valeurs identiques à celles existantes,
> > la valeur timestamp se modifie, alors que je pensais qu'il n'en serait
> rien
> > ??!!
> > Soit, pour la table :
> > T_CLIENT (CLI_ID, CLI_NOM, CLI_PRENOM)
> > où on trouve :
> > 1, DUPONT, MARCEL
> > -- valeur timestamp : 0X0000002D33
> > Aprés Update:
> > UPDATE T_CLIENT
> > SET CLI_NOM = 'DUPONT',
> > CLI_PRENOM = 'MARCEL'
> > WHERE CLI_ID = 1
> > -- valeur timestamp : 0X0000002D35
> >
> > J'ai peut-être rien compris à ce type de données Timestamp et quelque
> chose
> > m'échappe ??!!
> >
> > Quelqu'un peut-il m'aider à éclaircir cela ?
> >
> > Merci, Thierry.
> >
> >
> >
> >
> >
>
>