Envoyé par
heretik25
Peut-on être en mesure de supprimer ou pas toutes les contributions d'un utilisateur si l'utilisateur est supprimé. Peut-on donner le choix ?
Je comprends ceci, en espérant ne pas être à côté de la plaque :
— 1er cas : quand on supprime l’utilisateur Louis les articles qu’il a rédigés doivent aussi disparaître.
— 2e cas : quand on supprime l’utilisateur Louis, on conserve les articles qu’il a rédigés.
Si c’est bien ce que vous voulez, alors le choix est possible, mais à condition de faire évoluer la modélisation comme ci-dessous :
Diagramme conceptuel
Diagramme logique
Si on veut supprimer l’utilisateur Louis ainsi que ses articles, la suppression devra se faire en deux temps :
1) Supprimer ses articles,
2) Supprimer l’utilisateur.
Si l’on veut supprimer seulement l’utilisateur, on se contente d’effectuer la 2e opération, (les stimuli à destination de la table ARTICLE_UTIL ne se propagent pas jusqu’à la table ARTICLE).
Pour être sûr de ne rien oublier au cas où l’on supprime l’utilisateur plus ses articles, on peut prévoir une procédure stockée prenant en compte les deux possibilités (variable @UtilisateurId prenant par exemple la valeur ‘tout' ou quelque chose de différent de ‘tout'). Dans le style de SQL Server :
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE PROCEDURE SUPPRIMER_UTILISATEUR
@UtilisateurId INT
, @ArticleAussi CHAR(4)
AS
IF @ArticleAussi = 'tout'
BEGIN
DELETE FROM ARTICLE
WHERE Id_article IN (SELECT Id_article
FROM ARTICLE_UTIL
WHERE Id_utilisateur = @UtilisateurId) ;
END
DELETE FROM UTILISATEUR
WHERE Id_utilisateur = @UtilisateurId ; |
Pour supprimer l’utilisateur Louis d’identifiant 2718, ainsi que ses articles :
EXECUTE SUPPRIMER_UTILISATEUR 2718, 'tout' ;
Pour supprimer Louis sans supprimer ses articles :
EXECUTE SUPPRIMER_UTILISATEUR 2718, 'xxxx' ;
A cette occasion on peut revenir sur la nouvelle structure concernant les fichiers GPS. En effet, j’ai précédemment parlé là aussi de procéder en deux temps :
Envoyé par
fsmrel
Si donc, quand on supprime un article, disons de clé Id_article = 314, il faut que soit aussi supprimé le fichier GPS qui le référence, alors il faudra procéder en deux temps :
1 2 3 4 5 6 7
|
DELETE FROM FICHIER_GPS
WHERE Id_Fichier_Gps = (SELECT Id_Fichier_Gps
FROM FICHIER_GPS_AVEC_ARTICLE
WHERE Id_article = 314) ;
DELETE FROM ARTICLE
WHERE Id_article = 314 ; |
Regardons maintenant la nouvelle organisation des relations entre utilisateurs et articles, augmentée de l’organisation des fichiers GPS :
Pour automatiser la suppression de leurs fichiers GPS quand on supprime des utilisateurs, et/ou leurs articles, on peut enrichir la procédure stockée et supprimer aussi les fichiers GPS rattachés aux utilisateurs :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| CREATE PROCEDURE SUPPRIMER_UTILISATEUR
@UtilisateurId INT
, @ArticleAussi CHAR(4)
AS
IF @ArticleAussi = 'tout'
BEGIN
DELETE FROM ARTICLE
WHERE Id_article IN (SELECT Id_article
FROM ARTICLE_UTIL
WHERE Id_utilisateur = @UtilisateurId) ;
END
DELETE FROM FICHIER_GPS
WHERE Id_Fichier_Gps IN (SELECT Id_Fichier_Gps
FROM FICHIER_GPS_SANS_ART
WHERE Id_utilisateur = @UtilisateurId) ;
DELETE FROM UTILISATEUR
WHERE Id_utilisateur = @UtilisateurId ; |
En ce qui concerne les suppressions d’articles, on peut utiliser le trigger suivant (SQL Server) qui intercepte les DELETE FROM ARTICLE et complète avec la suppression des fichiers GPS :
1 2 3 4 5 6 7 8
| CREATE TRIGGER ARTICLE_TRIGGER_DELETE ON ARTICLE INSTEAD OF DELETE AS
DELETE FROM FICHIER_GPS
WHERE Id_Fichier_Gps IN (SELECT Id_Fichier_Gps
FROM FICHIER_GPS_AVEC_ART AS x JOIN DELETED AS y
ON x.Id_article = y.Id_article) ;
DELETE FROM ARTICLE
WHERE Id_article IN (SELECT Id_article
FROM DELETED) |
Partager