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

mysql- Hvordan ansøger man tilskud til kolonne?

Jeg er ikke sikker på, at jeg forstår spørgsmålet korrekt, men det ser ud til at bede om muligheden for at begrænse den person, der vælger data fra tabellen Personer, så de ikke kan se værdien i kolonnen Hemmeligt, men de bør tillades for at bruge kolonnen Secret i det indre af forespørgslen (i WHERE-sætningen osv.).

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

Så hvis min fortolkning er korrekt, når SomeOne vælger data:

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 tillader det ikke, og det er der god grund til. Grundlæggende, hvis du kan betinge forespørgselsresultater på Secret, kan du bestemme værdien af ​​Secret med gentagne forespørgsler, så hvad der formodes at være hemmeligt, forbliver ikke en hemmelighed. Det er meget nemt at lække information.

Når du ser på den forespørgsel, der mislykkes, men "ikke burde"... fra resultaterne ved du, at hvert id, der returneres, har den hemmelige værdi på 1, så for disse id-værdier er hemmeligheden ikke længere hemmelig.

Hvis du kigger ind i statistiske databaser, hvor du kun må søge på aggregerede data, finder du ud af, at der er ting, der kaldes Unique Trackers, som dybest set giver dig mulighed for at identificere karakteristika for én person, selvom du kun har tilladelse til at se aggregerede ( SUM, COUNT, ...) værdier i resultatsættene. Dette er et mere komplekst scenario, end du står over for (men et fascinerende et). C J Dates (længst udsolgt) "Introduction to Database Systems, Vol II" har en diskussion af Statistisk Database og Unique Trackers. (Google-søgning på 'statistical database unique tracker' afslører nyttig information, der er mere tilgængelig.)

Så hvis jeg har forstået, hvad der ønskes, tror jeg, at ønsket er forkert - og SQL-standarden tillader ikke, hvad du søger.

Er der nogle løsninger?

Hvis forespørgslen kan indbygges i en visning, kan den person, der opretter visningen, få adgang til de underliggende detaljedata og give adgang til visningen, men de personer, der bruger visningen, kan ikke udføre den rå forespørgsel; dette kan give dig den beskyttelse, du søger. Lignende kommentarer gælder for lagrede procedurer og gør det muligt at parametrere forespørgslen bedre.



  1. Tving dvaletilstand til at oprette tabeller efter at have droppet og genskabt database

  2. Hvordan skriver man en sikker SELECT-forespørgsel, som har et variabelt antal brugerleverede værdier med mysqli?

  3. Flask_SQLAlchemy, MySQL, gemme svenske tegn å, ä, ö?

  4. Hvordan kan jeg lave et gennemsnit af datoer i MySQL?