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

MySQL Discussion :

Client avec table unique


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Mars 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Mars 2016
    Messages : 34
    Points : 25
    Points
    25
    Par défaut Client avec table unique
    Bonjour,

    J'ai une table qui regroupe des clients avec leur données (nom, prénom, login, mdp...) et je souhaite que chaque insertion d'un client crée une table "événement" (date début, date fin...) qui lui soit lié. Cette table sera vide au début . Pour faire cette liaison je pensais lié l'id du client et le lié au nom de la table.
    Exemple : Insertion de le client id=34 donc création de la table "événement 34".

    Est-ce une bonne idée de lié les tables comme ça?
    Si oui puis je seulement utilisé un ID auto incrémenter et unique (donc seulement des chiffres) ou en créer un plus complexe ?
    Quel serait votre méthode?

    Merci pour votre aide.

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Mathaousse.

    Ce n'est une bonne idée, pour chaque nouveau client , de créer une nouvelle table de nom "évènement + identifiant du client".
    Si tu as 3.000 clients, tu as 3.000 tables ! Est-ce bien ce que tu désires faire ?

    Pour répondre à ta question, il me faut plus d'explication sur ce que tu désires faire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Mars 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Mars 2016
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Merci de ton aide,

    Oui c'est que je souhaite faire. Etant donné que ce sont données sensibles je ne souhaite pas les mettre toutes dans la même table comme ça chaque client ne peut accéder qu'a sa table. Je ne sais pas ce que ça peut donner en terme de performance.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Tu peux mettre tes données dans une seule table et mettre les données à disposition des clients à travers une vue pour chacun, qui filtrera les données de ce client.
    As-tu réfléchi que si tu as une table par client, toutes tes opérations, toutes tes requêtes devront être spécifiques à ce client ?

    Une autre possibilité si tu veux réellement isoler les données de chaque client c'est de placer ces tables dans un schéma propre à chacun, les tables communes étant placées dans un schéma à part.
    Chaque schéma comporte alors les mêmes noms de tables, les mêmes structures. L'environnement change alors en fonction de l’identifiant de connexion.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Mars 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Mars 2016
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Une autre possibilité si tu veux réellement isoler les données de chaque client c'est de placer ces tables dans un schéma propre à chacun, les tables communes étant placées dans un schéma à part.
    Chaque schéma comporte alors les mêmes noms de tables, les mêmes structures. L'environnement change alors en fonction de l’identifiant de connexion.
    C'est plutôt la vision que j'avais. Je ne suis pas expert comme vous donc je ne sais pas exactement ce qu'est un schéma. D'après mes recherches rapides j'ai trouvé que schema = base de donnée. Pouvez vous m'éclairer?

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    @ al1_24 : sous mysql, il n'existe aucune différence entre la notion de schema et celle de database. Autrement dit, les deux mots sont synonymes !

    @ Mathaousse : la solution est bien de créer une et une seule table de nom "événement".
    Il vous faut distinguer les lignes par le nom de l'utilisateur et le nom d'hôte.
    Il vous suffira de vous inspirer de cet exemple afin de l'adapter à votre besoin.

    Voici l'exécution du script de création de la base 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
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = latin1_general_ci
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    drop table if exists `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `user`      char(20)          NOT NULL,
      `champ`     varchar(255)      NOT NULL,
      PRIMARY KEY (`user`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`user`,`champ`) values
      ("user1@localhost", "J'habite à Paris"),
      ("user2@localhost", "J'habite à Monaco")
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----------------+-------------------+
    | user            | champ             |
    +-----------------+-------------------+
    | user1@localhost | J'habite à Paris  |
    | user2@localhost | J'habite à Monaco |
    +-----------------+-------------------+
    --------------
    CREATE VIEW vue AS
      SELECT user, champ
      FROM test
      WHERE user = USER()
    --------------
     
    --------------
    select * from vue
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    L'important dans cet exemple est la view.

    Voici les privilèges des utilisateurs que vous devrez faire dans votre base 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
    39
    40
    41
    42
    --------------
    drop user   'user1'@'localhost'
    --------------
     
    --------------
    drop user   'user2'@'localhost'
    --------------
     
    --------------
    create user 'user1'@'localhost'
    --------------
     
    --------------
    create user 'user2'@'localhost'
    --------------
     
    --------------
    grant usage on *.* to 'user1'@'localhost'
    --------------
     
    --------------
    grant usage on *.* to 'user2'@'localhost'
    --------------
     
    --------------
    grant select,insert,update,delete on `base`.`vue` to 'user1'@'localhost'
    --------------
     
    --------------
    grant select,insert,update,delete on `base`.`vue` to 'user2'@'localhost'
    --------------
     
    --------------
    SET PASSWORD FOR 'user1'@'localhost' = PASSWORD('')
    --------------
     
    --------------
    SET PASSWORD FOR 'user2'@'localhost' = PASSWORD('')
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Pour la simplification de ce test, je n'ai que deux utilisateurs.

    Comment utiliser la view afin de ne faire voir à tel utilisateur que ce qu'il à droit de voir.
    1) vous devez faire en sorte que l'utilisateur doit se connecter avec les autorisations que vous venez de créer.
    2) lors de l'accès à la view, c'est elle qui va récupérer cette information, afin de sélectionner le sous-ensemble des lignes pour cet utilisateur.

    Voici le script batch windows :
    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
    @echo off
    
    setlocal enableDelayedExpansion
    
    chcp 1252 > nul
    
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
    
    SET FIC=%~nx0
    SET FIC=%FIC:bat=sql%
    
    mysql < %FIC%  --verbose  --force  --user=user1  --password=  --host=localhost
    @echo.
    pause
    exit
    Ici, l'utilisateur se nomme 'user1' ! Pas de mot de passe. L'hôte est 'localhost'.

    Voici l'exécution de la view :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql: [Warning] Using a password on the command line interface can be insecure.
    --------------
    SELECT * FROM vue
    --------------
     
    +-----------------+------------------+
    | user            | champ            |
    +-----------------+------------------+
    | user1@localhost | J'habite à Paris |
    +-----------------+------------------+
     
    Appuyez sur une touche pour continuer...
    On remarque que seulement la ligne qui est attribuée à l'utilisateur "user1" est sélectionnée.

    L'autre test est similaire sauf que l'utilisateur est maintenant "user2".
    Voici le script batch windows :
    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
    @echo off
    
    setlocal enableDelayedExpansion
    
    chcp 1252 > nul
    
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
    
    SET FIC=%~nx0
    SET FIC=%FIC:bat=sql%
    
    mysql < %FIC%  --verbose  --force  --user=user2  --password=  --host=localhost
    @echo.
    pause
    exit
    La seule différence avec le script batch windows est le nom de l'utilisateur "user2".
    Et voici l'exécution de la view :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql: [Warning] Using a password on the command line interface can be insecure.
    --------------
    SELECT * FROM vue
    --------------
     
    +-----------------+-------------------+
    | user            | champ             |
    +-----------------+-------------------+
    | user2@localhost | J'habite à Monaco |
    +-----------------+-------------------+
     
    Appuyez sur une touche pour continuer...
    Et pour terminer, le test d'accès de l'utilisateur "user1" (ce sera exactement la même chose avec l'utilisateur "user2") sur la table "test".

    Le script batch windows pour l'utlisateur "user1" est le même que ci-dessus, donc je ne le redonne pas.
    Et voici l'exécution de l'accès à la table "test" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mysql: [Warning] Using a password on the command line interface can be insecure.
    --------------
    select * from test
    --------------
     
    ERROR 1142 (42000) at line 3: La commande 'SELECT' est interdite à l'utilisateur: 'user1'@'@localhost' sur la table 'test'
     
    Appuyez sur une touche pour continuer...
    Comme on le voie, l'utilisateur ne peut pas accéder à la table "test".

    Cette façon d'accéder aux données, vous permettra de visualiser que ce que l'utilisateur doit voire.

    Si vous avez des questions, n'hésitez pas.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Candidat au Club
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Merci Artemus24, tu me sauves monsieur !

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Mars 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Mars 2016
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Effectivement je te remercie de ta réponse. Je n'ai pas eu le temps de la tester mais cela semble correspondre à ce que je cherchais.

  9. #9
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Cette question me semble plus porter sur un problème de conception q'un problème Mysql.

    Il aurait été plus pertinent de la poster sur le forum MERISE.

    Pierre

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Pier.Antoine.

    Non, il ne s'agit pas d'un problème de conception mais d'un problème de sécurité.
    Mathaousse indique dès son post #3 que se sont des données sensibles et que les autres utilisateurs ne doivent pas avoir accès.
    Seul l'utilisateur concerné doit pouvoir consulter ses données et non celles des autres.

    La solution de Mathaousse consistait à créer une table pour chaque utilisateur.
    Ce que je lui est proposé, c'est de créer une seule table mais avec un accès sécurisé aux données.
    De cette façon, les données sont bien compartimentées et sécurisées.

    Et comme tu as dû le remarquer, on n'a jamais parlé du contenu de la table, ni de la nature des données.
    Donc il y a aucune raison de mettre ce sujet dans le forum consacré à Merise.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour ARtemus,

    En effet, cette conversation ne concerne peut-être pas vraiment Merise, mais je reste persuadée qu'elle ne devrait pas être posée sur un forum MySQL.
    Le problème évoqué n'est pas spécifique à un SGBD.

    Mais bon ce ne sont que des détails.

    Pierre

  12. #12
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Pier.antoine.

    Citation Envoyé par pier.antoine
    mais je reste persuadée qu'elle ne devrait pas être posée sur un forum MySQL.
    Pourquoi ?
    Le problème soulevé concerne la sécurité des données dans la base de données.
    Une seule table, mais plusieurs utilisateurs.
    Comment faites_vous pour dire que tel utilisateur à un droit de regard que sur quelques lignes, voire aussi quelques colonnes ?
    La solution consiste à passer par une View comme dans l'exemple basique que j'ai donné.

    Citation Envoyé par pier.antoine
    Mais bon ce ne sont que des détails.
    Non, ce ne sont pas que des détails mais bien un problème de sécurité.
    Ou alors, je n'ai pas compris le sens de ce que vous appelez "détail".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  13. #13
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonsoir

    "Détails" s'appliquait à savoir si la place de cette discussion était le forum Merise ou le forum MySQL.

    Je ne mets pas en doute que c'est un problème de sécurité.
    Je pense que cela concerne plus une vision globale de la base de données que l'utilisation précise de MySQL, mais qu'importe.

    Pierre

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

Discussions similaires

  1. Table client, commande nombre de client avec n commandes
    Par sakini dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/06/2011, 10h01
  2. Requête sur 2 tables avec ligne unique sur 2° table ?
    Par gaucthier dans le forum Requêtes
    Réponses: 0
    Dernier message: 17/02/2010, 11h18
  3. Table client avec famille et sous famille
    Par looping dans le forum Schéma
    Réponses: 1
    Dernier message: 03/04/2009, 12h59
  4. Réponses: 8
    Dernier message: 26/12/2008, 17h50
  5. [SSAS]Cube avec une table unique
    Par jdmbh dans le forum SSAS
    Réponses: 1
    Dernier message: 24/04/2008, 10h20

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