sql >> Base de Datos >  >> RDS >> Mysql

mysql- ¿Cómo aplicar subvenciones a la columna?

No estoy seguro de estar entendiendo la pregunta correctamente, pero parece estar solicitando la capacidad de restringir a la persona que selecciona datos de la tabla Personas para que no puedan ver el valor en la columna Secreto, pero se les debe permitir para usar la columna Secreto en el interior de la consulta (en la cláusula WHERE, etc.).

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

Entonces, si mi interpretación es correcta, cuando SomeOne selecciona datos:

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 no permite eso, y por una buena razón. Básicamente, si puede condicionar los resultados de la consulta en Secreto, puede determinar el valor de Secreto con consultas repetidas, por lo que lo que se supone que es secreto no sigue siendo un secreto. Es muy fácil filtrar información.

Mirando la consulta que falla pero "no debería"... a partir de sus resultados, sabe que cada Id devuelto tiene el valor Secreto de 1, por lo que para esos valores de Id, el Secreto ya no es secreto.

Si observa las bases de datos estadísticas, donde solo se le permite buscar datos agregados, encontrará cosas llamadas Rastreadores únicos que básicamente le permiten identificar las características de una persona, incluso si solo se le permite ver datos agregados ( SUM, COUNT, ...) valores en los conjuntos de resultados. Este es un escenario más complejo que el que enfrenta (pero fascinante). C J Date's (agotado hace mucho tiempo) "Introducción a los sistemas de bases de datos, Vol II" tiene una discusión sobre la base de datos estadística y los rastreadores únicos. (La búsqueda en Google sobre 'rastreador único de la base de datos estadísticos' revela información útil que es más accesible).

Entonces, si entendí lo que se desea, creo que el deseo está equivocado y el estándar SQL no permite lo que buscas.

¿Hay alguna solución?

Si la consulta se puede integrar en una vista, la persona que crea la vista puede acceder a los datos detallados subyacentes y otorgar acceso a la vista, pero las personas que usan la vista no pueden ejecutar la consulta sin procesar; esto podría darle la protección que busca. Comentarios similares se aplican a los procedimientos almacenados y permiten una mejor parametrización de la consulta.