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

Requêtes PostgreSQL Discussion :

Violation de l'intégrité référentielle


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut Violation de l'intégrité référentielle
    Salut
    La situation...
    Les tables tm et tf (tf liée à tm par une intégrité référentielle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table tm(idm serial not null primary key, vm varchar);
    create table tf(idf serial not null primary key, idm int not null references tm(idm) on delete cascade, vf varchar);
    Un fonction trigger qui annule la suppression dans tf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    --le trigger
    create function tgtf() returns trigger
    as
    $$
    begin
    return null;
    end
    $$ language plpgsql
     
    --liaison à tf
    create trigger tgf before delete on tf
     FOR EACH ROW
      EXECUTE PROCEDURE tgtf();
    insertion de données dans tm et tf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into tm(vm) values('a'),('b'),('c');
    insert into tf(idm, vf) values(1, 'a1'),(1, 'a2'), (2, 'b1'), (2, 'b2'),(3, 'c1'),(3, 'c2');
    suppression d'une ligne de tm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from tm where idm=1;
    la jointure gauche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select tf.idm, tf.vf, tm.idm from tf left join tm on tf.idm=tm.idm;
    idm vf idm
    1 a1
    1 a1
    2 b1 2
    2 b2 2
    3 c1 3
    3 c2 3
    Qu'en dites-vous?
    J'avais une fois remarqué qu'une des mes bd présentait ce problème (violation d'intégrité référentielle) sans que je ne sache comment c'est arrivé. Maintenant que j'ai reproduit la situation, je veux comprendre le problème.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Évite les déclencheurs BEFORE !... ça devrait pas exister dans les SGBDR, si ces derniers étaient tous capable de faire des contraintes CHECK et des assertions, comme la norme SQL l'a prévue.
    De plus, comme les déclencheurs PG ne sont pas ensemblistes...
    En effet, dans certains SGBDR (PG en l’occurrence) cela donne des résultats hasardeux !
    Note que je n'ai pas dit faux !!!!

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

  3. #3
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    SQLpro, pour une fois j'aurais été TOTALEMENT d'accord avec vous "C'EST TOTALEMENT FAUX". Puisque le comportement produit une transaction non ACID.
    Le problème n'est pas de "TRIGGER BEFORE" mais plutôt l'effet de "RETURN NULL". Je cite la documentation...
    Il peut retourner un pointeur NULL pour sauter l'opération pour la ligne courante. Ceci donne comme instruction à l'exécuteur de ne pas exécuter l'opération niveau ligne qui a lancé le déclencheur (l'insertion, la modification ou la suppression d'une ligne particulière de la table).
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    Salut
    SQLpro, pour une fois j'aurais été TOTALEMENT d'accord avec vous "C'EST TOTALEMENT FAUX". Puisque le comportement produit une transaction non ACID.
    Le problème n'est pas de "TRIGGER BEFORE" mais plutôt l'effet de "RETURN NULL". Je cite la documentation...

    @+
    Ha oui, elle est belle celle là.... C'est navrant !

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

Discussions similaires

  1. [Héritage] problème intégrité référentielle
    Par Ouark dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/01/2006, 19h47
  2. Réponses: 7
    Dernier message: 06/12/2005, 16h25
  3. Intégrité référentielle entre 2 schémas
    Par Fabien Celaia dans le forum Oracle
    Réponses: 2
    Dernier message: 21/11/2005, 10h51
  4. Réponses: 5
    Dernier message: 26/10/2005, 15h43
  5. Types de tables - Support des Intégrités référentielles
    Par danuz dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 11/12/2004, 16h43

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