Ich bin mir nicht sicher, ob ich die Frage richtig verstehe, aber es scheint nach der Möglichkeit zu fragen, die Person einzuschränken, die Daten aus der Personentabelle auswählt, sodass sie den Wert in der Spalte „Secret“ nicht sehen kann, aber sie sollten zugelassen werden um die Secret-Spalte im Inneren der Abfrage zu verwenden (in der WHERE-Klausel usw.).
CREATE TABLE Person
(
Id ...,
Secret ...,
...
);
REVOKE ALL ON Person FROM PUBLIC;
GRANT SELECT(id) ON Person TO SomeOne;
Also, wenn meine Interpretation richtig ist, wenn Jemand Daten auswählt:
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 lässt das aus gutem Grund nicht zu. Wenn Sie Abfrageergebnisse auf Secret konditionieren können, können Sie im Grunde den Wert von Secret mit wiederholten Abfragen bestimmen, sodass das, was geheim sein soll, kein Geheimnis bleibt. Es ist sehr einfach, Informationen durchsickern zu lassen.
Wenn Sie sich die Abfrage ansehen, die fehlschlägt, aber "nicht sollte" ... aus ihren Ergebnissen wissen Sie, dass jede zurückgegebene ID den geheimen Wert 1 hat, sodass das Geheimnis für diese ID-Werte nicht mehr geheim ist.
Wenn Sie sich statistische Datenbanken ansehen, in denen Sie nur nach aggregierten Daten suchen dürfen, finden Sie Dinge, die Unique Tracker genannt werden und die es Ihnen im Grunde ermöglichen, die Merkmale einer Person zu identifizieren, selbst wenn Sie nur aggregierte Daten sehen dürfen ( SUM, COUNT, ...) Werte in den Ergebnismengen. Dies ist ein komplexeres Szenario als das, dem Sie gegenüberstehen (aber ein faszinierendes). C J Date's (längst vergriffen) "Introduction to Database Systems, Vol II" hat eine Diskussion über statistische Datenbanken und eindeutige Tracker. (Die Google-Suche nach „Statistical Database Unique Tracker“ zeigt nützlich aussehende Informationen, die leichter zugänglich sind.)
Also, wenn ich verstanden habe, was gewünscht wird, glaube ich, dass der Wunsch fehlgeleitet ist – und der SQL-Standard erlaubt nicht, was Sie suchen.
Gibt es Problemumgehungen?
Wenn die Abfrage in eine Ansicht integriert werden kann, kann die Person, die die Ansicht erstellt, auf die zugrunde liegenden Detaildaten zugreifen und Zugriff auf die Ansicht gewähren, aber die Personen, die die Ansicht verwenden, können die Rohabfrage nicht ausführen. Dies könnte Ihnen den Schutz bieten, den Sie suchen. Ähnliche Kommentare gelten für gespeicherte Prozeduren und ermöglichen eine bessere Parametrisierung der Abfrage.