[PDF] La gestion des contraintes Hiver 2011 C. Desrosiers





Previous PDF Next PDF



Contraintes dintégrité - domaines - triggers - PL/SQL

Les assertions sont des contraintes qui peuvent porter sur plusieurs tables. ?. Elles doivent être vérifiées par le SGBD à chaque fois qu'une des tables 



Bases de données relationnelles et contraintes SQL

03-Nov-2007 Les contraintes dites "de domaine" concernent les données. Les contraintes de tables peuvent porter sur une colonne sur une ligne ou sur une ...



Cours n°6 SQL : Langage de définition des données (LDD)

Le Langage de Définition des Données est la partie de SQL qui permet de décrire les tables I. Les contraintes de domaine.



Intégrité sémantique dans les bases de données relationnelles

Prise en compte en SQL de CI spécifiques et Triggers Base de données Contraintes d'intégrité ... Contraintes de domaines : Types SQL.



Contraintes dIntégrité Sous Oracle

une valeur différente de NULL SQL d'Oracle permet les contraintes spécifiées par les conditions booléenes sur les valeurs dans les domaines des attributs.



La gestion des contraintes Hiver 2011 C. Desrosiers

LOG660 - Bases de données de haute performance. La gestion des contraintes. Hiver 2011 SQL. ? Contrainte d'intégrité statique ... Contrainte de domaine.



IHDC334 : Base de données 2

Contraintes sur domaine et valeurs . Contraintes de type dépendance fonctionnelle . ... Index induits par l'utilisation des données (requêtes SQL) .



Conception de bases de données relationnelles - Langage SQL

SQL. LMD manipulation de données Contraintes colonnes clés domaines. • Trois types de commandes ... défaut>] <contrainte de domaine>;.



SMI6U05L : Bases de données Le modèle relationnel

La maîtrise de ce domaine avant même SQL



?????????

01-Sept-2018 Université de Sherbrooke http://info.usherbrooke.ca/llavoie. /Users/Sync/Akademia/Domaines/Modules/Bases de donnees/BD190-STD-SQL-01_NDC.



[PDF] Contraintes dintégrité - domaines - triggers - PL/SQL - LaBRI

Domaines ? Contraintes sur les valeurs des attributs ? Contraintes sur les tuples d'une table ? Assertions ? Les triggers 



[PDF] Bases de données relationnelles et contraintes SQL - SQLspot

3 nov 2007 · Les contraintes dites "de domaine" concernent les données Les contraintes de tables peuvent porter sur une colonne sur une ligne ou sur une 



[PDF] Contraintes dintégrité complexes et déclencheurs (triggers) - IRIT

– Définition du domaine ou du type d'un attribut (Integer Char ) – Condition sur les valeurs des attributs d'un n-uplet (clause CHECK de SQL)



[PDF] SQL (Première partie) - Walter Rudametkin

Les contraintes de domaine définissent les valeurs prises par un attribut Les contraintes d'intégrité d'entité précisent la clé primaire de chaque table Les 



[PDF] Conception de bases de données relationnelles - Langage SQL

