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

SQL Oracle Discussion :

Accorder le droit update à un user que sur les enregistrements qu'il a faits


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut Accorder le droit update à un user que sur les enregistrements qu'il a faits
    Bonjour à tous,
    Je viens vers vous car je sais pas comment résoudre mon problème.En fait, j'aimerai accorder le droit de modification à un gestionnaire sur une table Client mais que sur les clients dont il est gestionnaire.

    Par exemple j'ai une une table client et j'ai créé un utilisateur "Jean" avec la commande CREATE USER, j'aimerai donc que "Jean" puisse modifier tous les clients dont il est gestionnaire.

    Merci d'avance pour vos aides.

  2. #2
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Par défaut Solution pas très belle
    Une solution possible mais pas très belle est d'utiliser une fonction ou procédure pour autoriser ou pas les modifications.

    Je place dans le schéma "CLIENT", la table à sécuriser, ainsi que la fonction pour y accéder en écriture.

    Avec un compte qui peut faire un CREATE USER.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create user client identified by client1 default tablespace users temporary tablespace temp;
    grant resource to client;
    grant create session to client;
    alter user client quota 1G on users;
    Ici je me connecte dans CLIENT et je crée les tables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sqlplus client/client1
     
    create table client(no number, nom varchar2(20));
    create table gestionnaire(no number, nom varchar2(20));
    create table autorisation(no_client number, no_gestionnaire varchar2(20));
    insert into client values(1, 'Client de Jean');
    insert into gestionnaire values(1, 'JEAN');
    insert into gestionnaire values(2, 'PIERRE');
    -- Je donne accès de modification du client 1 au gestionnaire 1. (Jean pourra modifier le client 1, mais Pierre ne pourra pas)
    insert into autorisation values(1,1);
    commit;
    Toujours en étant connecté avec l'utilisateur CLIENT, je crée la fonction qui va servir d'API pour modifier la table CLIENT. (La colonne NOM dans cet exemple)
    Désolé si le code n'est pas très beau, je ne suis pas développeur.
    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
     
    create or replace function modifier_nom_client(p_no in client.no%TYPE,p_nom in client.nom%TYPE)
    return boolean as
      v_autorisation number := 0;
    begin
    select count(1) into v_autorisation
      from autorisation,
           gestionnaire
     where autorisation.no_client = p_no
       and autorisation.no_gestionnaire = gestionnaire.no
       and gestionnaire.nom = (select sys_context('USERENV','SESSION_USER') from dual);
     
    if v_autorisation = 1 then
      update client set nom = p_nom where no = p_no;
      return true;
    else
      return false;
    end if;
    end modifier_nom_client;
    /

    Je crée le compte de Jean et de Pierre avec un utilisateur qui a les droits (SYSTEM ou autres).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create user jean identified by jean1 default tablespace users temporary tablespace temp;
    grant create session to jean;
    grant execute on client.modifier_nom_client to jean;
     
    create user pierre identified by pierre1 default tablespace users temporary tablespace temp;
    grant create session to pierre ;
    grant execute on client.modifier_nom_client to pierre;
    Je teste le tout avec un utilisateur qui n'a pas le droit de modifier (PIERRE)

    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
     
     
    sqlplus pierre/pierre1
     
    set serveroutput on;
    declare
    retour boolean := false;
    begin
    retour := client.modifier_nom_client(1,'test');
    if retour then
     dbms_output.put_line('Client modifié');
    else
     dbms_output.put_line('Pas autorisé');
    end if;
    end;
    /
    Résultat: Pas autorisé


    Je teste le tout avec l'utilisateur JEAN qui a l'autorisation pour le client 1.

    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
     
     
    sqlplus jean/jean1
     
    set serveroutput on;
    declare
    retour boolean := false;
    begin
    retour := client.modifier_nom_client(1,'test');
    if retour then
     dbms_output.put_line('Client modifié');
    else
     dbms_output.put_line('Pas autorisé');
    end if;
    end;
    /
    Résultat: Client modifié

    Ne pas oublier de faire un commit ou un rollback;


    En espérant le tout conforme!

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Une idée parmi d'autres :
    Ajouter à la table Client une colonne Createur qui prend par défaut l'identifiant de l'utilisateur qui crée la ligne.
    Placer un sur cette table un trigger BEFORE UPDATE qui vérifie que la colonne Createur est bien égale à l'utilisateur courant.
    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.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Par défaut
    Bonjour,

    Pour moi, la solution la plus adaptée, si elle est possible, serait de créer une vue simple, qui ne récupère que les lignes pouvant être modifiées, assortie de la clause WITH CHECK OPTION, qui interdit qu'on utilise la vue pour modifier des lignes qui ne sont pas sélectionnées, et d'accorder le droit de faire des modifications sur cette vue et non directement sur la table.

    Donc, quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW V_CLIENT
    AS
    SELECT * 
    FROM CLIENT
    WHERE <la_condition_qui_permet_de_selectionner_les_clients_de_Jean>
    WITH CHECK OPTION ;
     
    GRANT UPDATE ON V_CLIENT TO jean;

  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 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Et pourquoi pas une vue WITH CHECK OPTION ?

    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. Clic sur un iframe ne marche que sur les bords
    Par Dayren dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 02/03/2008, 15h29
  2. Ouverture formulaire ne se fait que sur un enregistrement..?
    Par heavenvibes dans le forum VBA Access
    Réponses: 5
    Dernier message: 13/11/2007, 15h23
  3. Réponses: 13
    Dernier message: 04/10/2007, 19h17
  4. Réponses: 3
    Dernier message: 22/05/2007, 19h32

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