Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql- Comment appliquer des subventions à la colonne ?

Je ne suis pas sûr de bien comprendre la question, mais il semble demander la possibilité de restreindre la personne sélectionnant des données dans la table Persons afin qu'elle ne puisse pas voir la valeur dans la colonne Secret, mais elle devrait être autorisée pour utiliser la colonne Secret à l'intérieur de la requête (dans la clause WHERE, etc).

CREATE TABLE Person
(
    Id      ...,
    Secret  ...,
    ...
);
REVOKE ALL ON Person FROM PUBLIC;
GRANT SELECT(id) ON Person TO SomeOne;

Donc, si mon interprétation est correcte, lorsque Quelqu'un sélectionne des données :

SELECT Id     FROM Person;    -- Works (as required)
SELECT Secret FROM Person;    -- Fails (as required)
SELECT Id
  FROM Person
 WHERE Secret = 1;            -- Fails (but we want it to work)

SQL ne le permet pas, et pour cause. Fondamentalement, si vous pouvez conditionner les résultats de la requête sur Secret, vous pouvez déterminer la valeur de Secret avec des requêtes répétées, de sorte que ce qui est censé être secret ne le reste pas. Il est très facile de divulguer des informations.

En regardant la requête qui échoue mais "ne devrait pas"... à partir de ses résultats, vous savez que chaque identifiant renvoyé a la valeur secrète de 1, donc pour ces valeurs d'identifiant, le secret n'est plus secret.

Si vous examinez les bases de données statistiques, où vous n'êtes autorisé à rechercher que des données agrégées, vous découvrirez qu'il existe des éléments appelés Unique Trackers qui vous permettent essentiellement d'identifier les caractéristiques d'une personne, même si vous n'êtes autorisé à voir que des données agrégées ( SUM, COUNT, ...) valeurs dans les jeux de résultats. C'est un scénario plus complexe que celui auquel vous êtes confronté (mais fascinant). C J Date's (épuisé depuis longtemps) "Introduction to Database Systems, Vol II" a une discussion sur la base de données statistique et les trackers uniques. (La recherche Google sur 'statistical database unique tracker' révèle des informations utiles et plus accessibles.)

Donc, si j'ai compris ce qui est souhaité, je pense que le désir est malavisé - et la norme SQL ne permet pas ce que vous recherchez.

Existe-t-il des solutions ?

Si la requête peut être intégrée à une vue, la personne qui crée la vue peut accéder aux données détaillées sous-jacentes et accorder l'accès à la vue, mais les personnes utilisant la vue ne peuvent pas exécuter la requête brute ; cela pourrait vous donner la protection que vous recherchez. Des commentaires similaires s'appliquent aux procédures stockées et permettent de mieux paramétrer la requête.