Contraintes CHECK sur tables externe avec PostGreSQL

Suite à un post sur la soit-disante impossibilité de créer, dans PostGreSQL, une contraintes CHECK vérifiant des données externes à la table dans laquelle elle était placée, je me suis fait un malin plaisir de démontrer le contraire…

Voici un exemple de contrainte CHECK sous PostGreSQL vérifiant depuis une tables des conditions avec des données d’une autre table… Il s’agit d’empêcher par une contrainte que la remise sur la facture ne dépasse pas la remise maximale prévue pour le client… Bien entendue la remise maximale possible figure dans la table des clients, tandis que celle accordée à chaque facture se trouve… dans la table des factures !

Tables pour l’exemple : clients et factures :


CREATE TABLE T_CLIENT_CLI
(CLI_ID          INT NOT NULL PRIMARY KEY,
 CLI_NOM         VARCHAR(32) NOT NULL,
 CLI_REMISE_MAX  FLOAT NOT NULL DEFAULT 0 CHECK (CLI_REMISE_MAX BETWEEN 0.00 AND 100.00));
 
CREATE TABLE T_FACTURE_FCT
(FCT_ID          INT NOT NULL PRIMARY KEY,
 CLI_ID          INT NOT NULL,
 FCT_DATE        DATE NOT NULL DEFAULT CURRENT_DATE,
 FCT_REMISE      FLOAT NOT NULL DEFAULT 0 CHECK (FCT_REMISE BETWEEN 0.00 AND 100.00),
 CONSTRAINT FK FOREIGN KEY (CLI_ID) REFERENCES T_CLIENT_CLI (CLI_ID));

Création d’une fonction de vérification (UDF) :


CREATE OR REPLACE FUNCTION F_CHECK_MAX_REMISE (client_id int, remise float)
RETURNS BOOLEAN AS
$$
SELECT CASE  
          WHEN CLI_REMISE_MAX < $2 THEN false
          ELSE true
        END  
FROM T_CLIENT_CLI WHERE CLI_ID = $1;
$$ LANGUAGE 'sql';

Ajout de la contrainte dans la table des factures, à l’aide de la fonction de vérification :


ALTER TABLE T_FACTURE_FCT
   ADD CONSTRAINT K CHECK (F_CHECK_MAX_REMISE (CLI_ID, FCT_REMISE));

insertion d’une client test :
INSERT INTO T_CLIENT_CLI VALUES (1, 'DUPONT', 15);

Insertion d’une « bonne » facture :
INSERT INTO T_FACTURE_FCT VALUES (101, 1, '2011-04-15', 12.0)

Insertion d’une « mauvaise » facture :
INSERT INTO T_FACTURE_FCT VALUES (102, 1, '2011-04-15', 35.0)

Et réponse du serveur…
Message d’erreur :
Citation:
ERREUR: la nouvelle ligne viole la contrainte de vérification « t_facture_fct » de la relation « k »
********** Erreur **********
ERREUR: la nouvelle ligne viole la contrainte de vérification « t_facture_fct » de la relation « k »
État SQL :23514

CQFD !

Pour information….

Ceci figure dans mes bouquins sur SQL depuis la deuxième édition (2008)…


--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire