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

Schéma Discussion :

Héritage Produit


Sujet :

Schéma

  1. #21
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    j'ai enfin eu le temps de continuer ma base de donnée, encore merci pour les conseils.
    j'espère que c'est mieux.
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    /********************* ROLES **********************/
    
    CREATE ROLE RDB$ADMIN;
    /********************* UDFS ***********************/
    
    /****************** GENERATORS ********************/
    
    /******************** DOMAINS *********************/
    
    /******************* PROCEDURES ******************/
    
    /******************** TABLES **********************/
    
    CREATE TABLE TACCESSOIRE
    (
      NOM Varchar(15) NOT NULL,
      CODE_BARRE Varchar(15) NOT NULL,
      DETAIL Varchar(100),
      FK_ACCESSOIRE_MATERIEL Varchar(30)
    );
    CREATE TABLE TADRESSE
    (
      NOM_RUE Varchar(30) NOT NULL,
      NUMERO_RUE Varchar(5) NOT NULL,
      NUMERO_BOITE Varchar(4),
      PROVINCE_DEPARTEMENT Varchar(30) NOT NULL,
      FK_ADRESSE_COMMUNE Varchar(50),
      PRIMARY KEY (NOM_RUE)
    );
    CREATE TABLE TCOMMUNE
    (
      FK_COMMUNE_CODE Varchar(25),
      COMMUNE Varchar(20) NOT NULL,
      CODE_POSTAL Varchar(7) NOT NULL,
      PRIMARY KEY (COMMUNE)
    );
    CREATE TABLE TFOURNISSEUR
    (
      NOM Varchar(30) NOT NULL,
      HEURE_OUVERTURE Varchar(5) NOT NULL,
      JOURS_FERMETURE Varchar(4),
      TEL Varchar(30) NOT NULL,
      EMAIL Varchar(30) NOT NULL,
      WEB Varchar(60),
      FK_FOURNISSEUR_NOM_RUE Varchar(30),
      PRIMARY KEY (NOM)
    );
    CREATE TABLE TMAQUILLAGE
    (
      NOM Varchar(70) NOT NULL,
      COULEUR Varchar(10),
      CONTENANCE Varchar(5),
      CODE_BARRE Varchar(15),
      DESCRIPTION Varchar(100),
      FK_MAQUILLAGE_MATERIEL Varchar(15)
    );
    CREATE TABLE TMATERIEL
    (
      ID Varchar(10) NOT NULL,
      QUANTITE Integer,
      PRIX_UNITAIRE Decimal(5,2),
      PRIMARY KEY (ID)
    );
    CREATE TABLE TPAYS
    (
      CODE Varchar(5) NOT NULL,
      NOM Varchar(35) NOT NULL,
      PRIMARY KEY (CODE)
    );
    CREATE TABLE TPRODUIT
    (
      NOM Varchar(15),
      CODE_BARRE Varchar(15),
      DESCRIPTION Varchar(100),
      FK_PRODUIT_MATERIEL Varchar(30)
    );
    CREATE TABLE TSTOCK
    (
      ID Varchar(6) NOT NULL,
      DATE_ACCES Date NOT NULL,
      FK_STOCK_USER Varchar(35),
      FK_STOCK_MATERIEL Varchar(10)
    );
    CREATE TABLE TUSER
    (
      NUM_ID Varchar(25) NOT NULL,
      MOT_DE_PASSE Varchar(25) NOT NULL,
      FK_USER_NOM Varchar(60),
      FK_USER_NOM_UTILISATEUR Varchar(60),
      PRIMARY KEY (NUM_ID)
    );
    CREATE TABLE TUTILISATEUR
    (
      NOM Varchar(30) NOT NULL,
      PRENOM Varchar(20),
      DATE_NAISSANCE Date,
      EMAIL Varchar(50),
      PRIMARY KEY (NOM)
    );
    /********************* VIEWS **********************/
    
    /******************* EXCEPTIONS *******************/
    
    /******************** TRIGGERS ********************/
    
    
    ALTER TABLE TACCESSOIRE ADD
      FOREIGN KEY (FK_ACCESSOIRE_MATERIEL) REFERENCES TMATERIEL (ID) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TADRESSE ADD
      FOREIGN KEY (FK_ADRESSE_COMMUNE) REFERENCES TCOMMUNE (COMMUNE) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TCOMMUNE ADD
      FOREIGN KEY (FK_COMMUNE_CODE) REFERENCES TPAYS (CODE) ON UPDATE SET NULL ON DELETE NO ACTION;
    ALTER TABLE TFOURNISSEUR ADD
      FOREIGN KEY (FK_FOURNISSEUR_NOM_RUE) REFERENCES TADRESSE (NOM_RUE) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TMAQUILLAGE ADD
      FOREIGN KEY (FK_MAQUILLAGE_MATERIEL) REFERENCES TMATERIEL (ID) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TPRODUIT ADD
      FOREIGN KEY (FK_PRODUIT_MATERIEL) REFERENCES TMATERIEL (ID) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TSTOCK ADD
      FOREIGN KEY (FK_STOCK_USER) REFERENCES TUSER (NUM_ID) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TUSER ADD
      FOREIGN KEY (FK_USER_NOM) REFERENCES TFOURNISSEUR (NOM) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TUSER ADD
      FOREIGN KEY (FK_USER_NOM_UTILISATEUR) REFERENCES TUTILISATEUR (NOM) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TUTILISATEUR ADD 
      CHECK (Date_naissance>CURRENT_DATE);
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TACCESSOIRE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TADRESSE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TCOMMUNE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TFOURNISSEUR TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TMAQUILLAGE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TMATERIEL TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TPAYS TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TPRODUIT TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TSTOCK TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TUSER TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TUTILISATEUR TO  SYSDBA WITH GRANT OPTION;
    j'ai bien suivi vos conseils, mais il y a encore des fautes?
    merci d'avance

  2. #22
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    je l'ignorais :s
    merci

    si je comprend bien, je dois préférer un integer qui sera auto incrémenté?
    en cas de suppression, l'entier généré devra être recalculé?

  4. #24
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On ne réutilise pas un identifiant auto-incrémenté après suppression.

    C'est le système d'auto-incrémentation du SGBD qui gère les numéros.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #25
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    je rajoute donc à chaque fois un id de type integer qui me sert de PK.

    en fait, pour résumer les PK:
    - doivent être unique,
    - jamais à null
    - de type integer

    - Mais on est obligé d'auto incrémenter la PK?

  6. #26
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Relis mon message du 26/10/2012 à 14h00. Presque tout y est expliqué.

    Pour les tables associatives, je te renvoie à mon blog.

    À noter que l'héritage est le cas 02, avec en plus une identification relative côté B :
    02) A -0,1—-associer—-(1,1)- B

    Règle de gestion qui engendre cette association :
    Un B est un A et un A peut être un B.

    Tables :
    A (A_id, [colonnes communes à tous les A)
    B (B_id_A, [colonnes spécifiques aux B])

    A_id est auto-incrémentée mais pas B_id_A puisque c'est aussi une clé étrangère référençant A.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #27
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    B va donc hériter des données de A
    et la FK de B va faire la liaison vers A

    Je peux résumer à tout ce qui est identiques aux tables
    Tmaquillage
    Tproduit
    Taccessoire
    seront des champs de la table Tmateriel.
    et aussi pas de PK ds les 3 tables mais des FK qui vont faire la relation avec la table Tmateriel, qui n'aura qu'une PK

  8. #28
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    B va donc hériter des données de A
    Attention ! Pas d'ambiguïté de langage !

    La table B ne va pas contenir les données de A (sauf la clé primaire qui est une clé étrangère référençant A). Il faut créer une vue pour reconstituer l'entièreté d'un A de type B.

    Exemple concret...

    voiture -(1,1)----être----0,1- vehicule
    camion -(1,1)----être----0,1-------|

    te_vehicule_veh (veh_id, veh_id_modele, veh_immatriculation...)
    th_voiture_vtr (vtr_id_vehicule, vtr_id_carburant, vtr_nb_places...)
    th_camion_cam (cam_id_vehicule, cam_tonnage...)

    Vue des voitures :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW v_voiture AS
    SELECT vh.veh_id AS id_vehicule,
    	m.mdl_libelle AS modele,
    	c.crb_libelle AS carburant,
    	vh.veh_immatriculation AS immatriculation,
    	vt.vtr_nb_places AS nb_places,
    FROM te_vehicule_veh vh
    INNER JOIN th_voiture_vtr vt ON vt.vtr_id_vehicule = vh.veh_id
    	INNER JOIN tr_carburant_crb c ON c.crb_id = vtr_id_carburant
    INNER JOIN te_modele_mdl m ON m.mdl_id = vh.veh_id_modele
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #29
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    voilà, ce que ça donne pour le moment, je n'ai pas encore travaillé sur les views mais ça ne va pas tarder.
    J'espère que je suis sur le bon chemin, en tout cas ça à évolué depuis mon premier code...
    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
    103
    104
    105
    106
    107
    108
    CREATE TABLE TPays(
    		PK_Pays INTEGER NOT NULL PRIMARY KEY,
    		Code_pays VARCHAR(50) NOT NULL,
    		Nom_Pays VARCHAR(50) NOT NULL
    		);
    CREATE TABLE TCommune(
    		PK_Comm INTEGER NOT NULL PRIMARY KEY,
    		Nom_Comm VARCHAR(50),
    		FK_Comm_Pays INTEGER,
    		CP_Comm VARCHAR(50),
    		);
    CREATE TABLE TAdresse(
    		PK_Adresse INTEGER NOT NULL PRIMARY KEY,
    		NomRue_Adr VARCHAR(50) NOT NULL,NumRue_Adr VARCHAR(50) NOT NULL,
    		NumBte_Adr VARCHAR(10) NOT NULL,Prov/Dep_Adr VARCHAR(50),
    		FK_Adresse_Fournisseur INTEGER NOT NULL,
    		FK_Adresse_Commune INTEGER NOT NULL,
    		);
    CREATE TABLE TUser(
    		PK_User INTEGER NOT NULL PRIMARY KEY,
    		FK_User_Fournisseur INTEGER NOT NULL,
    		Id_user VARCHAR(50) NOT NULL,
    		MotDePasse_User VARCHAR(50)
    		);
    CREATE TABLE TFournisseur(
    		Pk_Fournisseur INTEGER NOT NULL PRIMARY KEY,
    		Nom_Fourn VARCHAR(50) NOT NULL,
    		HeuresOuverture_Fourn VARCHAR(50),
    		JoursFermetures_Fourn VARCHAR(50),
    		Tel_Fourn VARCHAR(50) NOT NULL,Email_Fourn VARCHAR(50),
    		Web VARCHAR(50),
    		FK_Fournisseur_Adresse INTEGER NOT NULL
    		);
    CREATE TABLE TUtilisateur(
    		PK_Utilisateur INTEGER NOT NULL PRIMARY KEY,
    		Nom_Utilisateur VARCHAR(50) NOT NULL,
    		Prenom_Utilisateur VARCHAR(50) NOT NULL,
    		DateNaissance_Utilisateur DATE NOT NULL,
    		Email_Utilisateur VARCHAR(50) NOT NULL
    		);
    CREATE TABLE TStock(
    		DateAcces_Sto TIMESTAMP(0) NOT NULL,
    		Fk_Stock_Materiel INTEGER NOT NULL,
    		Fk_Stock_User INTEGER NOT NULL PRIMARY KEY,
    		Id_Sto INTEGER NOT NULL
    		);
    CREATE TABLE TMateriel(
    		Pk_Materiel INTEGER NOT NULL PRIMARY KEY,
    		Id_Materiel VARCHAR(50) NOT NULL,Nom_Materiel VARCHAR(50),
    		CodeBarre_Materiel VARCHAR(50) NOT NULL,
    		Qt_Materiel SMALLINT NOT NULL,
    		PrixUnitaire_Materiel DECIMAL(5,2) NOT NULL
    		);
    CREATE TABLE TMaquillage(
    		Fk_Maquillage_Materiel INTEGER NOT NULL PRIMARY KEY,
    		Couleur_Maquillage VARCHAR(50) NOT NULL,
    		ZoneCorps_Maquillage VARCHAR(15) NOT NULL,
    		Detail_Maquillage VARCHAR(100),
    		);
    CREATE TABLE TProduit(
    		FK_Produit_Materiel INTEGER NOT NULL PRIMARY KEY,
    		Contenance_Produit INTEGER NOT NULL,
    		Detail VARCHAR(100),
    		);
    CREATE TABLE TAccessoire(
    		Fk_Accessoire_Materiel INTEGER  NOT NULL PRIMARY KEY,
    		Detail_Accessoire VARCHAR(100),
    		);
    ALTER TABLE TCommune 
    		ADD CONSTRAINT FOREIGN KEY(FK_Comm_Pays) 
    		REFERENCES TPays(PK_Pays) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TAdresse 
    		ADD CONSTRAINT FOREIGN KEY(FK_Adresse_Commune) 
    		REFERENCES TCommune(PK_Comm) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TAdresse 
    		ADD CONSTRAINT FOREIGN KEY(FK_Adresse_Fournisseur) 
    		REFERENCES TFournisseur(Pk_Fournisseur) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TUser 
    		ADD CONSTRAINT FOREIGN KEY(FK_User_Fournisseur) 
    		REFERENCES TFournisseur(Pk_Fournisseur) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TUser 
    		ADD CONSTRAINT FOREIGN KEY(PK_User) 
    		REFERENCES TStock(Fk_Stock_User) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TUser 
    		ADD CONSTRAINT FOREIGN KEY(PK_User) 
    		REFERENCES TUtilisateur(PK_Utilisateur) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TStock 
    		ADD CONSTRAINT FOREIGN KEY(Fk_Stock_Materiel) 
    		REFERENCES TMateriel(Pk_Materiel) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TMaquillage 
    		ADD CONSTRAINT FOREIGN KEY(Fk_Maquillage_Materiel) 
    		REFERENCES TMateriel(Pk_Materiel) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TProduit 
    		ADD CONSTRAINT FOREIGN KEY(FK_Produit_Materiel) 
    		REFERENCES TMateriel(Pk_Materiel) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE TAccessoire 
    		ADD CONSTRAINT FOREIGN KEY(Fk_Accessoire_Materiel) 
    		REFERENCES TMateriel(Pk_Materiel) 
    		ON DELETE CASCADE ON UPDATE CASCADE;
    Merci d'avance pour votre aide et vos conseils.

  10. #30
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut le trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    create generator gen_num_Pays;
    
    -- Création du trigger
    set term ^;
    
    create trigger trg_num_Pays for TPAYS active before
    insert 
    as
    begin
     if (new.PK_PAYS is null) then 
      new.PK_PAYS = next VALUE for gen_num_Pays;
    end^
    
    set term ;^

  11. #31
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE TPays(
    		PK_Pays INTEGER NOT NULL PRIMARY KEY,
    		Code_pays VARCHAR(50) NOT NULL,
    		Nom_Pays VARCHAR(50) NOT NULL
    		);
    50 caractères pour un code pays, ça fait beaucoup !
    Par contre, 50 caractères pour son nom, pas sûr que ce soit suffisant. À vérifier.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE TCommune(
    		PK_Comm INTEGER NOT NULL PRIMARY KEY,
    		Nom_Comm VARCHAR(50),
    		FK_Comm_Pays INTEGER,
    		CP_Comm VARCHAR(50),
    		);
    Idem, 50 caractères pour le nom de la commune, pas sûr que ce soit suffisant. En France, je crois que le plus long fait 38 lettres mais dans le monde il doit y avoir plus long. À vérifier.

    En France, il peut y avoir plusieurs codes postaux pour une commune et un code postal peut couvrir plusieurs communes. Comme en plus il y a, toujours en France, les codes postaux pour les cedex, perso, je ne crée pas de table de référence des codes postaux, j'enregistre simplement le code postal avec l'adresse, quitte à ce qu'il y ait une vérification de cohérence de la partie département du code avec le département de la commune.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE TAdresse(
    		PK_Adresse INTEGER NOT NULL PRIMARY KEY,
    		NomRue_Adr VARCHAR(50) NOT NULL,
    		NumRue_Adr VARCHAR(50) NOT NULL,
    		NumBte_Adr VARCHAR(10) NOT NULL,
    		Prov/Dep_Adr VARCHAR(50),
    		FK_Adresse_Fournisseur INTEGER NOT NULL,
    		FK_Adresse_Commune INTEGER NOT NULL,
    		);
    Idem, 50 caractères pour le nom de la rue, pas sûr que ce soit suffisant. À vérifier.
    D'ailleurs, la partie rue est souvent composée de plusieurs lignes dans une adresse. Voir la partie de l'article de SQLPro consacré au modèle d'adresse selon la norme postale française.
    Par contre, 50 caractères pour le numéro, c'est trop long !

    Que contient NumBte_Adr ? La boîte postale ?

    Prov/Dep_Adr est probablement externalisable dans une table de référence des provinces,. Si Dep représente le département français, il vaut clairement mieux une table des départements mais celui-ci est trouvable par la commune, il n'a rien à faire dans cette table.
    De plus, cette colonne est mal nommée car elle contient un / qui est le signe de la division en SQL.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE TUser(
    		PK_User INTEGER NOT NULL PRIMARY KEY,
    		FK_User_Fournisseur INTEGER NOT NULL,
    		Id_user VARCHAR(50) NOT NULL,
    		MotDePasse_User VARCHAR(50)
    		);
    Ce modèle laisse supposer qu'il peut y avoir plusieurs users pour un fournisseur. N'y aurait-il pas là déjà un héritage ?

    Un fournisseur peut être un utilisateur et un utilisateur est un fournisseur.
    utilisateur -(1,1)----être----0,1- fournisseur

    En ce cas, PK_User est inutile et c'est FK_User_Fournisseur qui devient en même temps clé primaire.

    Id_User est un nom de colonne qui peut prêter à confusion car "Id" est généralement employé pour un identifiant auto-incrémenté.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE TFournisseur(
    		Pk_Fournisseur INTEGER NOT NULL PRIMARY KEY,
    		Nom_Fourn VARCHAR(50) NOT NULL,
    		HeuresOuverture_Fourn VARCHAR(50),
    		JoursFermetures_Fourn VARCHAR(50),
    		Tel_Fourn VARCHAR(50) NOT NULL,Email_Fourn VARCHAR(50),
    		Web VARCHAR(50),
    		FK_Fournisseur_Adresse INTEGER NOT NULL
    		);
    Le pluriel dans "HeuresOuverture_Fourn" et "JoursFermetures_Fourn" indique bien que cette colonne ne va pas contenir des données atomiques. Il vaut mieux mettre ces informations dans d'autres tables.
    Les heures d'ouvertures peuvent être variables selon le jour de la semaine, voire même selon certains jours de l'année mais as-tu besoin d'une telle précision en base de données ? Si les horaires normaux suffisent, tu peux :
    - soit créer deux colonnes "HeureOuverture_Fourn" et "HeureFermeture_Fourn" ;
    - soit créer une table THoraireOuverture_Fourn (FK_Fournisseur_HOuvF, FK_JourSem_HOuvF, HeureOuverture_HOuvF, HeureFermeture_HOuvF).

    50 caractères pour le numéro de téléphone, c'est trop long !

    FK_Fournisseur_Adresse signifie qu'il n'y a qu'une seule adresse pour un fournisseur alors que FK_Adresse_Fournisseur dans la table TAdresse signifie que l'adresse n'appartient qu'à un seul fournisseur qui potentiellement pourrait ne pas être celui qui référence l'adresse. Il faut supprimer l'une des deux clés étrangères pour ne pas avoir d'incohérence.

    En recherchant le MCD dans la discussion, je retombe sur mon message #20 qui parlait déjà de la modélisation des adresses. Des messages précédents parlent aussi d'autres choses que tu n'as pas prises en compte dans la description des tables que tu nous donnes ici !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TUtilisateur(
    		PK_Utilisateur INTEGER NOT NULL PRIMARY KEY,
    		Nom_Utilisateur VARCHAR(50) NOT NULL,
    		Prenom_Utilisateur VARCHAR(50) NOT NULL,
    		DateNaissance_Utilisateur DATE NOT NULL,
    		Email_Utilisateur VARCHAR(50) NOT NULL
    		);
    Pourquoi avoir fait une table pour les utilisateurs et une autre pour les users ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE TStock(
    		DateAcces_Sto TIMESTAMP(0) NOT NULL,
    		Fk_Stock_Materiel INTEGER NOT NULL,
    		Fk_Stock_User INTEGER NOT NULL PRIMARY KEY,
    		Id_Sto INTEGER NOT NULL
    		);
    Je ne comprends pas le sens de cette table !
    La clé primaire indique que le stock est un héritage de user mais il y a en plus un identifiant pour le stock, ainsi qu'une clé étrangère référençant un autre type de stock (stock_matériel) !

    Bon j'arrête là parce qu'il y a vraiment trop de choses à revoir et que j'ai autre chose à faire !

    Donne ton MCD, qu'on puisse le valider avant de passer à la construction des tables.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Bonjour et merci pour le temps que tu me consacre,
    50 caractères pour un code pays, ça fait beaucoup !
    Par contre, 50 caractères pour son nom, pas sûr que ce soit suffisant. À vérifier.
    pour les codes pays j'ai changer entre temps, en un CHAR de 2.
    Pour le nombre de caractère j'ai pris la liste des pays du mondes et c'est passé, sans problème avec 50.

    Pour la "partie adresse" ( code postal et tout)
    Je l'avoue je pensais que c'était un peu comme ici, je n'ai pas assez étudié le cas...
    Le numéro de boite, en me relisant, je me rend compte que c'est beaucoup trop long... 5 caractère c'est suffisant.... C'est le numéro d'une boite au lettre d'un immeuble par exemple. par exemple 77/41.... Du moins c'est le cas ici en Belgique.

    Prov/Dep_Adr est probablement externalisable dans une table de référence des provinces,. Si Dep représente le département français, il vaut clairement mieux une table des départements mais celui-ci est trouvable par la commune, il n'a rien à faire dans cette table.
    De plus, cette colonne est mal nommée car elle contient un / qui est le signe de la division en SQL.
    Je comptais juste ajouter, la province ou le département ds la même table. Je dois faire comme avec la table pays alors?
    Le signe a été changé.

    Ce modèle laisse supposer qu'il peut y avoir plusieurs users pour un fournisseur. N'y aurait-il pas là déjà un héritage ?

    Un fournisseur peut être un utilisateur et un utilisateur est un fournisseur.
    utilisateur -(1,1)----être----0,1- fournisseur
    En effet un fournisseur peut avoir plussieurs utilisateur.
    Je ne considère pas un fournisseur comme un utilisateur, car c'est justement pour qu'une "make-up artist" puisse retrouver un fournisseur et /ou un produit" par exemple.
    mon modèle c'est en fait,
    utilisateur-(1,1)-----user-(n,1)---fournisseur
    Pourquoi avoir fait une table pour les utilisateurs et une autre pour les users ?
    si j'ai voulu séparer l'utilisateur et le user sont séparés c'est simplement pour pouvoir se connecter rapidement

    Je ne comprends pas le sens de cette table !
    La clé primaire indique que le stock est un héritage de user mais il y a en plus un identifiant pour le stock, ainsi qu'une clé étrangère référençant un autre type de stock (stock_matériel) !
    En effet le stock est un héritage de l'user
    id du stock, c'est un code qui est propre au stock( numéro d'un tiroir, étage ds une étagère,...)
    Un stock peut avoir (1,n) materiel

    Il y a encore du boulot...

  13. #33
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut le MCD....

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    au sujet de l'adresse et du fournisseur, je vois mon erreur,
    1 Fournisseur peut avoir n adresse; mais 1 adresse ne se rapport qu'à un seul Fournisseur.
    Donc ma relation est " à l'envers. De plus m'a PK_Adresse doit poiter vers la clé étrangère Fk_Fournisseur adresse. Par conséquentt, mes cardinalités seront inversées et la Fk_Adresse_Fournisseur, n'a aucun sens.

  15. #35
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Points : 9
    Points
    9
    Par défaut Enfin ..... Quoi que....
    J'ai corrigé mon DDL,
    une autre erreur que j'avais vu c'est ma relation entre TFournisseur et TAdresse....
    FK_Adresse_Fournisseur va "recevoir" les données de PK_Fournisseur, et non l'inverse comme fait ci-dessus...
    Voici le DDL, je me doute qu'il y a encore des choses trèès mauvaises non?!
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    /********************* ROLES **********************/
    
    CREATE ROLE RDB$ADMIN;
    /********************* UDFS ***********************/
    
    /****************** GENERATORS ********************/
    
    CREATE GENERATOR GEN_NUM_ADR;
    CREATE GENERATOR GEN_NUM_COM;
    CREATE GENERATOR GEN_NUM_FOURN;
    CREATE GENERATOR GEN_NUM_MATERIEL;
    CREATE GENERATOR GEN_NUM_PAYS;
    CREATE GENERATOR GEN_NUM_USER;
    CREATE GENERATOR GEN_NUM_UTILISATEUR;
    CREATE GENERATOR GEN_TFOURNISSEUR_ID;
    /******************** DOMAINS *********************/
    
    /******************* PROCEDURES ******************/
    
    /******************** TABLES **********************/
    
    CREATE TABLE TACCESSOIRE
    (
      FK_ACCESSOIRE_MATERIEL Integer NOT NULL,
      DETAIL_ACCESSOIRE Varchar(100),
      PRIMARY KEY (FK_ACCESSOIRE_MATERIEL)
    );
    CREATE TABLE TADRESSE
    (
      PK_ADRESSE Integer NOT NULL,
      NOMRUE_ADR Varchar(50) NOT NULL,
      NUMRUE_ADR Varchar(50) NOT NULL,
      NUMBTE_ADR Varchar(10) NOT NULL,
      PROV_OU_DEP_ADR Varchar(50),
      TEL_ADR Varchar(50) NOT NULL,
      FK_ADRESSE_COMMUNE Integer NOT NULL,
      FK_ADRESSE_FOURNISSEUR Integer NOT NULL,
      PRIMARY KEY (PK_ADRESSE)
    );
    CREATE TABLE TCOMMUNE
    (
      PK_COMM Integer NOT NULL,
      NOM_COMM Varchar(50),
      FK_COMM_PAYS Integer,
      CP_COMM Varchar(50),
      PRIMARY KEY (PK_COMM)
    );
    CREATE TABLE TFOURNISSEUR
    (
      PK_FOURNISSEUR Integer NOT NULL,
      NOM_FOURN Varchar(50) NOT NULL,
      HEURESOUVERTURE_FOURN Varchar(50),
      JOURSFERMETURES_FOURN Varchar(50),
      EMAIL_FOURN Varchar(50),
      WEB Varchar(50),
      PRIMARY KEY (PK_FOURNISSEUR)
    );
    CREATE TABLE TMAQUILLAGE
    (
      FK_MAQUILLAGE_MATERIEL Integer NOT NULL,
      COULEUR_MAQUILLAGE Varchar(50) NOT NULL,
      ZONECORPS_MAQUILLAGE Varchar(15) NOT NULL,
      DETAIL_MAQUILLAGE Varchar(100),
      PRIMARY KEY (FK_MAQUILLAGE_MATERIEL)
    );
    CREATE TABLE TMATERIEL
    (
      PK_MATERIEL Integer NOT NULL,
      ID_MATERIEL Varchar(50) NOT NULL,
      NOM_MATERIEL Varchar(50),
      CODEBARRE_MATERIEL Varchar(50) NOT NULL,
      QT_MATERIEL Smallint NOT NULL,
      PRIXUNITAIRE_MATERIEL Decimal(5,2) NOT NULL,
      PRIMARY KEY (PK_MATERIEL)
    );
    CREATE TABLE TPAYS
    (
      PK_PAYS Integer NOT NULL,
      CODE_PAYS Varchar(50) NOT NULL,
      NOM_PAYS Varchar(50) NOT NULL,
      PRIMARY KEY (PK_PAYS)
    );
    CREATE TABLE TPRODUIT
    (
      FK_PRODUIT_MATERIEL Integer NOT NULL,
      CONTENANCE_PRODUIT Integer NOT NULL,
      DETAIL Varchar(100),
      DATE_ACHAT Date,
      PRIMARY KEY (FK_PRODUIT_MATERIEL)
    );
    CREATE TABLE TSTOCK
    (
      DATEACCES_STO Timestamp NOT NULL,
      FK_STOCK_MATERIEL Integer NOT NULL,
      FK_STOCK_USER Integer NOT NULL,
      ID_STO Integer NOT NULL,
      PRIMARY KEY (FK_STOCK_USER)
    );
    CREATE TABLE TUSER
    (
      PK_USER Integer NOT NULL,
      FK_USER_FOURNISSEUR Integer NOT NULL,
      ID_USER Varchar(50) NOT NULL,
      MOTDEPASSE_USER Varchar(50),
      PRIMARY KEY (PK_USER)
    );
    CREATE TABLE TUTILISATEUR
    (
      PK_UTILISATEUR Integer NOT NULL,
      NOM_UTILISATEUR Varchar(50) NOT NULL,
      PRENOM_UTILISATEUR Varchar(50) NOT NULL,
      DATENAISSANCE_UTILISATEUR Date NOT NULL,
      EMAIL_UTILISATEUR Varchar(50) NOT NULL,
      PRIMARY KEY (PK_UTILISATEUR)
    );
    /********************* VIEWS **********************/
    
    /******************* EXCEPTIONS *******************/
    
    /******************** TRIGGERS ********************/
    
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_ADR FOR TADRESSE ACTIVE
    BEFORE INSERT POSITION 0
    as
    begin
     if (new.PK_ADRESSE is null) then 
      new.PK_ADRESSE = next VALUE for gen_num_adr ;
    end^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_COM FOR TCOMMUNE ACTIVE
    BEFORE INSERT POSITION 0
    as
    begin
     if (new.PK_COMM is null) then 
      new.PK_COMM = next VALUE for gen_num_com;
    end^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_FOURN FOR TFOURNISSEUR ACTIVE
    BEFORE INSERT POSITION 0
    as
    begin
     if (new.PK_FOURNISSEUR is null) then 
      new.PK_FOURNISSEUR = next VALUE for gen_num_fourn;
    end^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_MATERIEL FOR TMATERIEL ACTIVE
    BEFORE INSERT POSITION 0
    as
    begin
     if (new.PK_MATERIEL is null) then 
      new.PK_MATERIEL = next VALUE for gen_num_materiel;
    end^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_PAYS FOR TPAYS ACTIVE
    BEFORE INSERT POSITION 0
    AS
    
    begin
     if (new.PK_PAYS is null) then 
      new.PK_PAYS = next VALUE for GEN_NUM_PAYS;
    
    END^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_USER FOR TUSER ACTIVE
    BEFORE INSERT POSITION 0
    as
    begin
     if (new.PK_USER is null) then 
      new.PK_USER = next VALUE for gen_num_user;
    end^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER TRG_NUM_UTILISATEUR FOR TUTILISATEUR ACTIVE
    BEFORE INSERT POSITION 0
    as
    begin
     if (new.PK_UTILISATEUR is null) then 
      new.PK_UTILISATEUR = next VALUE for gen_num_utilisateur;
    end^
    SET TERM ; ^
    
    ALTER TABLE TACCESSOIRE ADD CONSTRAINT FK_ACCESSOIRE_MATERIEL
      FOREIGN KEY (FK_ACCESSOIRE_MATERIEL) REFERENCES TMATERIEL (PK_MATERIEL) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TADRESSE ADD CONSTRAINT FK_ADRESSE_COMMUNE
      FOREIGN KEY (FK_ADRESSE_COMMUNE) REFERENCES TCOMMUNE (PK_COMM) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TADRESSE ADD CONSTRAINT FK_ADRESSE_FOURNISSEUR
      FOREIGN KEY (FK_ADRESSE_FOURNISSEUR) REFERENCES TFOURNISSEUR (PK_FOURNISSEUR) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TCOMMUNE ADD CONSTRAINT FK_COMM_PAYS
      FOREIGN KEY (FK_COMM_PAYS) REFERENCES TPAYS (PK_PAYS) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TMAQUILLAGE ADD CONSTRAINT FK_MAQUILLAGE_MATERIEL
      FOREIGN KEY (FK_MAQUILLAGE_MATERIEL) REFERENCES TMATERIEL (PK_MATERIEL) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TPRODUIT ADD CONSTRAINT FK_PRODUIT_MATERIEL
      FOREIGN KEY (FK_PRODUIT_MATERIEL) REFERENCES TMATERIEL (PK_MATERIEL) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TSTOCK ADD CONSTRAINT FK_STOCK_MATERIEL
      FOREIGN KEY (FK_STOCK_MATERIEL) REFERENCES TMATERIEL (PK_MATERIEL) ON UPDATE CASCADE ON DELETE CASCADE;
    CREATE INDEX IDX_STOCK_EMPLACEMENT_STOCK ON TSTOCK (ID_STO);
    ALTER TABLE TUSER ADD CONSTRAINT FK_USER_FOURNISSEUR
      FOREIGN KEY (FK_USER_FOURNISSEUR) REFERENCES TFOURNISSEUR (PK_FOURNISSEUR) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE TUSER ADD CONSTRAINT PK_USER
      FOREIGN KEY (PK_USER) REFERENCES TSTOCK (FK_STOCK_USER) ON UPDATE CASCADE ON DELETE CASCADE;
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TACCESSOIRE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TADRESSE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TCOMMUNE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TFOURNISSEUR TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TMAQUILLAGE TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TMATERIEL TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TPAYS TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TPRODUIT TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TSTOCK TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TUSER TO  SYSDBA WITH GRANT OPTION;
    
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON TUTILISATEUR TO  SYSDBA WITH GRANT OPTION;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE TUSER ADD FK_USER_UTILISATEUR INTEGER NOT NULL;
    
    ALTER TABLE TUSER ADD CONSTRAINT FK_USER_UTILISATEUR
      FOREIGN KEY (FK_USER_UTILISATEUR) REFERENCES TUTILISATEUR (PK_UTILISATEUR) ON UPDATE CASCADE ON DELETE CASCADE;
    Je l'ai copier directement de flamerobine.

Discussions similaires

  1. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  2. [MCD] Héritage : Produit, matériel et logiciel
    Par TheBlue dans le forum Schéma
    Réponses: 1
    Dernier message: 09/04/2007, 15h32
  3. [info]Licence des produits Java
    Par XavierZERO dans le forum Général Java
    Réponses: 12
    Dernier message: 16/01/2004, 16h27
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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