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 :

Suppression d'un champ d'une table-mère qui est référencée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut Suppression d'un champ d'une table-mère qui est référencée
    Salut!

    Mon cas c'est que j'ai 3 tables, la 3è référence par FK les 2 autres tables avec et sans CASCADE DELETE

    Normal donc si je supprime dans la table-mère liée sans cascade, j'obtiens l'erreur
    Conflit entre l'instruction DELETE et la contrainte COLUMN REFERENCE 'FK_666'. Le conflit est survenu dans la base de données 'SEE_EED_2_41', table 'RIJA_LNK_Wires', column 'IDWire'.
    L'instruction a été arrêtée.
    Voici le code en tout
    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
    CREATE TABLE [dbo].[RIJA_Entity](
    	[ID] [uniqueidentifier] PRIMARY KEY DEFAULT NEWID(),
            [Donnee] nvarchar(50),
    	)ON [PRIMARY]
    GO
     
    CREATE TABLE [dbo].[RIJA_LNK_Wires] (
    	[ID] [uniqueidentifier] PRIMARY KEY DEFAULT NEWID(),
    	[IDWire] [uniqueidentifier] NOT NULL,
    	[IDEquipment] [uniqueidentifier] NOT NULL,
    	) ON [PRIMARY]
    GO
     
    CREATE TABLE [dbo].[RIJA_Wires] (
    	[ID] [uniqueidentifier] PRIMARY KEY DEFAULT NEWID(),
            [Donnee] nvarchar(50),
    	) ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[RIJA_LNK_Wires] WITH NOCHECK ADD 
    	CONSTRAINT [FK_666] FOREIGN KEY ([IDWire])
    	REFERENCES [RIJA_Wires]([ID]) -- ON DELETE CASCADE ON UPDATE CASCADE
    GO
     
    ALTER TABLE [dbo].[RIJA_LNK_Wires] WITH NOCHECK ADD 
    	CONSTRAINT [FK_777] FOREIGN KEY ([IDEquipment])
    	REFERENCES [RIJA_Entity]([ID]) ON DELETE CASCADE ON UPDATE CASCADE
    GO
     
    CREATE TRIGGER [dbo].[RIJA_TR_DELETE_WIRES_ON_DEL_ENTITY] 
    ON [RIJA_LNK_Wires]
    AFTER DELETE
    AS 
    	DELETE FROM [RIJA_Wires] WHERE ID IN (SELECT [IDWire] FROM deleted)
    GO
     
    insert into RIJA_Entity(donnee) values('Entity1')
    insert into RIJA_Entity(donnee) values('Entity2')
     
    insert into RIJA_Wires(donnee) values('WireA')
    insert into RIJA_Wires(donnee) values('WireB')
    -- à remplir à la main en lisant les tables-mères
    --insert into RIJA_LNK_Wires(IDWire,IDEquipment) values('{4D67A994-E42B-4B3C-BD06-B26CB4A11086}','{E8D441F7-6ACB-4CF3-B537-DD074C960193}')
    --insert into RIJA_LNK_Wires(IDWire,IDEquipment) values('{3ABF4812-62ED-40DC-8ECE-A591E17B72AE}','{5404F834-3338-4D08-90CA-04BDA66809FE}')
    Remarquez alors l'unique trigger de la base! Il contient un DELETE sur la table non liée par cascade
    POURQUOI si je supprime dans RIJA_Entity, le trigger se déclenche et exécute ce delete, je n'ai pas l'erreur
    Conflit entre l'instruction DELETE et la contrainte COLUMN REFERENCE 'FK_666'. Le conflit est survenu dans la base de données 'SEE_EED_2_41', table 'RIJA_LNK_Wires', column 'IDWire'.
    L'instruction a été arrêtée.


    Entre temps aussi, comment faire pour faire une suppression dans la table RIJA_Wires non liée par cascade
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Plus ridicule que cela, il n'y en a pas: c'est ainsi que je considère la solution de mon problème
    => Il suffit de mettre ON CASCADE DELETEE sur la contrainte FK_666. La table RIJA_LNK_Wires référence donc 2 tables toutes en suppression en cascade
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  3. #3
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Mais je précise quand même que ces tables ne sont qu'une partie d'une grande BD que je teste et sans avoir mis une "cascade delete", lorsqu'on supprime un champ de RIJA_Wires de cette grande BD, le champ qui y prend référence dans RIJA_LNK_Wires est également supprimé mais comment?
    Acceptez-vous que SQL Server bogue quand la BD est grande et très liée (les tables = c'est ça la relationnelle)??

    Mais je ferai bien de poser ce sujet sous Oracle car c'est avec ce SGBD que cette base rencontre plus de problème: mutating table, constraint violated - child record found, etc.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Visiblement vous ne comprenez pas ce qu'est l'intégrité référentielle et comment elle fonctionne. Reportez vous aux cours en ligne et aux bouquins que j'ai écrit. Vous comprendrez alors vos erreurs d'interprétation !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Acceptez-vous que SQL Server bogue quand la BD est grande et très liée (les tables = c'est ça la relationnelle)??
    En fait, je comprends très bien l'intégrité référentielle et de plus, je retire cette question en QUOTE là
    Car j'ai pas remarqué dans mon code (que j'ai en fait copié) qu'on utilisait une procédure stockée pour la suppression dans RIJA_Wires: supprimer dans la table fille d'abord, ce qui évite l'erreur sur l'intégrité référentielle
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

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

Discussions similaires

  1. [AC-2007] Suppression des champs d'une table
    Par Cyril dLL dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 24/11/2013, 08h48
  2. Suppression des champs d'une table
    Par jackvpt dans le forum Bases de données
    Réponses: 11
    Dernier message: 02/01/2011, 17h43
  3. Procedure de suppressions des champs d'une table
    Par Kiriyama dans le forum Sybase
    Réponses: 1
    Dernier message: 07/04/2009, 16h47
  4. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53
  5. Récupération des noms de champs d'une table
    Par Battomura dans le forum SQL
    Réponses: 2
    Dernier message: 24/03/2003, 10h00

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