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 :

Sous Typage - Heritage


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut Sous Typage - Heritage
    Bonjour,

    voilà sous SQL Server 2008 j'ai créée 3 tables, la table BIENS qui est le Sur-type des tables APPARTEMENT et MAISON qui sont donc les sous typage (je ne sait pas si ça parle à quelqu'un, si non c'est comme un héritage, les propriété communes au deux tables comme la ville, superficie etc.. sont regroupé dans une table ici BIENS, et les tables appartement et maisons ont leur propre propriétés:
    Appartement: une cave un balcon, un etage
    Maison: jardin, garage
    et ces deux tables vont chercher les propriété communes dans Biens
    )

    Donc j'ai bien mis une clé primaire à BIENS: ID, la meme clé avec le meme type dans appartement et maison, relié entre eux. voici les reltions mise en place:


    ma question: est-ce bon?
    mon problème: lorsque j'enregistre des données depuis VB 2008, dans SQL cela enregistre tout deux fois dans la table BIENS et une fois dans la table maison ou appartement
    il faut que l'ID d'un sous typage corresponde à l'ID du sur typage, mais comment faire? comment éviter les doublons ?

    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
     If Groupe.Text = "Appartement" Then
                Me.objDATA = New Connection()
                Dim ad As Integer
                Me.rqSql = "INSERT INTO [BONVALETJ_C35].[dbo].[BIENS]" & _
                           "DISTINCT(Rue,CP,Ville,Superficie,Prix_Achat,Prix_Location,Orientation,Nb_Pieces)" & _
                           "VALUES(" & _
                           "'" & Me.Rue.Text & "'" & _
                           ",'" & Me.CP.Text & "'" & _
                           ",'" & Me.Ville.Text & "'" & _
                           ",'" & Me.Superficie.Text & "'" & _
                           ",'" & Me.Prix_Achat.Text & "'" & _
                           ",'" & Me.Prix_Location.Text & "'" & _
                           ",'" & Me.Orientation.Text & "'" & _
                           ",'" & Me.Nb_Pieces.Text & "');" & _
                           "; SELECT SCOPE_IDENTITY();"
                ad = Me.objDATA.actionRows(Me.rqSql)
                Me.rqSql1 = "SELECT Appartement.ID" & _
                           "FROM APPARTEMENT "
                Me.DS = Me.objDATA.getRows(Me.rqSql, "ID")
                Dim enreg As Integer = DS.Tables(0).Rows.Count - 1
                If DS.Tables(0).Rows(enreg).Item(0) IsNot DBNull.Value Then
                    index_Biens = DS.Tables(0).Rows(enreg).Item(0)
                End If
                Dim id As Integer
                Me.rqSql = "INSERT INTO [BONVALETJ_C35].[dbo].[APPARTEMENT]" & _
                           "(ID,Etage,Balcon,Cave)" & _
                           "VALUES(" & _
                           "'" & index_Biens & "'" & _
                           ",'" & Me.Etage.Text & "'" & _
                           ",'" & Me.Balcon.Text & "'" & _
                           ",'" & Me.Cave.Text & "');" & _
                           "; SELECT SCOPE_IDENTITY();"
                id = Me.objDATA.actionRows(Me.rqSql)
            End If

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Je crois que cet article de SQLPro vous sera d'un grand secours, et je ne peux que vous conseiller d'écrire une procédure stockée plutôt que de soumettre vos instructions préalablement construites dans votre application, pour les raisons que j'évoque ici

    @++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut
    ok hummm... j'ai suivi le trigger pour l'insertion, en modifiant j'ai ecris
    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 TRIGGER TRG_INS_APPARTEMENT
           ON APPARTEMENT
           FOR INSERT, UPDATE
    AS
    BEGIN
       DECLARE
          @errno    INTEGER,
          @errmsg   VARCHAR(255)
     
       IF NOT EXISTS(SELECT *
                     FROM   BIENS T
                            INNER JOIN INSERTED I
                                  ON T.ID = I.ID)
       BEGIN
          SET @errno  = 30002
          SET @errmsg = 'Clef de "T_VEHICULE_VHC" inconnu. Insertion dans "T_CAMION_CMN" impossible.'
          GOTO LBL_ERROR
       END
     
    /* l'identifiant de camion ne doit pas être utilisé par les autres tables filles */
       IF EXISTS (SELECT *
                  FROM   (SELECT ID
                          FROM MAISON) T
                  WHERE ID IN (SELECT ID
                                   FROM   INSERTED))
       BEGIN
          SET @errno  = 30002
          SET @errmsg = 'Clef de "T_VEHICULE_VHC" déjà utilisée par ailleur. Insertion dans "T_CAMION_CMN" impossible.'
          GOTO LBL_ERROR
       END
     
       RETURN
     
    /*  Gestion d'erreurs  */
    LBL_ERROR:
        RAISERROR @errno @errmsg
        ROLLBACK TRANSACTION
    END
    GO
    et maintenant il ne m'enregistre plus rien, ...je n'ai rien compris au trigger
    que faire

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut
    bon j'ai supprimer le trigger, a enregistre de nouveau mais toujours avec des doublons, je ne comprends rien au trigger (le code du site donné dans le poste plus haut)

    maintenant j'ai une ternaire, et je n'arrive pas à enregistrer les infos dans la ternaire ....
    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
      Me.objDATA = New Connection()
            Dim ad As Integer
            Me.rqSql = "INSERT INTO [BONVALETJ_C35].[dbo].[CLIENT]" & _
                       "(Nom,Prenom,Rue_Client,CP_Client,Ville_Client,Tel)" & _
                       "VALUES(" & _
                       "'" & Me.Nom.Text & "'" & _
                       ",'" & Me.Prenom.Text & "'" & _
                       ",'" & Me.Rue.Text & "'" & _
                       ",'" & Me.CP.Text & "'" & _
                       ",'" & Me.Ville.Text & "'" & _
                       ",'" & Me.Tel.Text & "');" & _
                       "; SELECT SCOPE_IDENTITY();"
            ad = Me.objDATA.actionRows(Me.rqSql)
            'Me.rqSql = "SELECT LOCATION.Numero_Client" & _
            '           "FROM LOCATION "
            Me.DS = Me.objDATA.getRows(Me.rqSql, "Numero_Client")
            Dim enreg As Integer = DS.Tables(0).Rows.Count - 1
            If DS.Tables(0).Rows(enreg).Item(0) IsNot DBNull.Value Then
                index_numero = DS.Tables(0).Rows(enreg).Item(0)
            End If
     
            Dim ed As Integer
            Me.rqSql = "INSERT INTO [BONVALETJ_C35].[dbo].[DATES]" & _
               "(Debut_Location)" & _
               "VALUES(" & _
               "'" & Me.DebutLoc.Text & "');" & _
               "; SELECT SCOPE_IDENTITY();"
            ed = Me.objDATA.actionRows(Me.rqSql)
            'Me.rqSql = "SELECT LOCATION.Debut_Location" & _
            '           "FROM LOCATION "
            Me.DS = Me.objDATA.getRows(Me.rqSql, "Debut_Location")
            Dim enreg1 As Integer = DS.Tables(0).Rows.Count - 1
            If DS.Tables(0).Rows(enreg1).Item(0) IsNot DBNull.Value Then
                index_date = DS.Tables(0).Rows(enreg1).Item(0)
            End If
     
            Dim id As Integer
            Me.rqSql = "INSERT INTO [BONVALETJ_C35].[dbo].[LOCATION]" & _
                       "(Numero_Client,Debut_Location,Fin_Location,Mode_Paiement)" & _
                       "VALUES(" & _
                       "'" & index_numero & "'" & _
                       "'" & index_date & "'" & _
                       ",'" & Me.FinLoc.Text & "'" & _
                       ",'" & Me.Paiement.Text & "'');" & _
                       "; SELECT SCOPE_IDENTITY();"
            id = Me.objDATA.actionRows(Me.rqSql)
    ils peuvent pas inventer un code simple d'utilisation!?

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Donnez le DDL de vos tables (clic-droit sur la table > générer le script en tant que > CREATE TO > ...), sans cela nous ne pouvons pas vous aider

    @++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    USE [master]
    GO
     
    /****** Object:  Database [BONVALETJ_C35]    Script Date: 11/30/2009 12:07:50 ******/
    CREATE DATABASE [BONVALETJ_C35] ON  PRIMARY 
    ( NAME = N'BONVALETJ_C35', FILENAME = N'C:\BDDsql\BONVALET\C35\BONVALETJ_C35.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
     LOG ON 
    ( NAME = N'BONVALETJ_C35_log', FILENAME = N'C:\BDDsql\BONVALET\C35\BONVALETJ_C35_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET COMPATIBILITY_LEVEL = 90
    GO
     
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    begin
    EXEC [BONVALETJ_C35].[dbo].[sp_fulltext_database] @action = 'enable'
    end
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET ANSI_NULL_DEFAULT OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET ANSI_NULLS OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET ANSI_PADDING OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET ANSI_WARNINGS OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET ARITHABORT OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET AUTO_CLOSE OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET AUTO_CREATE_STATISTICS ON 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET AUTO_SHRINK OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET AUTO_UPDATE_STATISTICS ON 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET CURSOR_CLOSE_ON_COMMIT OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET CURSOR_DEFAULT  GLOBAL 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET CONCAT_NULL_YIELDS_NULL OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET NUMERIC_ROUNDABORT OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET QUOTED_IDENTIFIER OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET RECURSIVE_TRIGGERS OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET  DISABLE_BROKER 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET DATE_CORRELATION_OPTIMIZATION OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET TRUSTWORTHY OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET ALLOW_SNAPSHOT_ISOLATION OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET PARAMETERIZATION SIMPLE 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET READ_COMMITTED_SNAPSHOT OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET HONOR_BROKER_PRIORITY OFF 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET  READ_WRITE 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET RECOVERY SIMPLE 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET  MULTI_USER 
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET PAGE_VERIFY CHECKSUM  
    GO
     
    ALTER DATABASE [BONVALETJ_C35] SET DB_CHAINING OFF 
    GO
    voila..

Discussions similaires

  1. polymorphisme par sous-typage
    Par denispir dans le forum Débuter
    Réponses: 8
    Dernier message: 03/06/2012, 22h30
  2. MERISE 2 question sur les sous typages
    Par shadeoner dans le forum Schéma
    Réponses: 1
    Dernier message: 05/03/2009, 17h15
  3. Sous-typage et volume de données
    Par shadeoner dans le forum SQL
    Réponses: 7
    Dernier message: 17/10/2008, 11h29
  4. [POO] Sous-typage variance/contravariance dans Java
    Par yienyien dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2007, 10h43
  5. DB objet sous types heritage
    Par smex dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 15/06/2004, 21h58

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