Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 16/12/2010, 15h31   #1
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Par défaut update sur une clé primaire [zOS]

Bonjour,

Je m'occupe d'un programme qui fait des delete et des insert sur une table. On m'a demandé de chercher pourquoi on ne fait pas simplement des update.

J'ai répondu naïvement qu'on ne peut pas faire d'update sur un champ de la clé primaire.
Sauf que j'ai eu l'air bête quand, en effectuant un update en test par spufi sur un champ de la clé primaire, ça a fonctionné.

J'ai regardé la ddl :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE QUAL.TABLET                                            
       (REF                            DECIMAL(9 , 0)             
                                                         NOT NULL  
       WITH DEFAULT                                                          
      ,COD                            CHARACTER(2)   FOR SBCS DATA 
                                                        NOT NULL       
       ,NOM                            CHARACTER(19)  FOR SBCS DATA
                                                         NOT NULL     
       ,PART                            SMALLINT       NOT NULL     
       REF                                                
       PRIMARY KEY                                                      
       (REF                                                         
       ,COD                                                         
       )                                                                
      )
La définition de l'index correspondant à la clé primaire:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TYPE 2 UNIQUE INDEX QUAL.TABLEIU             
       ON QUAL.TABLET                              
 
       (REF                         ASC           
       ,COD                        ASC  )        
       USING STOGROUP TABLESG                        
             PRIQTY 1000                             
             SECQTY 0                                
             ERASE NO                                
       FREEPAGE 0                                    
       PCTFREE 15                                    
       BUFFERPOOL BP32                               
       CLOSE YES
On voit qu'apparemment il ne s'agit pas d'un index clusterisé.

L'index clusterisé:
Code :
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
CREATE TYPE 2 INDEX QUAL.TABLECL             
       ON QUAL.TABLET                       
 
       (PART                         ASC  ) 
       CLUSTER                                
       (PARTITION 1    ENDING AT (1)          
                       USING STOGROUP TABLESG
                             PRIQTY 1000      
                             SECQTY 0         
                             ERASE NO         
                       FREEPAGE 0             
                       PCTFREE 15             
       ,PARTITION 2    ENDING AT (2)  
                USING STOGROUP TABLESG
                      PRIQTY 1000     
                      SECQTY 0        
                      ERASE NO        
                FREEPAGE 0            
                PCTFREE 15            
,PARTITION 3    ENDING AT (3)         
                USING STOGROUP TABLESG
                      PRIQTY 1000     
                      SECQTY 0        
                      ERASE NO        
                FREEPAGE 0            
                PCTFREE 15            
)               
BUFFERPOOL BP32 
CLOSE NO;
Et là je me dis que je comprends pourquoi le programme fait des delete-insert plutôt que des update. En effet dans les champs mis à jour, il y a le numéro de partition.
Je me dis alors que la règle c'est peut être qu'on ne peut pas faire de mise à jour sur un élément de l'index cluster.
Sauf que quand j'essaye de faire un update par spufi sur le numpar, ça marche!

Du coup je me demande quels sont les champs qui sont impossible de mettre à jour par DB2?

Avez vous une idée?

Merci d'avance!
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 17h05   #2
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 2 882
Détails du profil
Informations professionnelles :
Activité : Spécialiste en bases de données
Secteur : Conseil

Informations forums :
Inscription : septembre 2006
Messages : 2 882
Points : 5 115
Points : 5 115
DB2 refuse de modifier la valeur de la clé primaire (ou plus généralement d’une clé candidate) d’une table T1 seulement quand cette clé est référencée par une clé étrangère d’une table T2 (ou T1 elle-même) et que cette clé étrangère a la même valeur que celle de la clé primaire que l’on veut modifier. C’est un a priori « philosophique » (sic) énoncé dans le document IBM Database 2 Referential Integrity Usage Guide - GG24-3312-0 : June 1988, page 48 :
The reason for this restriction is philosophical
Yes sir!

Manifestement vous n'êtes pas dans cette situation.


N.B. A la page 50 du document :

One cannot update the primary key value for a row that has a dependent row, because DB2 only supports the RESTRICT option of the UPDATE RULE. However, the value of a primary key may be changed using the UPDATE statement as long as it is not a parent row.
__________________
_
Faites simple, mais pas plus simple ! (A. Einstein)
E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
=> La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

__________________

Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)
fsmrel est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 09h00   #3
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par fsmrel Voir le message
DB2 refuse de modifier la valeur de la clé primaire (ou plus généralement d’une clé candidate) d’une table T1 seulement quand cette clé est référencée par une clé étrangère d’une table T2 (ou T1 elle-même) et que cette clé étrangère a la même valeur que celle de la clé primaire que l’on veut modifier. C’est un a priori « philosophique » (sic) énoncé dans le document IBM Database 2 Referential Integrity Usage Guide - GG24-3312-0 : June 1988, page 48 :
The reason for this restriction is philosophical
Yes sir!

