Mysql
 sql >> Database >  >> RDS >> Mysql

mysql- Come applicare le sovvenzioni alla colonna?

Non sono sicuro di aver compreso correttamente la domanda, ma sembra chiedere la possibilità di limitare la persona che seleziona i dati dalla tabella Persone in modo che non possano vedere il valore nella colonna Segreto, ma dovrebbero essere consentiti per utilizzare la colonna Segreto all'interno della query (nella clausola WHERE, ecc.).

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

Quindi, se la mia interpretazione è corretta, quando Qualcuno seleziona i dati:

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 non lo consente, e per una buona ragione. Fondamentalmente, se puoi condizionare i risultati della query su Secret, puoi determinare il valore di Secret con query ripetute, quindi ciò che dovrebbe essere segreto non rimane un segreto. È molto facile far trapelare informazioni.

Osservando la query che fallisce ma "non dovrebbe"... dai suoi risultati, sai che ogni Id restituito ha il valore Secret di 1, quindi per quei valori Id, il Segreto non è più segreto.

Se guardi nei database statistici, dove puoi cercare solo su dati aggregati, scopri che ci sono cose chiamate Unique Tracker che sostanzialmente ti permettono di identificare le caratteristiche di una persona, anche se ti è permesso vedere solo aggregati ( SUM, COUNT, ...) valori nei set di risultati. Questo è uno scenario più complesso di quello che stai affrontando (ma affascinante). C J Date (da tempo fuori stampa) "Introduzione ai sistemi di database, Vol II" ha una discussione su database statistico e tracker unici. (La ricerca su Google su "database statistico unico tracker" rivela informazioni utili e più accessibili.)

Quindi, se ho capito cosa si desidera, credo che il desiderio sia fuorviante e lo standard SQL non consente ciò che cerchi.

Ci sono soluzioni alternative?

Se la query può essere incorporata in una vista, la persona che crea la vista può accedere ai dati di dettaglio sottostanti e concedere l'accesso alla vista, ma le persone che utilizzano la vista non possono eseguire la query grezza; questo potrebbe darti la protezione che cerchi. Commenti simili si applicano alle stored procedure e consentono una migliore parametrizzazione della query.