—
Vous êtes en train d’analyser votre data base et vous voulez mettre en place des relations sur celle-ci.
Je vais vous re présenter les contraintes d’intégralité référentielles
et plus précisément pour voir et comprendre les données en attente de validation .
Voici un petit exemple pour illustrer :
Considérons un fichier pour les employés et un pour les services services :
Création du fichier des services
CREATE OR REPLACE TABLE GDATA.CST2 (
SERVICE CHAR(3) CCSID 1147 NOT NULL DEFAULT » ,
LIBEL CHAR(30) CCSID 1147 NOT NULL DEFAULT » ,
CONSTRAINT GDATA.Q_GDATA_CST2_SERVICE_00001 PRIMARY KEY( SERVICE ) )
RCDFMT CST2F ;
1/ Création du fichier des employés avec une contrainte
CREATE OR REPLACE TABLE GDATA.CST1 (
NUMERO DECIMAL(5, 0) NOT NULL DEFAULT 0 ,
NOM CHAR(30) CCSID 1147 NOT NULL DEFAULT » ,
PRENOM CHAR(30) CCSID 1147 NOT NULL DEFAULT » ,
SERVICE CHAR(3) CCSID 1147 NOT NULL DEFAULT » ,
PRIMARY KEY( NUMERO ) ,
CONSTRAINT GDATA.Q_GDATA_CST1_SERVICE_00001
FOREIGN KEY( SERVICE )
REFERENCES GDATA.CST2 ( SERVICE )
ON DELETE NO ACTION
ON UPDATE NO ACTION )
RCDFMT CST1F ;
Vous pouvez ajouter la contrainte ultérieurement avec
- la commande :
ADDPFCST FILE(GDATA/CST1)
TYPE(REFCST) KEY(SERVICE) PRNFILE(GDATA/CST2) PRNKEY(SERVICE) DLTRULE(NOACTION)
UPDRULE(*NOACTION)
- le SQL
ALTER TABLE GDATA.CST1
ADD CONSTRAINT GDATA.Q_GDATA_CST1_SERVICE_00001
FOREIGN KEY( SERVICE )
REFERENCES GDATA.CST2 ( SERVICE )
ON DELETE NO ACTION
ON UPDATE NO ACTION ;
2/ Alimentation des données
Création des services
INSERT INTO GDATA/CST2 VALUES(‘COM’, ‘Comptabilité’)
INSERT INTO GDATA/CST2 VALUES(‘PRO’, ‘Production ‘)
Création des employés
INSERT INTO GDATA/CST1 VALUES(01, ‘Berthoin’, ‘Pierre-Louis’, ‘COM’)
INSERT INTO GDATA/CST1 VALUES(02, ‘Berthoin’, ‘Younes ‘, ‘PRO’)
Sur une insertion avec service inexistant, un message d’erreur est produit
INSERT INTO GDATA/CST1 VALUES(03, ‘Berthoin’, ‘Yasmine ‘, ‘CRP’)
ID message . . . . . . : SQL0530
Message . . . . : Opération non admise par la contrainte référentielle
Q_GDATA_CST1_SERVICE_00001 de GDATA.
Sur une suppression de service avec des employés liés, un message d’erreur est produit
DELETE FROM GDATA/CST2 WHERE SERVICE = ‘PRO’
ID message . . . . . . : SQL0532
Message . . . . : Suppression impossible à cause de la contrainte
référentielle Q_GDATA_CST1_SERVICE_00001 de GDATA.
Il est possible de désactiver la contrainte :
CHGPFCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
STATE(*DISABLED)
Une fois les contrôles désactivés, les requêtes précédentes s’exécutent
DELETE FROM GDATA/CST2 WHERE SERVICE = ‘PRO’
INSERT INTO GDATA/CST1 VALUES(03, ‘Berthoin’, ‘Yasmine ‘, ‘CRP’)
Lorsqu’on remet la contrainte :
CHGPFCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
STATE(ENABLED) CHECK(YES)
Les valeurs de clé de la contrainte référentielle sont incorrectes.
Vérification en instance pour le fichier CST1.
Si vous avez des anomalies, vous devez désactiver la contrainte :
CHGPFCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
STATE(*DISABLED)
Pour voir les enregistrements en attente de validation :
DSPCPCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
OUTPUT(*)
Pas de service SQL mais un peu d’astuce et c’est ok
Il suffit de chercher les employés avec un service inexistant
CREATE TABLE QTEMP.ATTENTES AS
(SELECT *
FROM GDATA.CST1 A
WHERE NOT EXISTS (
SELECT *
FROM GDATA.CST2 B
WHERE A.SERVICE = B.SERVICE
AND B.SERVICE IS NOT NULL))
WITH DATA;
Remarque :
Vous pouvez passer cette commande avant de mettre en œuvre votre contrainte !
Vous pourrez ainsi mettre des relations dans votre application sans risque
Vous pouvez ensuite utiliser, un outil de modélisation :
https://gitmind.com/fr/schema-base-donnees.html
Vous avez également des extensions dans Visual Studio Code
ou utiliser un simple Chatgpt avec un prompt du style :
« Peux tu me faire un schéma format PNG des relations de ma base de données avec les scriptes ci joint »
FK Foreign key
PK Primary key
Rien de magique , mais si on peut renseigner et documenter sa base, c’est toujours ça de fait