Bonjour,
Sur la base des structures suivantes :
ENTREPRISE (EntrepriseId, EntrepriseNom) ;
ADRESSE (EntrepriseId, AdresseId, CodePostal, Ville) ;
En passant par une vue, on pourrait imposer que la 1re adresse d’une entreprise soit créée en même temps que celle-ci :
1 2 3 4 5 6 7
| CREATE VIEW ENTREPRISE_V (EntrepriseId, EntrepriseNom
, AdresseId, CodePostal, Ville
)
AS SELECT x.EntrepriseId, x.EntrepriseNom
, y.AdresseId, y.CodePostal, y.Ville
FROM ENTREPRISE AS x JOIN ADRESSE AS y
ON x.EntrepriseId = y.EntrepriseId ; |
Instruction INSERT correspondante (création de l’entreprise Yadupour) :
INSERT INTO ENTREPRISE_V VALUES (1, 'Yadupour', 1, '90000', 'Belfort') ;
Pour les autres adresses de l’entreprise Yadupour :
1 2
| INSERT INTO ADRESSE VALUES (1, 2, '75001', 'Paris') ;
... |
Maintenant, soit le SGBD accepte les mises à jour des vues de jointure, soit il les refuse. Comme j’utilise SQL Server 2005, c’est niet, je passe donc par un trigger pour intercepter les inserts et effectuer les ventilations qui vont bien :
1 2 3 4 5 6 7
| CREATE TRIGGER ENTREPRISE_V_INSERT ON ENTREPRISE_V INSTEAD OF INSERT AS
INSERT INTO ENTREPRISE (EntrepriseId, EntrepriseNom)
SELECT EntrepriseId, EntrepriseNom
FROM INSERTED
INSERT INTO ADRESSE (EntrepriseId, AdresseId, CodePostal, Ville)
SELECT EntrepriseId, AdresseId, CodePostal, Ville
FROM INSERTED ; |
Par ailleurs, si l’on supprime les adresses de l’entreprise, il faut en conserver au moins une, d’où la mise en œuvre d’un trigger ad-hoc (toujours dans le contexte SQL Server) :
1 2 3 4 5 6 7 8 9 10
| CREATE TRIGGER ADRESSE_DELETE ON ADRESSE AFTER DELETE AS
SELECT ''
FROM ENTREPRISE AS x
JOIN ADRESSE AS y ON x.EntrepriseId = y.EntrepriseId
IF @@rowcount = 0
BEGIN
Raiserror ('entreprise sans adresse après suppression d''adresse(s) !',16,1)
ROLLBACK
RETURN
END |
Tout ceci n'est évidemment qu'une ébauche reposant sur l'idée de l'utilisation d'une vue contraignante. Les cracks de SQL auront peut-être des solutions moins lourdes.
Partager