IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

FK Delete Cascade


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Par défaut FK Delete Cascade
    Bonjour

    J'ai une fiche (basée sur la table TABLE_PERE) avec deux grilles (basée respectivement sur les tables TABLE_FILS1 et TABLE_FILS2)

    Quand une ligne est ajoutée dans TABLE_FILS1, elle alimente la table TABLE_STOCK avec le bon Id_TABLE_FILS1 et en laissant Id_TABLE_FILS2 à NULL
    Quand une ligne est ajoutée dans TABLE_FILS2, elle alimente la table TABLE_STOCK avec le bon Id_TABLE_FILS2 et en laissant Id_TABLE_FILS1 à NULL

    Voici le code des tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    create table TABLE_PERE ( 
    	Id_TABLE_PERE uniqueidentifier,
    	 CONSTRAINT [TABLE_PERE_pk] PRIMARY KEY CLUSTERED 
    	(
    		[Id_TABLE_PERE] ASC
    	) 
    )
    create table TABLE_FILS1 ( 
    	Id_TABLE_PERE uniqueidentifier, 
    	Id_TABLE_FILS1 uniqueidentifier ,
    	 CONSTRAINT [TABLE_FILS1_pk] PRIMARY KEY CLUSTERED 
    	(
    		[Id_TABLE_FILS1] ASC
    	) 
    )
     
    ALTER TABLE dbo.TABLE_FILS1  WITH NOCHECK ADD  CONSTRAINT [FK_TABLE_FILS1_PERE] FOREIGN KEY(Id_TABLE_PERE)
    REFERENCES [dbo].[TABLE_PERE] ([Id_TABLE_PERE])
    ON DELETE CASCADE
    GO
     
    create table TABLE_FILS2 ( 
    	Id_TABLE_PERE uniqueidentifier, 
    	Id_TABLE_FILS2 uniqueidentifier ,
    	 CONSTRAINT [TABLE_FILS2_pk] PRIMARY KEY CLUSTERED 
    	(
    		[Id_TABLE_FILS2] ASC
    	) 
    )
    ALTER TABLE dbo.TABLE_FILS2  WITH NOCHECK ADD  CONSTRAINT [FK_TABLE_FILS2_PERE] FOREIGN KEY(Id_TABLE_PERE)
    REFERENCES [dbo].[TABLE_PERE] ([Id_TABLE_PERE])
    ON DELETE CASCADE
    GO
     
    create table TABLE_STOCK ( 
    	Id_TABLE_STOCK uniqueidentifier,
    	Id_TABLE_PERE uniqueidentifier, 
    	Id_TABLE_FILS1 uniqueidentifier ,
    	Id_TABLE_FILS2 uniqueidentifier ,
    	 CONSTRAINT [TABLE_STOCK_pk] PRIMARY KEY CLUSTERED 
    	(
    		[Id_TABLE_STOCK] ASC
    	) 
    )
    ALTER TABLE dbo.TABLE_STOCK  WITH NOCHECK ADD  CONSTRAINT [FK_TABLE_STOCK_PERE] FOREIGN KEY(Id_TABLE_PERE)
    REFERENCES [dbo].[TABLE_PERE] ([Id_TABLE_PERE])
    GO
    ALTER TABLE dbo.TABLE_STOCK  WITH NOCHECK ADD  CONSTRAINT [FK_TABLE_STOCK_FILS1] FOREIGN KEY(Id_TABLE_FILS1)
    REFERENCES [dbo].[TABLE_FILS1] ([Id_TABLE_FILS1])
    ON DELETE CASCADE
    GO
     
    -- Erreur L'introduction d'une contrainte FOREIGN KEY 'FK_TABLE_STOCK_FILS2' sur la table 'TABLE_STOCK' peut provoquer des cycles ou des accès en cascade multiples. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifiez d'autres contraintes FOREIGN KEY.
    ALTER TABLE dbo.TABLE_STOCK  WITH NOCHECK ADD  CONSTRAINT [FK_TABLE_STOCK_FILS2] FOREIGN KEY(Id_TABLE_FILS2)
    REFERENCES [dbo].[TABLE_FILS2] ([Id_TABLE_FILS2])
    ON DELETE CASCADE
    GO
    Le définition de la dernière clé étrangère pose problème, ce qui se comprend

    La question est donc : A t-on une solution alternative ?

    Merci de votre aide

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    Quelle est l'utilité de la table STOCK ? pourquoi ne pas faire simplement une vue ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Par défaut
    La table STOCK gère les stocks justement dont le contenu peut provenir des tables TABLE_FILS1 et TABLE_FILS2
    Il faut que cela reste une table

    Pour être plus précis dans notre cas, c'est une table qui gère les besoins et disponibilités de Stock
    TABLE_FILS1 alimente les besoins (Colonne Nombre négative)
    TABLE_FILS2 alimente les disponibilités (Colonne Nombre positive)

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 617
    Billets dans le blog
    10
    Par défaut
    Si je comprends bien
    - TABLE_FILS1 est alimentée par chacune des commandes client susceptibles de diminuer le stock
    - TABLE_FILS2 est alimentée par les approvisionnements (fabrication ou livraisons fournisseurs)

    Si c'est bien le cas, TABLE_STOCK est une redondance, deux tables voire même une seul aurait suffit (si TABLE_FILS1 et 2 sont identiques il suffit de signer le montant pour connaitre le solde par calcul)

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Par défaut
    TABLE_STOCK permet surtout d'aggréger les besoins et disponibilités de stock, ce qui évite une perte de temps si l'on devait faire les calculs à chaque fois que l'on veut voir les besoins et disponibilités pour certains articles

    Donc oui, c'est une forme de redondance mais cela reste important pour éviter les verrous sur TABLE_FILS1 et TABLE_FILS2 au moment où l'on cherche à faire un bilan des états de stock + les calculs évités car ils sont fait en amont

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Préférez les vues, éventuellement indexées si besoin pour les performances. Ce sera beaucoup plus simple, fiable et performant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. On Delete Cascade
    Par malbarre dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/07/2006, 11h40
  2. SQL Delete Cascade
    Par mschoum dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/06/2006, 14h18
  3. [SQL 2K5] Pb : ON DELETE CASCADE : référence circulaire
    Par n00bi dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 29/05/2006, 08h48
  4. [SQL2K] delete cascade d'une table sur elle même
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2006, 16h28
  5. Delete cascade --> problème de temps de traitement
    Par celine31 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/01/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo