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

Firebird Discussion :

Gestion des utilisateurs


Sujet :

Firebird

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut Gestion des utilisateurs
    Bonjour,
    Je souhaite vos lumières sur le principe de gestion des utilisateurs.

    J'ai déjà fait plusieurs application avec Firebird en Base de données.
    D'ordinaire, je créer une table Users dans laquelle je place mes champs afin de stocker les utilisateurs et les transactions auquelles ils peuvent accéder.
    J'entends par "Transaction", les formulaires dans l'application client.
    Exemple de table utilisateur :
    ID_User Nom Prenom Transaction 1 Transaction 2 Transaction 3
    1 Toto Lolo OUI OUI OUI
    2 Riri Loulou OUI NON OUI
    3 Phiphi Doudou NON OUI NON

    Ensuite, dans mon application, lorsque l'utilisateur essaye de lancer la Transaction 1, 2 ou 3, j'ouvre une requete Select pour savoir si l'utilisateur connecté dispose des accès à la transaction (OUI/NON).

    Je me questionne de plus en plus sur cette pratique car j'ai vu qu'on pouvait créer des domaines etc... Mais je ne vois pas du tout comment exploiter ça pour optimiser mes pratiques. Sachant que je n'ai jamais eu de problème jusqu'à ce jour.

    Merci de me donner votre avis sur cet exemple.

    A bientôt,

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Tout d'abord il y a confusion a minima dans le titre, je pensai qu'il s'agissait de la gestion des utilisateurs Firebird et non d'une la table utilisateurs d'une application.

    Ensuite votre table Utilisateurs d'un point de vue SGBD c'est loin d'être le top (3 colonnes transaction ...)

    Rapidement, voilà comment je ferais en incluant la notion de groupe
    table groupes (id_groupe,nom)
    table utilisateur (id_utilisateur, nom, prenom, id_groupe, mdp)
    table formulaire (id_form,Nom) // je préfère formulaire ou fonctionnalité à transaction pour éviter les confusions
    table droits_groupe (id,id_groupe,id_transaction,acces)
    table droits_utilisateur(id,id_utilisateur,id_transaction,acces)
    En mâtinant tout ça de contraintes de clé (FOREIGN KEY) pour la bonne tenue des tables

    pour obtenir un résultat il n'y aurait qu'à faire une requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COALESCE(COALESCE(DU.ACCES,DG.ACCES),'NON') AS DROIT 
    FROM DROITS_UTILISATEURS DU 
             JOIN UTILISATEUR U ON U.ID_UTILISATEUR=DU.ID_UTILISATEUR
             LEFT JOIN DROITS_GROUPE DG ON DG.ID_GROUPE=DU.ID_GROUPE AND DG.ID_TRANSACTION=DU.ID_TRANSACTION
    WHERE ID_UTILISATEUR=? AND ID_TRANSACTION=?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bonsoir, merci pour ton exemple que je pense avoir compris.
    Du coup, avec ton modèle, un utilisateur peut appartenir à un groupe et hériter des formulaires attribués aux groupes, et l'utilisateur peut également disposer d'accès spécifiques en dehors des groupes c'est ça ?

    Par contre, si jamais la table Droits_groupe autorise l'accès à un formulaire, et que ce même formulaire est non autorisé dans la table Droits_utilisateur, alors COALESCE renverra 'NON' alors que Droits_Groupe aurait pu renvoyer 'OUI'. Est-ce que j'interprète bien ? (c'est juste pour être sur que j'ai bien compris).
    Merci de ton aide.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par jojo86 Voir le message
    Du coup, avec ton modèle, un utilisateur peut appartenir à un groupe et hériter des formulaires attribués aux groupes, et l'utilisateur peut également disposer d'accès spécifiques en dehors des groupes c'est ça ?
    Oui
    Par contre, si jamais la table Droits_groupe autorise l'accès à un formulaire, et que ce même formulaire est non autorisé dans la table Droits_utilisateur, alors COALESCE renverra 'NON' alors que Droits_Groupe aurait pu renvoyer 'OUI'. Est-ce que j'interprète bien ? (c'est juste pour être sur que j'ai bien compris).
    C'est ça.
    Cela dit, j'ai écrit cela à l'arrache (fin de journée, fin de semaine) et donc sans trop tester le modèle.
    Le principe : le droit utilisateur prime que ce soit OUI ou NON , si le droit utilisateur n'existe pas et si l'utilisateur fait partie d'un groupe alors le droit du groupe s'applique.
    Je ne suis pas sûr que la règle "si le formulaire (transaction) n'existe pas alors 'NON'" soit effective

    J'ai juste jeté mes idées en vrac, je vais tenter d'en faire quelque chose de plus concret dans une petite base
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Donc voilà le DDL, ne sachant à quelle version de Firebird me vouer je n'ai pas utilisé de BOOLEAN et j'ai supprimé quelques trucs qui provenait de FB3 ma base de test
    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
     
    /****************** GENERATORS ********************/
     
    CREATE GENERATOR GEN_DROITS_ID;
    CREATE GENERATOR GEN_FONCTSAPPLI_ID;
    CREATE GENERATOR GEN_GROUPES_ID;
    CREATE GENERATOR GEN_UTILISATEUR_ID;
    /******************** DOMAINS *********************/
     
    CREATE DOMAIN VALDROIT
     AS Char(1)
     DEFAULT 'N'
     NOT NULL
     CHECK (VALUE IN ('O','N'))
     COLLATE WIN1252;
    /******************* PROCEDURES ******************/
     
    /******************** TABLES **********************/
     
    CREATE TABLE DROITS_GROUPE
    (
      ID Bigint NOT NULL,
      ID_GROUPE Bigint NOT NULL,
      ID_FONCTION Bigint NOT NULL,
      DROIT VALDROIT DEFAULT 'N',
      CONSTRAINT PK_DROITGRP PRIMARY KEY (ID)
    );
    CREATE TABLE DROITS_UTILISATEUR
    (
      ID Bigint NOT NULL,
      ID_UTILISATEUR Bigint NOT NULL,
      ID_FONCTION Bigint NOT NULL,
      DROIT VALDROIT DEFAULT 'N',
      CONSTRAINT PK_DROITUTIL PRIMARY KEY (ID)
    );
    CREATE TABLE FONCTSAPPLI
    (
      ID_FONCTION Bigint NOT NULL,
      DESC_FONCTION Varchar(30),
      CONSTRAINT PK_FONCTION PRIMARY KEY (ID_FONCTION)
    );
    CREATE TABLE GROUPES
    (
      ID_GROUPE Bigint NOT NULL,
      NOM_GROUPE Varchar(30),
      CONSTRAINT PK_GROUPE PRIMARY KEY (ID_GROUPE)
    );
    CREATE TABLE UTILISATEUR
    (
      ID_UTILISATEUR Bigint NOT NULL,
      LOGIN Varchar(30),
      NOM Varchar(30),
      PRENOM Varchar(30),
      ID_GROUPE Bigint NOT NULL,
      MDP Varchar(30),
      CONSTRAINT PK_UTILISATEUR PRIMARY KEY (ID_UTILISATEUR)
    );
    /********************* VIEWS **********************/
     
    /******************* EXCEPTIONS *******************/
     
    /******************** TRIGGERS ********************/
     
    SET TERM ^ ;
    CREATE TRIGGER DROITS_GROUPE_BI FOR DROITS_GROUPE ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GEN_DROITS_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_DROITS_ID, 0);
        if (tmp < new.ID) then
          tmp = GEN_ID(GEN_DROITS_ID, new.ID-tmp);
      END
    END^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER DROITS_UTILISATEUR_BI FOR DROITS_UTILISATEUR ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GEN_DROITS_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_DROITS_ID, 0);
        if (tmp < new.ID) then
          tmp = GEN_ID(GEN_DROITS_ID, new.ID-tmp);
      END
    END^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER FONCTSAPPLI_BI FOR FONCTSAPPLI ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID_FONCTION IS NULL) THEN
        NEW.ID_FONCTION = GEN_ID(GEN_FONCTSAPPLI_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_FONCTSAPPLI_ID, 0);
        if (tmp < new.ID_FONCTION) then
          tmp = GEN_ID(GEN_FONCTSAPPLI_ID, new.ID_FONCTION-tmp);
      END
    END^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER GROUPES_BI FOR GROUPES ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID_GROUPE IS NULL) THEN
        NEW.ID_GROUPE = GEN_ID(GEN_GROUPES_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_GROUPES_ID, 0);
        if (tmp < new.ID_GROUPE) then
          tmp = GEN_ID(GEN_GROUPES_ID, new.ID_GROUPE-tmp);
      END
    END^
    SET TERM ; ^
    SET TERM ^ ;
    CREATE TRIGGER UTILISATEUR_BI FOR UTILISATEUR ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID_UTILISATEUR IS NULL) THEN
        NEW.ID_UTILISATEUR = GEN_ID(GEN_UTILISATEUR_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_UTILISATEUR_ID, 0);
        if (tmp < new.ID_UTILISATEUR) then
          tmp = GEN_ID(GEN_UTILISATEUR_ID, new.ID_UTILISATEUR-tmp);
      END
    END^
    SET TERM ; ^
     
    ALTER TABLE DROITS_GROUPE ADD CONSTRAINT FK_DROITS_GROUPE_F
      FOREIGN KEY (ID_FONCTION) REFERENCES FONCTSAPPLI (ID_FONCTION) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE DROITS_GROUPE ADD CONSTRAINT FK_DROITS_GROUPE_G
      FOREIGN KEY (ID_GROUPE) REFERENCES GROUPES (ID_GROUPE) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE DROITS_UTILISATEUR ADD CONSTRAINT FK_DROITS_UTILISATEUR_F
      FOREIGN KEY (ID_FONCTION) REFERENCES FONCTSAPPLI (ID_FONCTION) ON UPDATE CASCADE ON DELETE CASCADE;
    ALTER TABLE DROITS_UTILISATEUR ADD CONSTRAINT FK_DROITS_UTILISATEUR_U
      FOREIGN KEY (ID_UTILISATEUR) REFERENCES UTILISATEUR (ID_UTILISATEUR) ON UPDATE CASCADE ON DELETE CASCADE;
    CREATE UNIQUE INDEX IDX_NOMFONCTION ON FONCTSAPPLI (DESC_FONCTION);
    CREATE UNIQUE INDEX IDX_NOMGROUPES ON GROUPES (NOM_GROUPE);
    ALTER TABLE UTILISATEUR ADD CONSTRAINT FK_UTILISATEUR_GROUPE
      FOREIGN KEY (ID_GROUPE) REFERENCES GROUPES (ID_GROUPE) ON UPDATE CASCADE ON DELETE CASCADE;
    CREATE UNIQUE INDEX IDX_LOGINUTILISATEUR ON UTILISATEUR (LOGIN);
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON DROITS_GROUPE TO  SYSDBA WITH GRANT OPTION;
     
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON DROITS_UTILISATEUR TO  SYSDBA WITH GRANT OPTION;
     
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON FONCTSAPPLI TO  SYSDBA WITH GRANT OPTION;
     
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON GROUPES TO  SYSDBA WITH GRANT OPTION;
     
    GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
     ON UTILISATEUR TO  SYSDBA WITH GRANT OPTION;
    comme je le supposai un SQL direct (au passage je l'ai légèrement modifié, il y avait deux erreurs dans ma version précédente), ne répond pas à la règle "si le formulaire (transaction) n'existe pas alors 'NON'"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COALESCE(COALESCE(DU.DROIT,DG.DROIT),'N') AS DROIT 
    FROM DROITS_UTILISATEUR DU 
             JOIN UTILISATEUR U ON U.ID_UTILISATEUR=DU.ID_UTILISATEUR
             LEFT JOIN DROITS_GROUPE DG ON DG.ID_GROUPE=U.ID_GROUPE AND DG.ID_FONCTION=DU.ID_FONCTION
    WHERE DU.ID_UTILISATEUR=4 AND DU.ID_FONCTION=1
    donc soit il faut traiter le null dans le programme soit passer par une procédure Firebird telle que celle-ci
    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
    SET TERM ^ ;
     
    CREATE PROCEDURE GETDROIT
     ( LOGIN VARCHAR(30),
       FONCTION VARCHAR(30) ) 
    RETURNS 
     ( DROIT CHAR(1))
    AS 
    DECLARE VARIABLE ID_USER BIGINT;
    DECLARE VARIABLE ID_FONCTION BIGINT;
     
    BEGIN
    SELECT ID_UTILISATEUR FROM UTILISATEUR 
           WHERE LOGIN=:LOGIN
           INTO :ID_USER;
     
    SELECT ID_FONCTION FROM FONCTSAPPLI 
           WHERE DESC_FONCTION=:FONCTION
           INTO :ID_FONCTION;
     
    SELECT COALESCE(COALESCE(DU.DROIT,DG.DROIT),'N') 
        FROM DROITS_UTILISATEUR DU 
             JOIN UTILISATEUR U ON U.ID_UTILISATEUR=DU.ID_UTILISATEUR
             LEFT JOIN DROITS_GROUPE DG ON DG.ID_GROUPE=U.ID_GROUPE AND DG.ID_FONCTION=DU.ID_FONCTION
    WHERE DU.ID_UTILISATEUR=:ID_USER AND DU.ID_FONCTION=:ID_FONCTION
    INTO :DROIT;
    IF (DROIT IS NULL) THEN DROIT='N'; 
    SUSPEND;             
    END^
     
    SET TERM ; ^
    permet de gérer soucis et même d'être plus facile à utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT p.DROIT FROM GETDROIT('LOGIN','TRANSACTION 3') p
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci beaucoup, par contre il y a plusieurs choses que je ne comprends pas...
    Peux-tu m'éclairer ?

    Je ne comprends pas le principe d'un domain... Je constate que tu declares VALDROIT et qu'ensuite tu utilise VALDROIT lorsque tu créer les champs Droit.
    Mais est-ce indispensable ? Car même sans domaine, nous pourrions créer des champs DROIT as Char(1) DEFAULT 'N' ?

    Ensuite, je ne comprends pas les CONSTRAINT que tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT PK_DROITUTIL PRIMARY KEY (ID)
    Pourquoi ne pas déclarer directement le champ ID en tant que Primary key comme ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID  INTEGER NOT NULL PRIMARY KEY
    Je ne comprends pas également les triggers avec l'utilisation d'une variable tmp :
    Autant je peux comprendre la première partie du trigger qui est classique et qui permet d'incrémenter le générateur, mais le Else Begin je ne comprends pas a quoi ça sert. Si on fait un INSERT, alors pourquoi NEW.ID aurait une autre valeur que NULL puisque c'est un insert, du coup je ne comprends pas pourquoi affecter la dernière valeur du générateur à la variable tmp et pourquoi tester If (tmp<new.ID) car dans ma tête New.ID est forcement null en cas d'insert. J'ai donc un problème de compréhension.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_DROITS_ID, 0);
        if (tmp < new.ID) then
          tmp = GEN_ID(GEN_DROITS_ID, new.ID-tmp);
    Pour le reste j'ai a peu prêt compris, je ne connaissais pas CASCADE et je comprends mieux à quel point je me prenait la tête pour gérer tout ça dans mes applis... Je devais penser à tenir à jour les liaisons entre mes tables par des updates si certaines données changeaient dans ma master table... Alors qu'en faite, le moteur de base de donnée est capable seul de gérer ça et de s'auto entretenir... Il faut juste lui dire quoi faire.

    Merci par avance pour ton aide.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par jojo86 Voir le message
    Je ne comprends pas le principe d'un domain... Je constate que tu declares VALDROIT et qu'ensuite tu utilise VALDROIT lorsque tu créer les champs Droit.
    Mais est-ce indispensable ? Car même sans domaine, nous pourrions créer des champs DROIT as Char(1) DEFAULT 'N' ?
    au départ je voulais créer un Booléen en fait Oui, on pourrait très bien s'en passer et rajouter une contrainte (CHECK VALUE IN ('O','N')) mais, du coup il aurait fallu établir 2 contraintes (une pour chaque table de droits, le fait d'avoir créé un domaine m'évite cela
    Ensuite, je ne comprends pas les CONSTRAINT que tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT PK_DROITUTIL PRIMARY KEY (ID)
    Pourquoi ne pas déclarer directement le champ ID en tant que Primary key comme ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID  INTEGER NOT NULL PRIMARY KEY
    c'est presque la même chose mais comme cela je peux donner un nom à la contrainte

    Je ne comprends pas également les triggers avec l'utilisation d'une variable tmp
    pour les triggers en fait c'est flamerobin qui me les construit ainsi je n'ai même pas fait l'effort de changer le type de NUMERIC(18,0) à BIGINT j'aurais dû
    pour ce qui est de la partie ELSE c'est qu'il faut prévoir une INSERTION où l'id ne serait pas à NULL.

    Alors qu'en faite, le moteur de base de donnée est capable seul de gérer ça et de s'auto entretenir..
    en grande partie c'est vrai j'ai tout mis en CASCADE mais il y aurait peut-être mieux valu mettre quelques RESTRICT tout dépend des choix de gestion voulu
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Super merci pour tes explications c'est top !
    Bon... Je ne pige toujours pas pourquoi prévoir une insertion ou l'ID ne serait pas à NULL car si je comprends le code tu trigger, si l'ID n'est pas null et je ne vois pas ce que pourrait calculer la fomule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp = GEN_ID(GEN_DROITS_ID, new.ID-tmp);
    Puisque juste au dessus tmp = GEN_ID(GEN_DROITS_ID, 0);
    Si tu pouvais me donner d'avantage d'explications je suis preneur.

    Et là tu m'en apprends une bonne... FlameRobin te créer automatiquement les Triggers ? Tu fais comment ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Une image valant tous les discours
    Nom : Capture.PNG