Manifestement vous n'êtes pas dans cette situation.


N.B. A la page 50 du document :

One cannot update the primary key value for a row that has a dependent row, because DB2 only supports the RESTRICT option of the UPDATE RULE. However, the value of a primary key may be changed using the UPDATE statement as long as it is not a parent row.
Ok. J'aurais pourtant juré avoir eu un problème lié à un update d'une clé qui n'était pourtant pas une clé érangère d'une autre table.

Merci beaucoup pour ta réponse!
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 09h31   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
peut-être pour les clefs auto-incrémentée ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 11h00   #5
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
Citation:
Envoyé par michael08 Voir le message
...
Et là je me dis que je comprends pourquoi le programme fait des delete-insert plutôt que des update. En effet dans les champs mis à jour, il y a le numéro de partition.
Je me dis alors que la règle c'est peut être qu'on ne peut pas faire de mise à jour sur un élément de l'index cluster.
Sauf que quand j'essaye de faire un update par spufi sur le numpar, ça marche!

Jusqu'à la V7 incluse la mise à jour d'une colonne d'un index de partition avait une réputation exécrable en terme de concurrence.

Par exemple ( trouvé sur un blog grâce à Google ) :

Citation:
Before Version 8, DB2 had to quiesce all the partitions affected by a row’s movement when a column in the partition key was changed.. If the key was altered and a row was moved from partition 3 to partition 7, all the partitions between 3 and 7 inclusively for the table space and partition index would have to be drained along with any non partitioned indexes on that table. Not very cool concurrency is important and you would prefer to avoid and timeouts.. As stated, this problem was resolved by DB2 Version 8.
La version 8 a résolu ce problème.

Peut-être que votre programme a gardé trace de cette contrainte du passé ...
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 16h09   #6
Invité régulier
 
Inscription : octobre 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 42
Points : 5
Points : 5
Citation:
Envoyé par Luc Orient Voir le message
Jusqu'à la V7 incluse la mise à jour d'une colonne d'un index de partition avait une réputation exécrable en terme de concurrence.

Par exemple ( trouvé sur un blog grâce à Google ) :



La version 8 a résolu ce problème.

Peut-être que votre programme a gardé trace de cette contrainte du passé ...
Merci beaucoup pour la piste! En fait apparemment il y a une DSNZPARM qu'il faut configurer et le paramètre PARTKEYU valorisé à YES permet de réaliser un update sur un champ participant au calcul du numéro de participation.
Par contre je me demande comment DB2 reconnait les champs qui participent au numéro de partition ne connaissant pas la règle.
je me demande même comment il reconnait le champ partition?
michael08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 16h36   #7
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
Citation:
Envoyé par michael08 Voir le message
Merci beaucoup pour la piste! En fait apparemment il y a une DSNZPARM qu'il faut configurer et le paramètre PARTKEYU valorisé à YES permet de réaliser un update sur un champ participant au calcul du numéro de participation.
Effectivement (extrait de la doc IBM) :

Citation:
The PARTKEYU subsystem parameter controls whether values that are in columns that participate in partitioning keys can be updated.

Acceptable values: YES, NO, or SAME
Default: YES
Update: option 18 on panel DSNTIPB
DSNZPxxx: DSN6SPRM PARTKEYU

YES
Values in columns that participate in partitioning keys can be updated.
This is the default.
NO
Values in columns that participate in partitioning keys cannot be updated.
SAME
Values in columns that participate in partitioning keys can be updated if and only if the update leaves the row belonging to the same partition.
Specifying NO or SAME will not improve concurrency. DB2® does not take exclusive control of the objects to perform the update.

Attempts to inappropriately update the value in a partitioning key column result in the failure of the SQL statement with a -904 resource-unavailable SQL code. The accompanying DSNT501I message identifies the unavailable resource as code type X'3000' and a reason code of 00C900C7.

The PARTKEYU parameter is deprecated in DB2 Version 9.1.
Ce paramètre est indiqué comme "deprecated" par IBM, c'est à dire qu'il devrait disparaitre dans une prochaine version de DB2. En effet, depuis la V8 la mise à jour d'une colonne d'un index de partition ne devrait plus poser de problème en terme de concurrence.


Citation:
Par contre je me demande comment DB2 reconnait les champs qui participent au numéro de partition ne connaissant pas la règle.
je me demande même comment il reconnait le champ partition?
L'information est bien sûr stockée dans le catalogue associé au SGBD.
Luc Orient 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 02h49.


 
 
 
 
Partenaires

Hébergement Web