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

Décisions SGBD Discussion :

Intégrité d'une donnée dans le temps


Sujet :

Décisions SGBD

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 165
    Points : 84
    Points
    84
    Par défaut Intégrité d'une donnée dans le temps
    Bonjour,
    Une question qui va peut-être vous paraitre idiote ;-)
    Y'a t'il un moyen dans une base de donnée d'interdire la modification d'une donnée.
    Exemple j'ai un champs date, une fois écrit il n'est plus modifiable ....
    Merci d'avance pour vos lumières

  2. #2
    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
    Les champs sont à la campagne ou dans les formulaires ; pas dans les tables des bases de données qui ne sont composées que de colonnes et de lignes !

    Pour répondre à votre question : oui, c'est possible à l'aide d'un trigger avant mise à jour qui ignorera la mise à jour de la colonne date souhaitée, même si la requête update spécifie une valeur pour cette colonne.
    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 !

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 165
    Points : 84
    Points
    84
    Par défaut modification d'un enregistement interdiction
    Merci pour cette réponse.
    Je ne savais pas que j'allais tomber sur qq du milieu agricole, et qui est très attentif aux champs ;-)
    Merci encore je regarde ça de prés, j'imagine que tout les SGBD utilisent des triggers.

  4. #4
    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
    Je ne suis pas sûr qu'Access utilise un mécanisme équivalent aux triggers (ça fait un bon paquet d'années que je n'utilise plus Access), pas plus que Open/Libre Office Base. Sqlite, je ne sais pas du tout. Les autres SGBD plus conséquents (même le très moyen MySQL/MariaDB) connaissent des triggers.

    Quel SGBD utilisez-vous ?
    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. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Pas uniquement par déclencheur.

    En effet, vous pouvez faire ceci par le biais des privilèges. Ce sera beaucoup plus efficace ! Démonstration (avec MS SQL Server)...
    Création des objets et privilèges :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE T (C1 INT, C2 INT, C3 DATE DEFAULT CURRENT_TIMESTAMP);
    GO
    CREATE USER toto WITHOUT LOGIN;
    GO
    GRANT SELECT, INSERT, DELETE ON T TO toto;
    GO
    GRANT UPDATE ON T (C1, C2) TO toto;
    GO

    Manipulation des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    --> simulation d'une connexion avec l'utilisateur toto
    EXECUTE AS USER = 'toto'
     
    INSERT INTO T 
    VALUES (0, 0, '1999-12-31'),
           (1, 1, '2001-01-01');
     
    UPDATE T SET C2 = 10 WHERE C1 = 1;
     
    UPDATE T SET C3 = CURRENT_TIMESTAMP;
    Toutes ces commandes se déroulent bien, sauf la dernière :

    Msg*230, Niveau*14, État*1, Ligne*21
    L'autorisation UPDATE a été refusée sur la colonne «*C3*» de l'objet «*T*», base de données «*tempdb*», schéma «*dbo*».



    Dans certains SGBDR avancés, on peut être aussi beaucoup plus générique en privilégiant de la sorte… Au lieu du GRANT UPDATE ON T (C1, C2) TO toto;, on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GRANT UPDATE ON T TO toto;
     
    DENY UPDATE ON R (C3) TO toto;
    Ainsi, si de nouvelles colonnes sont créées dans la table, l'UPDATE restera actif pour toto sur ces nouvelles colonnes, sans être obligé de rajouter des commandes pour gérer les nouveaux privilèges sur les nouvelles colonnes.

    Enfin, si cette date est une date d'historique d'insertion de la ligne, intéressez vous aux tables temporelles (rien à voir avec les tables temporaires), qui permettent d'historiser de manière automatique sans que l'utilisateur fasse quoi que ce soit, et sans que l'utilisateur puissent modifier ces informations… Les tales temporelles sont arrivées avec la norme SQL 2011 mais tous les SGBDR ne les implémentent pas…


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

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 165
    Points : 84
    Points
    84
    Par défaut
    Merci bcp pour cette nouvelle approche.
    pour répondre a @CinePhil J'utilise mySql.

    Merci a tous les deux je vais tester ca sur mySql
    A+

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Pour un exemple sur les tables temporelles (avec SQL Server) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE T_CLIENT   
    (CLI_ID             INT IDENTITY PRIMARY KEY,
     CLI_NOM            VARCHAR(32),
     _DH_VALIDE_DEBUT   DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN,
     _DH_VALIDE_FIN     DATETIME2 GENERATED ALWAYS AS ROW END   HIDDEN,  
     PERIOD FOR SYSTEM_TIME (_DH_VALIDE_DEBUT, _DH_VALIDE_FIN)  
     )    
     WITH (SYSTEM_VERSIONING = ON);
    La table à deux colonnes supplémentaire indiquant pour chaque ligne l'intervalle de validité, avec des colonnes autoalimentées et cachées (non vues dans un SELECT *).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    INSERT INTO T_CLIENT VALUES ('Dupont');
     
    SELECT * FROM T_CLIENT;
     
    CLI_ID      CLI_NOM
    ----------- --------------------------------
    1           Dupont

    Insertion des données. Puis SELECT ne montrant pas les colonnes de validité temporelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *, _DH_VALIDE_DEBUT, _DH_VALIDE_FIN FROM T_CLIENT;
     
    CLI_ID      CLI_NOM                          _DH_VALIDE_DEBUT            _DH_VALIDE_FIN
    ----------- -------------------------------- --------------------------- ---------------------------
    1           Dupont                           2018-09-12 07:22:19.5824801 9999-12-31 23:59:59.9999999
    Affichage des colonnes de validité temporelles…

    On peut aussi rajouter une table d'historisation automatique pour voir toutes les informations modifiées (UPDATE, DELETE)…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE T_CLIENT
       SET (SYSTEM_VERSIONING = OFF);
    ALTER TABLE T_CLIENT
       SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.T_CLIENT_HISTO));

    Dès lors toutes les modifications sont tracées…

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE T_CLIENT
    SET CLI_NOM = 'IBM';
     
    SELECT * FROM T_CLIENT_HISTO;
     
    CLI_ID      CLI_NOM                          _DH_VALIDE_DEBUT            _DH_VALIDE_FIN
    ----------- -------------------------------- --------------------------- ---------------------------
    1           Dupont                           2018-09-12 07:22:19.5824801 2018-09-12 07:43:36.6737111
    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/ * * * * *

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Une autre façon très simple de répondre à ce besoin est de passer par une vue qui ne déclare pas la colonne de la table dont on souhaite protéger le contenu.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Une autre façon très simple de répondre à ce besoin est de passer par une vue qui ne déclare pas la colonne de la table dont on souhaite protéger le contenu.

    Oui, mais pas vraiment si simple… ça a été mon premier réflexe… Mais tu doit avoir la vue qui permet l'insert de la colonne, autorise la lecture mais pas l'UPDATE….

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

  10. #10
    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
    Merci Fred, je ne connaissais pas tout ça.

    bruno.rotrou utilise MySQL. Le GRANT sur une partie de la table y existe aussi ?
    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 !

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Normalement c'est du standard basic !
    https://dev.mysql.com/doc/refman/5.7/en/grant.html

    Donc oui pour MySQmerde… !

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

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

Discussions similaires

  1. Lire une donnée dans la base de registre
    Par K.othmane dans le forum Langage
    Réponses: 1
    Dernier message: 06/01/2006, 11h32
  2. Retrouver une donnée dans une zone de liste
    Par uloaccess dans le forum Access
    Réponses: 9
    Dernier message: 07/11/2005, 13h25
  3. Réponses: 2
    Dernier message: 28/10/2005, 12h52
  4. Réponses: 2
    Dernier message: 14/10/2005, 10h11
  5. Réponses: 4
    Dernier message: 11/06/2004, 16h27

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