Définition des contraintes référentielles (clés étrang`eres) • Création de vues • Suppression d'objets (tables vues attributs domaines etc ) 2016-2017



53 Contraintes

Pour cela SQL permet de définir des contraintes sur les colonnes et les tables Les contraintes donnent autant de contrôle sur les données des tables qu'un 



[PDF] Bases de Données - Master Informatique 1 - LIPN

Une contrainte est un objet SQL qui aide à définir l'ensemble de valeurs valides de Les contrainte de domaine ne sont vérifiées que quand une valeur de



[PDF] Cours n°6 SQL : Langage de définition des données (LDD)

Il s 'agit de contraintes non directement rattachées à une table Elles sont utilisées pour spécifier une contrainte portant sur plusieurs tables Exemple :



[PDF] Bases de données - Irif

SQL DDL DML et contraintes d'intégrité un tuple fournit à chaque attribut une valeur de son domaine Spécifier des contraintes NOT NULL en SQL :



[PDF] contraintes dintégrité en sql

Classes de contraintes ? Contraintes structurelles (rappel) ? Domaine Une nouvelle contrainte est rejetée si elle n'est pas en accord avec les

  • Quelles sont les contraintes SQL ?

    Les contraintes sont des règles que le Moteur de base de données SQL Server applique pour vous. par exemple, vous pouvez utiliser des contraintes UNIQUE pour garantir qu'aucune valeur en double n'est entrée dans des colonnes spécifiques ne faisant pas partie d'une clé primaire.
  • Qu'est-ce qu'une contrainte de domaine ?

    Comment se présente ces contraintes ? Les contraintes d'intégrité sont des règles qui édictent les propriétés que doivent respecter les champs de la base de données (les champs correspondent aux attributs du modèle relationnel) afin de garantir leur cohérence, leur pertinence et leur validité.
  • Comment faire une contrainte en SQL ?

    Pour créer une contrainte PRIMARY KEY sur la colonne "Id" alors que la table Employes existe déjà, utilisez la syntaxe SQL suivante : ALTER TABLE Employes ADD PRIMARY KEY (ID); Attention
  • Les assertions sont des contraintes qui peuvent porter sur plusieurs tables. Assertions – Les assertions décrivent des contraintes qui doivent être satisfaites par la base à tout moment. L'action peut faire référence à l'ancienne et/ou à la nouvelle valeur des tuples insérés/ supprimés/modifiés par l'action.
La gestion des contraintes Hiver 2011 C. Desrosiers

Département de génie logiciel et des TI

LOG660 - Bases de données de haute performance

La gestion des contraintes

Hiver 2011

C. Desrosiers

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 2

Gestion des contraintes d'intégrité en SQL

 Contrainte d'intégrité statique - respectée pour chacun des états de la BD - mécanismes déclaratifs  PRIMARY KEY, UNIQUE, NOT NULL, DOMAIN, FOREIGN KEY, CHECK,

ASSERTION

- procédural  TRIGGER (SQL:1999)  Contrainte d'intégrité dynamique

- contrainte sur changements d'états - référence aux états successifs - TRIGGER, REFERENCES ON DELETE..., ON UPDATE ...

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 3

Contrainte de domaine

 Types SQL - INTEGER - CHAR - ...  NOT NULL  CHECK  CREATE DOMAIN Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 4

Contrainte NOT NULL

 Par défaut : NULL

CREATE TABLE Client

(noCLIENT INTEGER NOT NULL, nomClient VARCHAR(15) NOT NULL, noTéléphone VARCHAR(15) NOT NULL Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 5

Contrainte CHECK sur une colonne  Le noClient est supérieur à 0 et inférieur à 100,000

CREATE TABLE Client

(noCLIENT INTEGER NOT NULL

CHECK(noClient >0 AND noClient < 100000),

nomClient VARCHAR(15) NOT NULL, noTéléphone VARCHAR(15) NOT NULL

CREATE TABLE Client

(noCLIENT INTEGER NOT NULL, nomClient VARCHAR(15) NOT NULL, noTéléphone VARCHAR(15) NOT NULL,

CHECK(noClient >0 AND noClient < 100000)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 6 Contrainte d'intégrité référentielle (FOREIGN KEY REFERENCES)

 Le noClient de la table Commande fait référence à la clé primaire noClient de la table Client

 La table Client doit d 'abord être créée - privilège REFERENCES sur Client  PRIMARY KEY ou UNIQUE

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client(noClient) Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 7

Politique de gestion de la contrainte d'intégrité référentielle  Tentative de mise à jour de la clé primaire

 Options - NO ACTION - CASCADE - SET NULL - SET DEFAULT

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client(noClient)

DELETE FROM Client WHERE noClient = 10

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 8

Politique NO ACTION

 Rejet d 'une violation de la contrainte  Clause de défaut

Table Commande

noCommandedateCommandenoClient

101/06/200010

202/06/200020

302/06/200010

405/07/200010

509/07/200030

609/07/200020

715/07/200040

815/07/200040

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client

ON DELETE NO ACTION

DELETE FROM Client WHERE noClient = 10 {Opération rejetée}DELETE FROM Client WHERE noClient = 70 {Opération acceptée}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 9

Cas du UPDATE

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client

ON UPDATE NO ACTION

Table Commande

noCommandedateCommandenoClient

101/06/200010

202/06/200020

302/06/200010

405/07/200010

509/07/200030

609/07/200020

715/07/200040

815/07/200040

UPDATE Client

SET noClient = 100 WHERE noCLient = 10 {Opération rejetée} Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 10

Politique CASCADE

 Modification en cascade

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client

ON DELETE CASCADE

DELETE FROM Client WHERE noClient = 10

{Opération acceptée temporairement}

DELETE FROM Commande WHERE noClient = 10

{Opération déclenchée automatiquement} Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 11

ON UPDATE CASCADE

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client

ON UPDATE CASCADE

UPDATE Client

SET noClient = 100 WHERE noCLient = 10

{Opération acceptée temporairement}

UPDATE Commande

SET noClient = 100 WHERE noCLient = 10

{Opération déclenchée automatiquement} Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 12

Politiques SET NULL et SET DEFAULT

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERNOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client

ON DELETE SET NULL

DELETE FROM Client WHERE noClient = 10

{Opération acceptée temporairement}

UPDATE Commande

SET noClient = NULL WHERE noCLient = 10

{Opération déclenchée automatiquement} Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 13

SET DEFAULT

CREATE TABLE Commande

(noCommande INTEGER NOT NULL, dateCommandeDATENOT NULL, noClientINTEGERDEFAULT 50 NOT NULL,

PRIMARY KEY (noCommande),

FOREIGN KEY (noClient) REFERENCES Client

ON DELETE SET DEFAULT

DELETE FROM Client WHERE noClient = 10

{Opération acceptée temporairement}

UPDATE Commande

SET noClient = 50 WHERE noCLient = 10

{Opération déclenchée automatiquement} Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 14

Oracle

 Défaut - ON DELETE NO ACTION - ON UPDATE NO ACTION  Supporte aussi - ON DELETE CASCADE - ON DELETE SET NULL (version 8i) Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 15

Autres contraintes

 CHECK au delà d 'une colonne  ASSERTION générale Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 16

CHECK intra-ligne

 Plusieurs colonnes de la même ligne  Les Articles dont le noArticle est supérieur à 90 ont un prix supérieur à $15.00

CREATE TABLE Article

(noArticle INTEGERNOT NULL, description VARCHAR(20), prixUnitaire DECIMAL(10,2)NOT NULL, quantitéEnStockINTEGERNOT NULL DEFAULT 0,

PRIMARY KEY (noArticle),

CHECK (noArticle <=90 OR prixUnitaire > 15.0)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 17 Check inter-ligne d'une même table  Concerne plusieurs lignes  Le prixUnitaire d'un Article ne peut dépasser le prix moyen de plus de $40.00

 Vérifié uniquement pour la ligne touchée :la contrainte peut être violée !  Pas supporté par Oracle

CREATE TABLE Article

(noArticle INTEGERNOT NULL, description VARCHAR(20), prixUnitaire DECIMAL(10,2)NOT NULL, quantitéEnStockINTEGERNOT NULL DEFAULT 0,

PRIMARY KEY (noArticle),

CHECK (prixUnitaire-20 <= (SELECT AVG(prixUnitaire)

FROMArticle))

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 18 CHECK inter-tables  Concerne plusieurs tables

 Vérifié uniquement pour la ligne touchée : la contrainte peut être violée !  Pas supporté par Oracle

Prêt

{Clé primaire : idPrêt} idPrêt datePrêt idMembre <>

PrêtArchivé

{Clé primaire: idPrêt} idPrêt dateRetour idExemplaire <
>

CREATE TABLE PrêtArchivé

(idPrêt INTEGER NOT NULL, dateRetour DATENOT NULL, idExemplaire INTEGERNOT NULL,

PRIMARY KEY (idPrêt),

FOREIGN KEY (idPrêt) REFERENCES Prêt,

CHECK (dateRetour >=

SELECTdatePrêt

FROM Prêt

WHEREPrêt.idPrêt = PrêtArchivé.idPrêt) Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 19

Nom de contrainte (clause CONSTRAINT)

 DROP CONSTRAINT contNoClient  SET CONSTRAINT contNoClient ...  Identification de la contrainte qui est violée à

l 'exécution

CREATE TABLE Client

(noCLIENT INTEGER NOT NULL, nomClient VARCHAR(15) NOT NULL, noTéléphone VARCHAR(15) NOT NULL, CONSTRAINT contNoClient CHECK(noClient >0 AND noClient < 100000) Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 20

Gâchettes (TRIGGER)

 Procédure

- déclenchée par événement pré-déterminé (INSERT, DELETE, UPDATE) - exécutée au niveau serveur de BD

 BD active  Utilité - maintien de contraintes d 'intégrité

 statique  dynamique  alternative aux mécanismes déclaratifs (CHECK, ASSERTION, ...)

- préférer mécanisme déclaratif - maintien d 'éléments dérivés  colonnes dérivées  copies dans BD répartie  ... - historique des mises à jour  AUDIT - sécurité Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 21

Lorsqu'une augmentation du prixUnitaire d'un Article est tentée, il faut limiter l'augmentation à 10% du prix en cours

CREATE TRIGGER BUArticleBornerAugmentationPrix

BEFORE UPDATE OF prixUnitaire ON Article

REFERENCING

OLD ROW AS ligneAvant

NEW ROW AS ligneAprès

FOR EACH ROW

WHEN (ligneAprès.prixUnitaire > ligneAvant.prixUnitaire*1.1) BEGIN ligneAprès.prixUnitaire = ligneAvant.prixUnitaire*1.1; END

UPDATE Article

SETprixUnitaire = 15.99

WHEREnoArticle = 10

10Cèdre en boule10.99

noArticledescriptionprixUnitaire ligneAvant

10Cèdre en boule15.99ligneAprès10Cèdre en boule12.09ligneAprès

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 22 Utilisation d'un TRIGGER pour le maintien d'une contrainte d'intégrité dynamique  Empêcher une augmentation du prixUnitaire d'un Article au delà de 10% du prix en cours  Oracle - RAISE_APPLICATION_ERROR CREATE TRIGGER BUArticleEmpêcherAugmentationPrixTropElevée

BEFORE UPDATE OF prixUnitaire ON Article

REFERENCING

OLD ROW AS ligneAvant

NEW ROW AS ligneAprès

FOR EACH ROW

WHEN (ligneAprès.prixUnitaire > ligneAvant.prixUnitaire*1.1) BEGIN souleverUneException; END Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 23 Utilisation d'un TRIGGER pour le maintien d'une contrainte d'intégrité statique  0 < noClient < 100000  N.B. CHECK est préférable !

CREATE TRIGGER BIUClientVérifierNoClient

BEFORE INSERT OR UPDATE OF noClient ON Client

REFERENCING

NEW ROW AS ligneAprès

FOR EACH ROW

WHEN (ligneAprès.noClient <=0) OR

(ligneAprès.noClient > 100000) BEGIN souleverUneException; END Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 24

Étude de cas  Lors d'une nouvelle livraison, la quantité à livrer ne peut dépasser la quantité en stock disponible

CREATE TRIGGER BIDétLivVérifierQuantitéEnStock

BEFORE INSERT ON DétailLivraison

REFERENCING

NEW ROW AS ligneAprès

FOR EACH ROW

WHEN ligneAprès.quantitéLivrée >

(SELECT quantitéEnStock

FROMArticle

WHERE noArticle = ligneAprès.noArticle)

BEGIN souleverUneException; END Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 25

CHECK SQL2 inadéquat

CREATE TABLE DétailLivraison

(noLivraison INTEGER NOT NULL, noCommande INTEGERNOT NULL, noArticle INTEGERNOT NULL, quantitéLivréeINTEGERNOT NULL,

PRIMARY KEY (noLivraison,noCommande, noArticle),

FOREIGN KEY (noLivraison) REFERENCES Livraison(noLivraison),

FOREIGN KEY (noCommande, noArticle) REFERENCES

LigneCommande(noCommande, noArticle),

CHECK (0 <=

FROM Article

WHEREnoArticle = DétailLivraison.noArticle)

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 26 Ne permettre que la modification de la quantitéLivrée dans la table DétailLiraison

CREATE TRIGGER BUDétLivEmpêcherModif

BEFORE UPDATE OF noLivraison, noCommande, noArticle

ON DétailLivraison

BEGIN souleverUneException; END Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 27

Ajuster la quantitéEnStock

CREATE TRIGGER AIDétLivAjusterQuantitéEnStock

AFTER INSERT ON DétailLivraison

REFERENCING

NEW ROW AS ligneAprès

FOR EACH ROW

BEGIN

UPDATE Article

SET quantitéEnStock = quantitéEnStock -

ligneAprès.quantitéLivrée

WHERE noArticle = ligneAprès.noArticle;

END CREATE TRIGGER AUDétLivAjusterQuantitéEnStock AFTER UPDATE OF quantitéLivrée ON DétailLivraison

REFERENCING

OLD ROW AS ligneAvant

NEW ROW AS ligneAprès

FOR EACH ROW

BEGIN

UPDATE Article

SET quantitéEnStock = quantitéEnStock -

WHERE noArticle = ligneAvant.noArticle;

END Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 28

TRIGGER de niveau STATEMENT

 Exécution du corps une seule fois pour plusieurs lignes mises à jours dans le même énoncé

CREATE TRIGGER BUDétLivEmpêcherModif

BEFORE UPDATE OF noLivraison, noCommande, noArticle

ON DétailLivraison

BEGIN souleverUneException; END

REFERENCING

OLD TABLE AS nomAvant

NEW TABLE AS nomAprès

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 29

Exécuter les TRIGGER BEFORE STATEMENT

Pour chaque ligne touchée par l'opération

Exécuter les TRIGGER BEFORE ROW

Exécuter l'opération

Exécuter les TRIGGER AFTER ROW

Fin pour

Exécuter les TRIGGER AFTER STATEMENT

Ordre d'exécution des TRIGGER

 Attention aux circularités ! Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 30

Limites des TRIGGER

 Ne peuvent être DEFERRED  Complexes à coder  Contraintes particulières aux dialectes Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 31

Particularités des TRIGGER Oracle

 Pas de SELECT dans le WHEN

 :NEW, :OLD  Omettre le mot-clé ROW dans REFERENCING  Corps en PL/SQL (voir chapitre 4).  Syntaxe :nomColonne  Pas de COMMIT/ROLLBACK dans un TRIGGER

- procédure PL/SQL RAISE_APPLICATION_ERROR  Intervalle [-20000, -20999] pour code d'erreur  IF INSERTING, DELETING, UPDATING.  Événements non standards - INSTEAD OF, STARTUP, LOGON, ...

 Problème avec table en mutation (modifiée par l'événement déclencheur)  etc.

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 32

Problème des tables en mutation

CREATE TABLE Statistiques (idStat INTEGER NOT NULL, nombreClients INTEGER NOT NULL, PRIMARY KEY (idStat)) CREATE TRIGGER AIMettreAJourNbClients After INSERT ON Client FOR EACH ROW DECLARE total INTEGER; BEGIN SELECT COUNT(*) INTO total FROM Client ; UPDATE Statistiques SET nombreClients = total WHERE idStat = ID_STAT_NB_CLIENTS; END SQL> INSERT INTO Client VALUES (...) {Exception : Table Client en mutation}

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 33

Problème des tables en mutation

 Solution 1: AUTONOMOUS_TRANSACTION!

! Considère la transaction comme indépendante  La mise-à-jour peut être erronée car la nouvelle insertion n'est

pas considérée

CREATE TRIGGER AIMettreAJourNbClients After INSERT ON Client FOR EACH ROW DECLARE PRAGMA AUTONOMOUS_TRANSACTION; total INTEGER; BEGIN SELECT COUNT(*) INTO total FROM Client; UPDATE Statistiques SET nombreClients = total WHERE idStat = ID_STAT_NB_CLIENTS; COMMIT; END

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 34 Problème des tables en mutation  Solution 2: TRIGGER de niveau STATEMENT  On supprime le FOR EACH ROW  La mise à jour est faite une seule fois à la fin

CREATE TRIGGER AIMettreAJourNbClients After INSERT ON Client DECLARE total INTEGER; BEGIN SELECT COUNT(*) INTO total FROM Client; UPDATE Statistiques SET nombreClients = total WHERE idStat = ID_STAT_NB_CLIENTS; END

Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 35 Problème des tables en mutation  Solution 3: Éviter le problème complètement  Meilleure solution  Pas toujours possible

CREATE TRIGGER AIMettreAJourNbClients After INSERT ON Client FOR EACH ROW BEGIN UPDATE Statistiques SET nombreClients = nombreClients+1 WHERE idStat = ID_STAT_NB_CLIENTS; END

quotesdbs_dbs29.pdfusesText_35






PDF Download Next PDF