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 :

Respect au niveau SQL des cardinalités 1,n du MCD merisien


Sujet :

Schéma

  1. #61
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    ha ba, ce serait nouveau....

    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/ * * * * *

  2. #62
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Buenos dias,

    Pour changer à nouveau, voyons voir avec PostgreSQL. Pour ne rien rater, j’ai installé la V16.

    Mutatis mutandis, Je reprends, ce que j’ai proposé ici
     
    (1) Création des tables :
    Code SQL : 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
    CREATE TABLE Produit
    (
       RefProduit CHAR(3),
       Designation VARCHAR(50) NOT NULL,
       Prix SMALLINT NOT NULL,
       CONSTRAINT Produit_PK PRIMARY KEY(RefProduit),
       CONSTRAINT Produit_AK UNIQUE(Designation)
    );
     
    CREATE TABLE Devis
    (
       NumDevis char(3) not null,
       DateDevis DATE NOT NULL,
       CONSTRAINT Devis_PK PRIMARY KEY(NumDevis)
    );
     
    CREATE TABLE LigneDevis
    (
       RefProduit CHAR(3),
       NumDevis char(3),
       Quantite SMALLINT NOT NULL,
       CONSTRAINT LigneDevis_PK PRIMARY KEY(RefProduit, NumDevis),
       CONSTRAINT LigneDevis_Produit_FK FOREIGN KEY(RefProduit) REFERENCES Produit(RefProduit) ON DELETE CASCADE,
       CONSTRAINT LigneDevis_Devis_FK FOREIGN KEY(NumDevis) REFERENCES Devis(NumDevis) ON DELETE CASCADE
    );
     
    (2) Création de quelques produits :
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    insert into Produit (RefProduit, Designation, Prix)
      values
        ('p01', 'bonbons', 100)
      , ('p02', 'caramels', 200)
      , ('p03', 'esquimaux', 300)
      , ('p04', 'chocolats', 400)
    ;
     
    Select * from Produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "refproduit"  "designation"  "prix"
     "p01"         "bonbons"      100
     "p02"         "caramels"     200
     "p03"         "esquimaux"    300
     "p04"         "chocolats"    400
     
    (3) Création de la vue comportant la jointure des tables Devis et LigneDevis
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create view DevisVue
      (NumDevis, DateDevis, RefProduit, Quantite)
    as 
      select x.NumDevis, x.DateDevis, y.RefProduit, y.Quantite  
      from Devis as x 
         join LigneDevis as y on x.NumDevis = y.NumDevis ;
     
    (4) Création de la fonction appelée par le trigger
     
    Code SQL : 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
    CREATE FUNCTION devis_vue_fonction() RETURNS trigger AS $$
    begin
      if
        (select count(NumDevis)
         from devis
         where NumDevis = new.NumDevis) = 0
       then
         insert into Devis
           values (new.NumDevis, new.DateDevis)  ;
      end if ;
     
      insert into LigneDevis
        values (new.NumDevis, new.RefProduit, new.Quantite)
      ;
      return null ;
    end ;
    $$ LANGUAGE plpgsql ;
     
    (5) Création du trigger utilisé pour la vue
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create trigger devis_vue_trigger instead of insert on DevisVue 
      for each row execute function devis_vue_fonction() 
    ;
     
    (6) Insert dans la vue :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into DevisVue (NumDevis, DateDevis, RefProduit, Quantite)
      values
        (1, '2000-01-01', 'p01', 100) 
      , (1, '2000-01-01', 'p02', 150)
      , (2, '2000-01-02', 'p01', 200)
    ;
     
    Au résultat
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Devis ;
     
     
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from LigneDevis ;
     
     
     
     
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #63
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour,
     
    A propos des triggers SQL Server et PostgreSQL

    A l’occasion des inserts dans les vues, j’avoue préférer l’approche SQL Server. En effet – voir le message ici, point (5) – celui-ci me passe une table INSERTED me permettant de faire un traitement ensembliste, ce qui est naturel dans un contexte relationnel. A l’opposé, je constate que PostgreSQL me force à effectuer un traitement ligne par ligne, point (5) :
     
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create trigger devis_vue_trigger instead of insert on DevisVue 
      for each row execute function devis_vue_fonction()
     
    Cela me fait penser à la programmation que je pratiquais en 1965 : accès séquentiel, un par un, aux enregistrements dans les fichiers...

    Irrésistiblement, me vient en tête la métaphore de la boîte de petits pois :

    Pour faire cuire les petits bois, j’ouvre la boîte et la verse directement dans la casserole (approche SQL Server, ensembliste), tandis je peux aussi récupérer chaque petit pois dans la boîte, chacun son tour, et le déposer (délicatement) dans la casserole (approche PostgreSQL, ligne par ligne).

    Je ne suis pas fin connaisseur de PostgreSQL, mais je suis surpris par l’approche non ensembliste : en gros, le trigger se contente d’effectuer un « open/close » et balance les lignes une par une à la fonction à laquelle il fait appel.

    @Fred,

    En plus de l’approche archaïque, je subodore que sur le plan des performances ça doit être moins bon qu’avec SQL Server... Qu’en penses-tu ?

    Accessoirement, MySQL (create trigger ... for each row) et PostgreSQL même combat (ligne par ligne).

    Au plaisir
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  4. #64
    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
    La doc de MariaDB est muette qur la signification de "FOR EACH ROW".

    MySQL en parle un peu plus mais le FOR EACH ROW reste obligatoire :
    Citation Envoyé par MySQL
    The statement following FOR EACH ROW defines the trigger body; that is, the statement to execute each time the trigger activates, which occurs once for each row affected by the triggering event.
    Celle de PostgreSQL par contre, dit ceci :
    Citation Envoyé par PostgreSQL
    Un déclencheur marqué FOR EACH ROW est appelé pour chaque ligne que l'opération modifie. Par exemple, un DELETE affectant dix lignes entraîne dix appels distincts de tout déclencheur ON DELETE sur la relation cible, une fois par ligne supprimée. Au contraire, un déclencheur marqué FOR EACH STATEMENT ne s'exécute qu'une fois pour une opération donnée, quelque soit le nombre de lignes modifiées (en particulier, une opération qui ne modifie aucune ligne résulte toujours en l'exécution des déclencheurs FOR EACH STATEMENT applicables). Notez qu'avec un INSERT utilisant une clause ON CONFLICT DO UPDATE, un trigger au niveau requête sera exécuté pour un INSERT ou un UPDATE.

    Les déclencheurs définis en remplacement (INSTEAD OF) doivent obligatoirement être marqués FOR EACH ROW, et ne peuvent être définis que sur des vues. Les déclencheurs BEFORE et AFTER portant sur des vues devront quant à eux être marqués FOR EACH STATEMENT.
    Le FOR EACH ROW est donc obligatoire sur les TRIGGER INSTEAD OF mais pas sur un trigger simple.
    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. #65
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Merci Philippe pour l'information.

    Dans mon cas (insert dans une vue), je n'ai donc, hélas ! pas le choix...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #66
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    La doc de MariaDB est muette sur la signification de "FOR EACH ROW".
    Le FOR EACH ROW est donc obligatoire sur les TRIGGER INSTEAD OF mais pas sur un trigger simple.
    Quoi qu'il en soit, ni MariaDB ni MySQL ne proposent des TRIGGER "instead OF"

  7. #67
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir,
    La solution PostgreSQL proposée par François me parait sympathique, bien lisible, et donc assez facile à expliquer à mes chers étudiants.
    Et pour être complet, il faut aussi empêcher la suppression de la dernière ligne d'un devis... Je suppute un petit trigger pour contrôler ça, non ?
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  8. #68
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir,
    Voici ma proposition PostgreSQL pour régler le problème de la suppression de la dernière ligne d'un devis :
    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 FUNCTION Delete_Ligne() RETURNS TRIGGER AS '
    BEGIN
        IF (SELECT COUNT(*) FROM LigneDevis WHERE NumDevis=OLD.NumDevis) > 1
        THEN
            RETURN OLD;
        ELSE
            RAISE integrity_constraint_violation;
            RETURN NULL;
        END IF;
    END;
    ' LANGUAGE plpgsql;
    
    CREATE TRIGGER T_Delete_Ligne BEFORE DELETE ON LigneDevis
    FOR EACH ROW EXECUTE FUNCTION Delete_Ligne();
    Simple, mais a priori opérationnel !
    Qu'en pensez-vous
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  9. #69
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Ave Paprick,

    Citation Envoyé par Paprick Voir le message
    Voici ma proposition PostgreSQL pour régler le problème de la suppression de la dernière ligne d'un devis :
    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 FUNCTION Delete_Ligne() RETURNS TRIGGER AS '
    BEGIN
        IF (SELECT COUNT(*) FROM LigneDevis WHERE NumDevis=OLD.NumDevis) > 1
        THEN
            RETURN OLD;
        ELSE
            RAISE integrity_constraint_violation;
            RETURN NULL;
        END IF;
    END;
    ' LANGUAGE plpgsql;
    
    CREATE TRIGGER T_Delete_Ligne BEFORE DELETE ON LigneDevis
    FOR EACH ROW EXECUTE FUNCTION Delete_Ligne();
    Simple, mais a priori opérationnel !
    Qu'en pensez-vous
    Petit problème quand même : on ne peut plus supprimer les devis...

    Je suis noyé dans la masse hétérogène des messages de la discussion, peux-tu en ouvrir une nouvelle, dédiée à ce problème...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #70
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    J’ai essayé ce qui suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into Devis(NumDevis, DateDevis) values (1, '2000-01-01') ;
    insert into LigneDevis( RefProduit, NumDevis, Quantite)
    values ('p01', 1, 150), ('p02', 1, 200) ;
     
    puis
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table Lignedevis disable trigger T_Delete_Ligne ;
     
    delete from devis where numdevis = 1 ;
     
    Ça se passe bien, le devis a été supprimé avec ses lignes !
    Je n’ai plus qu’à réactive le trigger :
     
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     alter table Lignedevis enable trigger T_Delete_Ligne ;
     
    That's all folks!

    Il est quand même dommage de devoir en passer par un alter table, contrairement à SQL Server...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  11. #71
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Hello !
    Toujours aussi vigilant François !
    J'ai une autre solution qui pourrait vous plaire : si le devis est supprimé, on accepte la suppression de toutes les lignes.
    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
    CREATE FUNCTION Delete_Ligne() RETURNS TRIGGER AS '
    BEGIN
      IF ((SELECT COUNT(*) FROM LigneDevis WHERE NumDevis=OLD.NumDevis) > 1)
      OR ((SELECT COUNT(*) FROM Devis WHERE NumDevis=OLD.NumDevis) = 0)
      THEN
         RETURN OLD;
      ELSE
         RAISE integrity_constraint_violation;
         RETURN NULL;
       END IF;
    END;
    ' LANGUAGE plpgsql;
    
    CREATE TRIGGER T_Delete_Ligne BEFORE DELETE ON LigneDevis
    FOR EACH ROW EXECUTE FUNCTION Delete_Ligne();
    Je pense avoir testé tous les cas, et ça a l'air de bien fonctionner ...
    Mais est-ce à l'épreuve des balles de François ?
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  12. #72
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Paprick Voir le message
    Hello !
    Toujours aussi vigilant François !
    J'ai une autre solution qui pourrait vous plaire : si le devis est supprimé, on accepte la suppression de toutes les lignes.
    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
    CREATE FUNCTION Delete_Ligne() RETURNS TRIGGER AS '
    BEGIN
      IF ((SELECT COUNT(*) FROM LigneDevis WHERE NumDevis=OLD.NumDevis) > 1)
      OR ((SELECT COUNT(*) FROM Devis WHERE NumDevis=OLD.NumDevis) = 0)
      THEN
         RETURN OLD;
      ELSE
         RAISE integrity_constraint_violation;
         RETURN NULL;
       END IF;
    END;
    ' LANGUAGE plpgsql;
    
    CREATE TRIGGER T_Delete_Ligne BEFORE DELETE ON LigneDevis
    FOR EACH ROW EXECUTE FUNCTION Delete_Ligne();
    Je pense avoir testé tous les cas, et ça a l'air de bien fonctionner ...
    Mais est-ce à l'épreuve des balles de François ?
    J’ai essayé de dézinguer tout ça avec mon char Patton, d’abord avec les 3 mitrailleuses, puis avec le canon de 90 :

    Caramba ! ton trigger a tenu le choc et en me faisant des pieds-de-nez qui plus est...

    C’est toi le meilleur...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  13. #73
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Hello !

    Je pense que je peux marquer "résolu". Des avis contraires ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  14. #74
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir,
    Citation Envoyé par fsmrel Voir le message
    Je pense que je peux marquer "résolu". Des avis contraires ?
    Je pense effectivement qu'on a fait le tour du problème .
    Et c'était ton 8000ème message François !!!
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  15. #75
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    ...
    Je ne suis pas fin connaisseur de PostgreSQL, mais je suis surpris par l’approche non ensembliste : en gros, le trigger se contente d’effectuer un « open/close » et balance les lignes une par une à la fonction à laquelle il fait appel.
    D'autant que l'approche ensembliste peut être détournée par un curseur pour faire du ligne à ligne, mais pas l'inverse !!!
    Mais tu n'as pas vu le meilleur si l'approche ligne à ligne de PostGreSQL... Démo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE T (C INT PRIMARY KEY);
    INSERT INTO T VALUES (1), (2), (3);
    UPDATE T SET C = C + 1;
    Jolie réponse !!!!

    Citation Envoyé par fsmrel Voir le message

    @Fred,

    En plus de l’approche archaïque, je subodore que sur le plan des performances ça doit être moins bon qu’avec SQL Server... Qu’en penses-tu ?

    Accessoirement, MySQL (create trigger ... for each row) et PostgreSQL même combat (ligne par ligne).

    Au plaisir
    Ben oui... ça fait des années que je dis que PG est un veau ! À la caisse de retraite des cadres Agic Arco ils ont remplacé DB2 par PostGreSQL... Bilan des opérations la base qui faisait 2 To sous DB2 (compression activée) est passé à près de 10 To sous PG... Devenue tellement lente que embauche massive de dev et DBA pour tenter de résoudre un tonneau des danaïdes ! Un vrai scandale car cela coûte à nos retraites....

    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/ * * * * *

  16. #76
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    À la caisse de retraite des cadres Agic Arco ils ont remplacé DB2 par PostGreSQL...
     
    Comme dit M’sieur Fernand dans les tontons flingueurs, je cite :
     
    « Les c... ça ose tout, et c’est même à ça qu’on les reconnaît... »
     
    Cela dit, ça fait 20 ans que c’est l’Agirc-Arrco qui à son tour me donne des sous. En tout cas, comme dit Raoul Volfoni :
     
    « Si c’est notre pognon qu’y sont en train d’arroser, les p’ tits comiques, ça va saigner ! »
     
    J’ai testé ta requête avec SQL Server et PostgreSQL, effectivement y a pas photo...
     
    Ça évoque en moi le souvenir d’un film que j’ai vu vers la fin des années cinquante, « Règlements de comptes à O.K. Corral »…
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

Discussions similaires

  1. Pb au niveau des cardinalités
    Par sebac dans le forum Access
    Réponses: 1
    Dernier message: 26/04/2014, 10h08
  2. Niveau isolement des transactions
    Par lio33 dans le forum Débuter
    Réponses: 4
    Dernier message: 23/11/2005, 15h00
  3. Logs SQL des actions réalisées dans Enterprise Manager ?
    Par [DreaMs] dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2005, 12h14
  4. [Together] Gestion des cardinalités
    Par cladsam dans le forum Autres
    Réponses: 3
    Dernier message: 03/08/2005, 21h33
  5. [SQL Server 2000] Générer le script SQL des données
    Par Giovanny Temgoua dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/03/2005, 18h35

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