Saya tidak yakin bahwa saya memahami pertanyaan dengan benar, tetapi tampaknya meminta kemampuan untuk membatasi orang yang memilih data dari tabel Orang sehingga mereka tidak dapat melihat nilai di kolom Rahasia, tetapi mereka harus diizinkan untuk menggunakan kolom Rahasia di bagian dalam kueri (dalam klausa WHERE, dll).
CREATE TABLE Person
(
Id ...,
Secret ...,
...
);
REVOKE ALL ON Person FROM PUBLIC;
GRANT SELECT(id) ON Person TO SomeOne;
Jadi, jika interpretasi saya benar, ketika Seseorang memilih 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 tidak mengizinkan itu, dan untuk alasan yang bagus. Pada dasarnya, jika Anda dapat mengkondisikan hasil kueri pada Rahasia, Anda dapat menentukan nilai Rahasia dengan kueri berulang, sehingga apa yang seharusnya menjadi rahasia tidak tetap menjadi rahasia. Sangat mudah untuk membocorkan informasi.
Melihat kueri yang gagal tapi "tidak boleh"...dari hasilnya, Anda tahu bahwa setiap Id yang dikembalikan memiliki nilai Rahasia 1, jadi untuk nilai Id tersebut, Rahasia tidak lagi menjadi rahasia.
Jika Anda melihat ke dalam Basis Data Statistik, di mana Anda hanya diizinkan untuk mencari data agregat, Anda menemukan ada hal-hal yang disebut Pelacak Unik yang pada dasarnya memungkinkan Anda untuk mengidentifikasi karakteristik satu orang, bahkan jika Anda hanya diizinkan untuk melihat agregat ( SUM, COUNT, ...) nilai di set hasil. Ini adalah skenario yang lebih kompleks daripada yang Anda hadapi (tapi yang menarik). Tanggal C J (lama tidak dicetak lagi) "Pengantar Sistem Basis Data, Jilid II" memiliki pembahasan Basis Data Statistik dan Pelacak Unik. (Penelusuran Google pada 'statistical database unique tracker' mengungkapkan informasi yang berguna dan lebih mudah diakses.)
Jadi, jika saya telah memahami apa yang diinginkan, saya yakin keinginan itu salah arah — dan standar SQL tidak mengizinkan apa yang Anda cari.
Apakah ada solusi?
Jika kueri dapat dibuat menjadi tampilan, orang yang membuat tampilan dapat mengakses data detail yang mendasari dan memberikan akses ke tampilan, tetapi orang yang menggunakan tampilan tidak dapat menjalankan kueri mentah; ini mungkin memberi Anda perlindungan yang Anda cari. Komentar serupa berlaku untuk prosedur tersimpan dan memungkinkan kueri untuk diparameterisasi dengan lebih baik.