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

Langage SQL Discussion :

Droits de tous les utilisateurs sur un objet


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de scrouet
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 280
    Points : 105
    Points
    105
    Par défaut Droits de tous les utilisateurs sur un objet
    Bonjour.

    Mon site utilise un système de gestion de droits pour déterminer le type d'accès de chaque utilisateur sur plusieurs objets.
    D'un côté j'ai les tables des utilisateurs et des objets, indexées par des clefs autoincrémentées. De l'autre j'ai la table des droits qui permet de faire la liaison entre un utilisateur et un objet (référencés par leurs identifiants), avec les droits associés pour chaque couple. Par défaut, lorsque un couple utilisateur-objet est absent de la table des droits, c'est que l'utilisateur n'a aucun droit sur l'objet en question.
    Je souhaite afficher les droits de tous les utilisateurs sur un objet y compris les utilisateurs n'ayant aucun droit sur l'objet.
    Je peux bien entendu faire ça en deux requêtes, l'une sur la table des utilisateurs et l'autre sur la table des droits et faire ensuite mes comparaisons par script. Mais quelque chose me dit que je dois pouvoir faire ça en une seule requête et obtenir quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Id_utilisateur | Nom    | Prenom | Droits
    1              | DURAND | Paul   | rw
    2              | DUPONT | Jean   | ro
    3              | MARTIN | Pierre | NULL
    Seulement voilà, je ne trouve pas comment faire ma requête de jointure pour y arriver.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il suffit de faire une jointure externe entre vos deux tables.

  3. #3
    Membre régulier Avatar de scrouet
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 280
    Points : 105
    Points
    105
    Par défaut
    Une jointure externe ? Comment ?
    Pour information j'utilise une base MySQL, mais je préférerais faire du SQL standard de façon à pouvoir facilement changer de SGBD

  4. #4
    Membre régulier Avatar de scrouet
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 280
    Points : 105
    Points
    105
    Par défaut
    J'ai trouvé une solution en créant une pseudo-table dans la requête pour lister tous les couples possibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT couples.per_id, couples.obj_id, dro.dro_droits
    FROM (
         SELECT DISTINCT per.per_id, obj.obj_id
         FROM t_personnes per, t_objets obj) as couples
    LEFT JOIN t_droits dro USING (per_id, obj_id)
    Peut-être pas très élégant ni performant, mais ça fonctionne.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Plus élégant et probablement plus rapide s'il y a beaucoup de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.per_id, o.obj_id, d.dro_droits
    FROM t_personnes AS p
    LEFT OUTER JOIN t_droits AS d ON p.per_id = d.per_id
      LEFT OUTER JOIN t_objets AS o ON d.obj_id = o.obj_id

  6. #6
    Membre régulier Avatar de scrouet
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 280
    Points : 105
    Points
    105
    Par défaut
    En fait votre requête ne fonctionne pas avec les utilisateurs pour lesquels aucun droit n'a été défini.
    Au lieu d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Id_utilisateur | Nom    | Prenom | Droits
    1              | DURAND | Paul   | rw
    2              | DUPONT | Jean   | ro
    3              | MARTIN | Pierre | NULL
    elle ne donne que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Id_utilisateur | Nom    | Prenom | Droits
    1              | DURAND | Paul   | rw
    2              | DUPONT | Jean   | ro

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    C'est que vous avez mal fait votre jointure externe.
    Pouvez-vous fournir un jeu d'essai ?

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par scrouet Voir le message
    En fait votre requête ne fonctionne pas avec les utilisateurs pour lesquels aucun droit n'a été défini.
    Au lieu d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Id_utilisateur | Nom    | Prenom | Droits
    1              | DURAND | Paul   | rw
    2              | DUPONT | Jean   | ro
    3              | MARTIN | Pierre | NULL
    elle ne donne que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Id_utilisateur | Nom    | Prenom | Droits
    1              | DURAND | Paul   | rw
    2              | DUPONT | Jean   | ro
    Etant donné que les entêtes de colonne de votre résultat ne sont pas les colonnes du SELECT de ma requête, vous n'avez pas utilisé ma requête.

    Pouvez-vous nous donner votre requête qui donne le résultat que vous annoncez ?

  9. #9
    Membre régulier Avatar de scrouet
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 280
    Points : 105
    Points
    105
    Par défaut
    Voici un jeu de données :
    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
     
    CREATE TABLE IF NOT EXISTS `t_droits` (
      `Per_ID` tinyint(4) NOT NULL,
      `Obj_ID` tinyint(4) NOT NULL,
      `Dro_Droits` varchar(2) default 'ro',
      UNIQUE KEY `Couple` (`Per_ID`,`Obj_ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    INSERT INTO `t_droits` (`Per_ID`, `Obj_ID`, `Dro_Droits`) VALUES
    (1, 1, 'rw'),
    (2, 1, 'ro'),
    (3, 1, 'ro'),
    (3, 4, 'rw'),
    (1, 4, 'ro');
     
    CREATE TABLE IF NOT EXISTS `t_objets` (
      `Obj_ID` tinyint(4) NOT NULL auto_increment,
      `Obj_Nom` varchar(30) NOT NULL,
      PRIMARY KEY  (`Obj_ID`),
      UNIQUE KEY `Obj_Nom` (`Obj_Nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
     
    INSERT INTO `t_objets` (`Obj_ID`, `Obj_Nom`) VALUES
    (1, 'Objet_1'),
    (4, 'Objet_4');
     
    CREATE TABLE IF NOT EXISTS `t_personnes` (
      `Per_ID` tinyint(4) NOT NULL auto_increment,
      `Per_Nom` varchar(30) NOT NULL,
      `Per_Prenom` varchar(30) NOT NULL,
      PRIMARY KEY  (`Per_ID`),
      UNIQUE KEY `Personne` (`Per_Nom`,`Per_Prenom`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
     
    INSERT INTO `t_personnes` (`Per_ID`, `Per_Nom`, `Per_Prenom`) VALUES
    (1, 'DURAND', 'Paul'),
    (2, 'DUPONT', 'Jean'),
    (3, 'MARTIN', 'Pierre');
    La requête de CinePhil donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    per_id|obj_id|dro_droits
         1|     1|rw
         1|     4|ro
         2|     1|ro
         3|     1|ro
         3|     4|rw
    Et la mienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    per_id|obj_id|dro_droits
         1|     1|rw
         1|     4|ro
         2|     1|ro
         2|     4|NULL
         3|     1|ro
         3|     4|rw

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Effectivement, je comprends mieux le besoin et votre solution est bonne.

  11. #11
    Membre régulier Avatar de scrouet
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 280
    Points : 105
    Points
    105
    Par défaut
    Ce n'était donc qu'un petit problème d'incompréhension
    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/10/2011, 00h25
  2. Verifier droit utilisateur sur un objet de la base
    Par acama dans le forum Sécurité
    Réponses: 2
    Dernier message: 06/02/2011, 18h32
  3. [WS 2008] Mettre une icône sur le bureau de TOUS les utilisateurs
    Par iubito dans le forum Windows Serveur
    Réponses: 8
    Dernier message: 23/09/2009, 16h37
  4. Eviter d'inviter tous les utilisateurs au groupe root
    Par ggnore dans le forum Administration système
    Réponses: 24
    Dernier message: 21/10/2004, 20h19

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