Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de conception (contraintes en cascades)

4 réponses
Avatar
Gilles TOURREAU
Salut tout le monde !

J'ai un problème de conception au niveau de ma base de données :

J'ai :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdSociété, NuméroFacture) (PK = IdSociété, NuméroFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdSociétéFacture,
NuméroFacture) (PK = IdSociété, NuméroBonLivraison

J'ai ajouté une contraite de clé étrangère en CASCADE pour UPDATE et
DELETE :

Société <----> Facture (FK : IdSociété)
Société <----> BonLivraison (FK : IdSociété)

Jusqu'à la pas de problème...

Maintenant je souhaite rajouter un autre contraite de clé étrangère en
CASCADE pour UPDATE et DELETE :

Facture <-----> BonLivraison (FK : IdSociétéFacture, NuméroFacture)

et là je peux pas car SQL Serveur me dis que je risque d'avoir un cylce
au niveau de contrainte...
Je suis suis tout à fait avec çà, mais comment puis-je y remédier ?

En vous remerciant par avance de vos lumières

Cordialement

--
Gilles TOURREAU
Responsable informatique
gilles.tourreau@pos.fr

Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr

4 réponses

Avatar
Sylvain Lafontaine
Si les bons de livraison sont associées aux factures et les factures aux
sociétés, je ne vois pas pourquoi vous devez associer les bons de livraisons
aux sociétés.

Si vous avez besoin de conserver cette relation à cause d'un problème de
vitesse, alors vous n'avez qu'à la créer mais sans effet de cascade.

Finalement, comme SQL-Server ne supporte pas les relations en cascade
cycliques; il vous sera impossible de décrire toutes les relations en
cascades nécessaires lorsque votre désign deviendra vraiment compliqué. Il
ne vous restera plus alors qu'à gérer vous-mêmes la destruction des objets;
en n'enbliant pas d'englober le tout dans des transactions.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Gilles TOURREAU" wrote in message
news:
Salut tout le monde !

J'ai un problème de conception au niveau de ma base de données :

J'ai :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdSociété, NuméroFacture) (PK = IdSociété, NuméroFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdSociétéFacture,
NuméroFacture) (PK = IdSociété, NuméroBonLivraison

J'ai ajouté une contraite de clé étrangère en CASCADE pour UPDATE et
DELETE :

Société <----> Facture (FK : IdSociété)
Société <----> BonLivraison (FK : IdSociété)

Jusqu'à la pas de problème...

Maintenant je souhaite rajouter un autre contraite de clé étrangère en
CASCADE pour UPDATE et DELETE :

Facture <-----> BonLivraison (FK : IdSociétéFacture, NuméroFacture)

et là je peux pas car SQL Serveur me dis que je risque d'avoir un cylce au
niveau de contrainte...
Je suis suis tout à fait avec çà, mais comment puis-je y remédier ?

En vous remerciant par avance de vos lumières

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr




Avatar
Sylvain Lafontaine
Je viens tout juste de remarquer que vous utilisiez les valeurs de IdSociété
comme partie intégrante de clef primaire des tables Factures et
BonsLivraison. À mon humble avis, oubliez cette méthode et utilisez plutôt
des valeurs indépendantes IdFacture et IdBonLivraison comme clefs primaires
et n'utilisez les valeurs de IdSociété et de NuméroFacture que comme clefs
secondaires (ou clef étrangère) et champs de table.

Depuis que j'ai abandonné l'utilisation des clefs doubles et des clefs
naturelles pour ne conserver que l'utilisation des clefs subrogées
(IdSociété, IdFacture, IdBonLivraison, etc.), les trois quarts de mes
problèmes de bases de données ont disparu.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Gilles TOURREAU" wrote in message
news:
Salut tout le monde !

J'ai un problème de conception au niveau de ma base de données :

J'ai :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdSociété, NuméroFacture) (PK = IdSociété, NuméroFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdSociétéFacture,
NuméroFacture) (PK = IdSociété, NuméroBonLivraison

J'ai ajouté une contraite de clé étrangère en CASCADE pour UPDATE et
DELETE :

Société <----> Facture (FK : IdSociété)
Société <----> BonLivraison (FK : IdSociété)

Jusqu'à la pas de problème...

Maintenant je souhaite rajouter un autre contraite de clé étrangère en
CASCADE pour UPDATE et DELETE :

Facture <-----> BonLivraison (FK : IdSociétéFacture, NuméroFacture)

et là je peux pas car SQL Serveur me dis que je risque d'avoir un cylce au
niveau de contrainte...
Je suis suis tout à fait avec çà, mais comment puis-je y remédier ?

En vous remerciant par avance de vos lumières

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr




Avatar
Gilles TOURREAU
Sylvain Lafontaine a pensé très fort :
Si les bons de livraison sont associées aux factures et les factures aux
sociétés, je ne vois pas pourquoi vous devez associer les bons de livraisons
aux sociétés.

Si vous avez besoin de conserver cette relation à cause d'un problème de
vitesse, alors vous n'avez qu'à la créer mais sans effet de cascade.

Finalement, comme SQL-Server ne supporte pas les relations en cascade
cycliques; il vous sera impossible de décrire toutes les relations en
cascades nécessaires lorsque votre désign deviendra vraiment compliqué. Il
ne vous restera plus alors qu'à gérer vous-mêmes la destruction des objets;
en n'enbliant pas d'englober le tout dans des transactions.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Gilles TOURREAU" wrote in message
news:
Salut tout le monde !

J'ai un problème de conception au niveau de ma base de données :

J'ai :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdSociété, NuméroFacture) (PK = IdSociété, NuméroFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdSociétéFacture,
NuméroFacture) (PK = IdSociété, NuméroBonLivraison

J'ai ajouté une contraite de clé étrangère en CASCADE pour UPDATE et DELETE
:

Société <----> Facture (FK : IdSociété)
Société <----> BonLivraison (FK : IdSociété)

Jusqu'à la pas de problème...

Maintenant je souhaite rajouter un autre contraite de clé étrangère en
CASCADE pour UPDATE et DELETE :

Facture <-----> BonLivraison (FK : IdSociétéFacture, NuméroFacture)

et là je peux pas car SQL Serveur me dis que je risque d'avoir un cylce au
niveau de contrainte...
Je suis suis tout à fait avec çà, mais comment puis-je y remédier ?

En vous remerciant par avance de vos lumières

Cordialement

-- Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr







J'ai mis à la place des identifiants uniques et je me retrouve sur le
même problème :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdFacture, IdSociété, NuméroFacture) (PK = IdFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdFacture) (PK =
IdBonLivraison)