Affichages : 257
Taille : 38,1 Ko
    d'ailleurs je te remercie d'avoir posé la question, pour faire l'image j'ai agrandi la zone, du coup le mémo contenant le trigger s'est agrandi et je me suis aperçu (depuis le temps que j'utilise flamerobin )
    que je pouvais modifier le trigger avant de valider !

    Si tu pouvais me donner d'avantage d'explications je suis preneur.
    il m'arrive parfois de saisir des données dans la base sans passer par un programme. Pour prendre l'exemple de la table utilisateurs, admettons que j'ai les utilisateurs 1,2,3,4,5,6 que pour une raison x ou y les utilisateurs 4 et 5 soient supprimés, les recréer sans indiquer le numéro changerait ces deux derniers en 7,8 alors que si j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO UTILISATEURS (ID,...) VALUES (4,...);    
    INSERT INTO UTILISATEURS (ID,...) VALUES (5,...);
    la séquence ne change pas, j'ai toujours la suite 1,2,3,4,5,6
    Autre possibilité je veux absolument avoir un utilisateur avec le numéro 10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO UTILISATEURS (ID,...) VALUES (10,...);
    bien sûr s'il existe déjà erreur, mais pas de soucis s'il n'existe pas. Si maintenant la séquence en était à 6, la séquence est maintenant, grâce au trigger rendu à 10 ce qui empêche toute erreur en cas de processus normal si la séquence n'avait pas été changée (7,8,9,10 -Erreur déjà existant)

    Attention ce "truc" valable depuis les versions "historiques" on a avec Firebird 3 la possibilité d'utiliser les colonnes IDENTITY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE TEST(
    id integer generated by default as identity primary key,
    nom varchar(30))
    j'y vois deux soucis, on n'a pas la possibilité de donner un nom précis à la contrainte de clé primaire (comme j'ai pu le faire en la déclarant après) et n'a pas accès à la séquence (ou générateur) interne. Par contre cela fait la même chose que le trigger et ce sans avoir quoique ce soit à faire. Choix cornélien !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci beaucoup pour toutes tes précisions, je clôture le sujet, c'est top merci beaucoup !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/05/2005, 19h18
  2. [Oracle]probleme de gestion des utilisateurs
    Par gentarik dans le forum Oracle
    Réponses: 5
    Dernier message: 09/03/2005, 13h58
  3. [Gestion des utilisateurs] Changer l'interface simplifiée
    Par sekiryou dans le forum Windows XP
    Réponses: 4
    Dernier message: 19/01/2005, 06h42
  4. Administration MySQL gestion des utilisateurs
    Par MaxiMax dans le forum Administration
    Réponses: 2
    Dernier message: 01/07/2004, 14h56
  5. Gestion des Utilisateurs depuis une application
    Par LLaurent dans le forum XMLRAD
    Réponses: 4
    Dernier message: 25/03/2003, 17h29

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