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

MS SQL Server Discussion :

[SQL Server 2k] Droits utilisateurs + tables système


Sujet :

MS SQL Server

  1. #1
    Membre averti Avatar de guignol
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Points : 339
    Points
    339
    Par défaut [Résolu][SQL Server 2k] Droits utilisateurs + tables système
    Bonjour!

    Je souhaite, à l'aide des tables système, récupérer les droits qu'une personne a sur une table.

    Par exemple l'utilisateur X a la capacité de consulter la table A, mais ne peux pas consulter le champ A.d. Par contre, l'utilisateur Y peut à la fois consulter et modifier A (sauf modifier le champ A.d).


    J'ai défini ces droits en utilisant des rôles : ainsi X appartient à un rôle et Y à un autre rôle.

    Comment puis-je faire pour déterminer qui peux faire quoi? car je souhaite, à partir de la base, récupérer les infos d'une personne en fonction de ses droits (faire apparaître tel champ a1 et pas a2), ou mettre dans un textbox les champs modifiables (=> identifier si la personne a des droits en update) et les autres dans des champs non éditables.


    J'ai trouvé un lien dans la msdn décrivant les tables système, et après bidouille de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sysobjects.name,sysusers.name,sysobjects.xtype from sysobjects,syspermissions, sysusers where syspermissions.grantee = sysusers.uid
    and sysobjects.id=syspermissions.id order by sysusers.name
    ;
    J'obtient des noms de tables et de procédure, le nom du rôle concerné par la permission mais pas assez de détail (je pige pas tout dans ces tables) pour savoir quel champ et quel type de droit l'utilisateur possède.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ACTIVITE	Collaborateur	U 	U 
    AGENCE	Collaborateur	U 	U 
    AVOIR_POUR_RESPONSABLE	Collaborateur	U 	U 
    AVOIR_SUIVI_FORMATION	Collaborateur	U 	U 
    CLIENT	Collaborateur	U 	U 
    COLLABORATEUR	Collaborateur	U 	U 
    DOMAINEACTIVITE	Collaborateur	U 	U 
    FORMATION	Collaborateur	U 	U 
    INTERLOCUTEUR	Collaborateur	U 	U 
    MISSION	Collaborateur	U 	U 
    PROJET	Collaborateur	U 	U


    Merci d'avance

    Charly

  2. #2
    Membre averti Avatar de guignol
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Points : 339
    Points
    339
    Par défaut
    La requête que j'ai posté précédemment est quelque peu insuffisante :

    j'ai cherché sur la msdn à la page http://msdn.microsoft.com/library/de...ys_00_690z.asp ou on peut trouver les définitions des tables système.

    Je fais donc la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     select sysobjects.name, sysusers.name, sysprotects.* 
    from sysprotects, sysobjects, sysusers
    where sysprotects.id = sysobjects.id
    and sysusers.uid=sysprotects.uid
    order by sysobjects.name
    ;
    La table sysprotects indique les droits sur un objet pour un utilisateur donné => on peut savoir si le select par X est autorisé.
    Le problème c'est que je n'arrive pas, dans des tables où certaines restrictions se font champ par champ (et non sur toute la table), à déterminer quelle colonne est concernée par la permission.

    De plus il ya un champ dans la table sysprotects qui est décrit ainsi :
    columns varbinary(4000) Bitmap of columns to which these SELECT or UPDATE permissions apply. Bit 0 indicates all columns; bit 1 means permissions apply to that column and NULL means no information
    Je pige pas tout vu que l'id du champ décrit par
    id int ID of object to which these permissions apply.
    est celui d'une table à chaque fois.

  3. #3
    Membre averti Avatar de guignol
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Points : 339
    Points
    339
    Par défaut
    J'ai trouvé un lien qui m'a mis sur la voie :
    http://www.winnetmag.com/Articles/Pr...ArticleID=5333
    dans la table sysprotects sont présentes toutes les informations (tables concernée, type de permission -DENY ou GRANT-, type d'action -UPDATE....-).

    On trouve également une colonne nommé columns de type varbinary(4000) qui est la "synthèse" de toutes les colonnes concernées par la modification. Je ne sais pas appliquer la méthode donnée par ce site (appliquer un masque de byte???), car je ne comprend pas comment on choisi le masque en fonction de l'identifiant de la colonne et s'il faut renverser le chiffre hexadécimal (et aussi pourquoi).

    Vous comprendrez mieux en lisant l'article de quoi il s'agit.

    Merci d'avance de votre aide, car je crois que ce problème ne se limite pas qu'à SQL Server.

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    C'est pas si complique que ca en a l'air, un masque de bits :

    http://fadace.developpez.com/mssql/bitmask

  5. #5
    Membre averti Avatar de guignol
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par fadace
    C'est pas si complique que ca en a l'air, un masque de bits :

    http://fadace.developpez.com/mssql/bitmask
    Ton lien est erronné : c'est http://fadace.developpez.com/sql/bitmask

    J'étais arrivé (enfin) à comprendre comment cela fonctionnait, et ton article m'a conforté dans ce sens Merci. Au fait, j'ai posé une question sur la manipulation d'un varbinary à cette adresse http://www.developpez.net/forums/viewtopic.php?t=218004. As-tu une idée?

  6. #6
    Membre averti Avatar de guignol
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Points : 339
    Points
    339
    Par défaut
    Bon, ca y est j'ai tout résolu :

    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
    CREATE PROCEDURE [dbo].[ps_sel_col_modif]
    @identite sysname,
    @table sysname
    as
    select sysobjects.name, syscolumns.name, sysusers.name, sysprotects.columns
    ,cast(reverse(cast( sysprotects.columns as  varchar)) as varbinary)
    ,sysprotects.protecttype, sysprotects.action
    from sysprotects, sysobjects, sysusers, syscolumns
    where sysprotects.id = sysobjects.id
    and syscolumns.id=sysobjects.id
    and sysobjects.type='U'
    and sysobjects.name=@table
    and sysusers.name=@identite
    and sysprotects.action = 197
    and sysusers.uid=sysprotects.uid
    -- sélection des colonnes concernées par l'autorisation
    --l'autorisation concerne toute la table
    and (sysprotects.columns=0x01 or 
    -- le champ concerné est autorisé
    ( Convert(int,cast(reverse(cast( sysprotects.columns as  varchar)) as varbinary)) & Power(2, syscolumns.colid)=Power(2,syscolumns.colid)))
    and sysprotects.protecttype=205
    order by sysobjects.name, sysusers.name,syscolumns.name
    ;
    Dur Dur mais ca marche yesss (quelle modestie décidément)

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

Discussions similaires

  1. Sage 100 SQL Server : quels droits pour les utilisateurs
    Par fredouille31 dans le forum SAGE
    Réponses: 4
    Dernier message: 03/01/2012, 15h50
  2. [SQL-SERVER] "Déconnecter" les utilisateurs d'une
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 18/07/2006, 11h30
  3. [SQL SERVER 2K]Droits d'exécution procédure stockée
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 16/05/2006, 15h01
  4. [SQL Server] Jointure entre 2 tables et performances
    Par rmeuser dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/04/2006, 10h12
  5. [SQL SERVER 2000] Fonction utilisateur : boucle sans fin
    Par galinijay dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/09/2005, 16h03

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