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

MS SQL Server Discussion :

[SQL SERVER 2005] Relation réflexive


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut [SQL SERVER 2005] Relation réflexive
    Bonjour,

    Est-il possible de réaliser une relation réflexive avec les contraintes d'intégrités avec SQL Sever 2005 ?

    Par exemple, pour chaque produit, j'ai un ou plusieurs produits équivalents (pour dépanner si le premier est indisponible). Je voudrais des liens dynamiques de sorte que si je supprime un produit, il disparaisse aussi des produits équivalents d'autres produits.
    J'ai donc une table T_PRODUIT, et une table de jonction TJ_EQUIVALENT avec les relations suivantes :

    TJ_EQUIVALENT (0,1) ---- (0,n) T_PRODUIT (0,n) ---- (0,1) TJ_EQUIVALENT
    avec :

    Table T_PRODUIT
    PRO_ID Entier Auto incrémenté Clé primaire
    ...

    Table TJ_EQUIVALENT
    PRO_ID Entier Clé primaire
    PRO_Equ_ID Entier Clé primaire

    Contraintes entre
    T_PRODUIT(PRO_ID) ---> TJ_EQUIVALENT(PRO_ID) avec CASCADE
    T_PRODUIT(PRO_ID) ---> TJ_EQUIVALENT(PRO_Equ_ID) avec CASCADE

    Mais SQL Server me renvoie l'erreur : impossible de créer la contrainte car possibilité de cycle en cascade.

    Merci pour vos réponses.

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Ha justement j'ai le meme probleme que toi!
    Cela vient du DELETE ON CASCADE.

    Au depart je n'avais pas mis le DELETE ON CASCADE et ca marché trés bien.
    Seulement mes besoins ont changés.

    Pour ma part jai une table REF_NIV_REN:

    create table REF_NIV_REN
    (
    REN_ID smallint identity (1, 1) ,
    REN_ID_AVOIR_SOUS_NIV smallint not null ,
    REN_LIB nvarchar(128) not null ,
    REN_NIV smallint not null
    ,
    constraint PK_REF_NIV_REN primary key (REN_ID)
    )
    go

    Pour faire simple un enregistrement peut représenté un niveau ou sous niveau exemple:
    1
    null
    Le niveau 1
    1

    2-------------------3------------------4
    1-------------------1------------------1
    Le sous niveau 1----Le sous niveau 2----Le sous niveau 3
    2-------------------2------------------2

    5-------------------6
    3-------------------3
    Le sous niveau 1----Le sous niveau 2
    3-------------------3

    7
    5
    Le sous niveau 1
    4
    REN_ID_AVOIR_SOUS_NIV indique donc le niveau qui contient le sous niveau, (null si niveau 1)
    Je peux avoir jusqu'a 4 'etage' ou 4 niveaux.

    j'ai donc:
    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
     
    create table REF_NIV_REN
      (
         REN_ID smallint identity (1, 1)   ,
         REN_ID_AVOIR_SOUS_NIV smallint  not null  ,
         REN_LIB nvarchar(128)  not null  ,
         REN_NIV smallint  not null  
         ,
         constraint PK_REF_NIV_REN primary key (REN_ID)
      ) 
    go
     
    alter table REF_NIV_REN 
         add constraint FK_REF_NIV_REN_REF_NIV_REN foreign key (REN_ID_AVOIR_SOUS_NIV) 
                   references REF_NIV_REN (REN_ID)
    go
    qui marche trés bien. Mais je désire faire une supression en cascade. Exemple:
    Si je suprimme REN_ID = 3 dans mon exemple plus haut il me suprimme REN_ID = 5, 6, 7 en cascade.

    J'ai donc mis ON DELETE CASCADE aprés ma contrainte mais j'ai l'erreur suivante:
    Msg*1785, Niveau*16, État*0, Ligne*1
    L'introduction d'une contrainte FOREIGN KEY 'FK_REF_NIV_REN_REF_NIV_REN' sur la table 'REF_NIV_REN' 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.
    Msg*1750, Niveau*16, État*0, Ligne*1
    Impossible de créer la contrainte. Voir les erreurs précédentes.
    ---------
    J'ai bien pensé a un trigger before mais cela n'est pas possible sous sql server.

    Comment faire??
    merci

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    pour mon cas, vu qu'il parait impossible de faire un tel lien, j'ai utilisé le trigger suivant pour une table similaire à la tienne :

    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
     
    CREATE TABLE T_MATERIAU
    (
    MAT_ID INT IDENTITY (1, 1) ,
    MAT_ID_Equ INT,
    ...
    ,
    CONSTRAINT PK_T_MATERIAU_MAT_ID PRIMARY KEY (MAT_ID)
    )
    GO
     
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		RAB
    -- Create date: 12/06/06
    -- Description:	Met à NULL le matériau équivalent
    -- =============================================
    CREATE TRIGGER dbo.TR_MATERIAU
       ON  dbo.T_MATERIAU 
       AFTER DELETE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
     
    	UPDATE dbo.T_MATERIAU
    	SET MAT_ID_Equ = NULL 
    	FROM dbo.T_MATERIAU M
    		INNER JOIN DELETED D 
    			ON M.MAT_ID_Equ = D.MAT_ID
    END
    GO
     
    GO
    Est-ce la bonne solution ? Je n'ai pas le niveau pour le dire.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Ta methode a l'air de suffire dans ton cas, mais pas dans le mien.

    Moi il me faut veritablement une suppression des enregistrement décendant.
    Je ne trouve pas la solution.

    Quelqu'un peut il m'aider?

Discussions similaires

  1. Relation (plusieurs à plusieurs) sous microsoft sql server 2005
    Par kournane dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/05/2014, 12h33

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