sql >> Databasteknik >  >> RDS >> Mysql

mysql- Hur ansöker man om bidrag till kolumn?

Jag är inte säker på att jag förstår frågan rätt, men det verkar fråga om möjligheten att begränsa personen som väljer data från tabellen Personer så att de inte kan se värdet i kolumnen Hemligt, men de bör tillåtas för att använda kolumnen Secret i det inre av frågan (i WHERE-satsen, etc).

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

Så, om min tolkning är korrekt, när SomeOne väljer 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 tillåter inte det, och av goda skäl. I grund och botten, om du kan villkora frågeresultat på Secret, kan du bestämma värdet på Secret med upprepade frågor, så det som ska vara hemligt förblir inte hemligt. Det är väldigt lätt att läcka information.

Om du tittar på frågan som misslyckas men "inte borde"...från dess resultat vet du att varje ID som returneras har hemlighetsvärdet 1, så för dessa ID-värden är hemligheten inte längre hemlig.

Om du tittar in i statistiska databaser, där du bara får söka på aggregerad data, hittar du att det finns saker som kallas Unique Trackers som i princip låter dig identifiera egenskaperna hos en person, även om du bara får se aggregerad ( SUM, COUNT, ...) värden i resultatuppsättningarna. Det här är ett mer komplext scenario än du står inför (men ett fascinerande sådant). C J Dates (långt slut) "Introduction to Database Systems, Vol II" har en diskussion om statistisk databas och unika spårare. (Google-sökning på "statistisk databas unik spårare" avslöjar användbar information som är mer tillgänglig.)

Så om jag har förstått vad som önskas tror jag att önskan är missriktad - och SQL-standarden tillåter inte det du söker.

Finns det några lösningar?

Om frågan kan byggas in i en vy kan personen som skapar vyn komma åt den underliggande detaljdatan och ge åtkomst till vyn, men personerna som använder vyn kan inte köra den råa frågan; detta kan ge dig det skydd du söker. Liknande kommentarer gäller lagrade procedurer och gör att frågan kan parametriseras bättre.



  1. undvika MySQL-injektioner med Zend_Db-klassen

  2. Det går inte att lagra arabiska i MYSQL-databas med PHP

  3. JSON_PRETTY() – Formatera JSON-dokument för enklare läsbarhet i MySQL

  4. Brent Ozar förklarar SQL Server intern och extern fragmentering