Facture <-----> BonLivraison (FK : IdFacture)

En fait il se peut que des bons de livraison n'ont pas de factures...

J'ai fait une petite faute dans mon précedent post :
La contrainte Facture <-----> BonLivraison doit être UPDATE CASCADE et
DELETE SET NULL

Je voudrais mettre en place ces contraintes pour que je puisse :

- effacer toutes les factures et bon de livraison si on supprime une
société
- si on efface une facture SQL Server doit mettre à jour (à NULL) les
identifiant IdFacture dans les bons de livraisons.

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Sylvain Lafontaine
Tel que mentionné dans mon message précédent, SQL-Server ne supporte pas les
cascades cycliques; contrairement à Oracle. Ce genre de chose ne peut donc
s'appliquer qu'aux cas simples et dans les autres cas, vous devez vous
occuper vous-mêmes de la destruction des objets associés.

En utilisant les triggers, vous pouvez vous amuser à étendre les
possibilités mais même là, lorsque le schéma devient encore plus compliqué,
il devient impossible de s'en sortir de cette façon.

De plus, l'utilisation de ce genre de chose peut même s'avérer très néfaste
car si vous voulez effacer une client, il vaut peut-être mieux recevoir un
message d'erreur comme quoi vous ne pouvez pas l'effacer parce qu'il reste
encore des objets associés comme une facture impayée que de tout effacer en
vrac.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Gilles TOURREAU" wrote in message
news:
Sylvain Lafontaine a pensé très fort :
Si les bons de livraison sont associées aux factures et les factures aux
sociétés, je ne vois pas pourquoi vous devez associer les bons de
livraisons aux sociétés.

Si vous avez besoin de conserver cette relation à cause d'un problème de
vitesse, alors vous n'avez qu'à la créer mais sans effet de cascade.

Finalement, comme SQL-Server ne supporte pas les relations en cascade
cycliques; il vous sera impossible de décrire toutes les relations en
cascades nécessaires lorsque votre désign deviendra vraiment compliqué.
Il ne vous restera plus alors qu'à gérer vous-mêmes la destruction des
objets; en n'enbliant pas d'englober le tout dans des transactions.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Gilles TOURREAU" wrote in message
news:
Salut tout le monde !

J'ai un problème de conception au niveau de ma base de données :

J'ai :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdSociété, NuméroFacture) (PK = IdSociété, NuméroFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdSociétéFacture,
NuméroFacture) (PK = IdSociété, NuméroBonLivraison

J'ai ajouté une contraite de clé étrangère en CASCADE pour UPDATE et
DELETE :

Société <----> Facture (FK : IdSociété)
Société <----> BonLivraison (FK : IdSociété)

Jusqu'à la pas de problème...

Maintenant je souhaite rajouter un autre contraite de clé étrangère en
CASCADE pour UPDATE et DELETE :

Facture <-----> BonLivraison (FK : IdSociétéFacture, NuméroFacture)

et là je peux pas car SQL Serveur me dis que je risque d'avoir un cylce
au niveau de contrainte...
Je suis suis tout à fait avec çà, mais comment puis-je y remédier ?

En vous remerciant par avance de vos lumières

Cordialement

-- Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr







J'ai mis à la place des identifiants uniques et je me retrouve sur le
même problème :

Société(IdSociété, Nom) (PK = IdSociété)
Facture(IdFacture, IdSociété, NuméroFacture) (PK = IdFacture)
BonLivraison(IdSociété, NuméroBonLivraison, IdFacture) (PK =
IdBonLivraison)

Facture <-----> BonLivraison (FK : IdFacture)

En fait il se peut que des bons de livraison n'ont pas de factures...

J'ai fait une petite faute dans mon précedent post :
La contrainte Facture <-----> BonLivraison doit être UPDATE CASCADE et
DELETE SET NULL

Je voudrais mettre en place ces contraintes pour que je puisse :

- effacer toutes les factures et bon de livraison si on supprime une
société
- si on efface une facture SQL Server doit mettre à jour (à NULL) les
identifiant IdFacture dans les bons de livraisons.

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr