Database Reference
In-Depth Information
Contraintes multitables (assertions)
Dans le cas de la modélisation des héritages, les contraintes à poser portent souvent sur
plusieurs tables. Rien n'empêche une contrainte SQL de table de s'intéresser aux données
présentes dans d'autres tables… sauf certains éditeurs de SGBDR !
En effet, Oracle s'interdit toutes contraintes de table portant sur une autre table et il n'y
a aucune échappatoire possible, pareil pour MySQL… En revanche, pour PostGreSQL,
comme pour MS SQL Server, même s'ils n'acceptent pas de référencer directement une
autre table dans une contrainte de validation CHECK , il est possible de biaiser en créant
une fonction utilisateur (ou UDF pour User Deined Function) qui lit une autre table ain
de fournir l'information nécessaire à la contrainte.
En plus des contraintes classiques, la norme SQL décrit les assertions de portée multi-
base. Pour une raison défendable, la plupart des éditeurs de SGBDR ont préféré ne pas
implémenter les assertions leur préférant les déclencheurs (triggers en anglais). On reste
cependant confondus devant les simplicités d'expression d'une assertion face à l'alterna-
tive CHECK UDF ou trigger.
Voici un exemple d'assertion pour assurer l'exclusion mutuelle dans le cas d'un héritage
entre les personnes physiques et les personnes morales :
CREATE ASSERTION a_exclure_personne AS
CHECK NOT EXISTS(SELECT *
FROM t_personne_physique AS pp
INNER JOIN t_personne_morale AS pm
ON pp.prs_id = pm.prs_id);
Pour exprimer la même chose sous forme de déclencheurs, il faut beaucoup plus de code.
Quant à la version avec UDF, en voici un exemple, toujours sous MS SQL Server :
CREATE FUNCTION f_check_exclure_personne (@prs_id INT)
RETURNS BIT AS
BEGIN
RETURN CASE WHEN EXISTS(SELECT …
FROM t_personne_physique AS pp
INNER JOIN t_personne_morale AS pm
ON pp.prs_id = pm.prs_id
WHERE pp.prs_id = @prs_id)
THEN 1
ELSE 0
END;
END;
ALTER TABLE t_personne_physique
ADD CONSTRAINT ck_exclure_personne_pp
CHECK(f_check_exclure_personne (prs_id) = 0);
ALTER TABLE t_personne_morale
ADD CONSTRAINT ck_exclure_personne_pm
CHECK(f_check_exclure_personne (prs_id) = 0);
 
Search WWH ::




Custom Search