質問を正しく理解しているかどうかはわかりませんが、Personsテーブルからデータを選択する人を制限して、Secret列の値が表示されないようにする機能を求めているようですが、許可する必要がありますクエリの内部(WHERE句など)でSecret列を使用します。
CREATE TABLE Person
(
Id ...,
Secret ...,
...
);
REVOKE ALL ON Person FROM PUBLIC;
GRANT SELECT(id) ON Person TO SomeOne;
したがって、私の解釈が正しければ、SomeOneがデータを選択したとき:
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はそれを許可していません、そして正当な理由があります。基本的に、シークレットでクエリ結果を条件付けできる場合は、クエリを繰り返すことでシークレットの値を決定できるため、シークレットであると想定されるものがシークレットのままになることはありません。情報漏えいは非常に簡単です。
失敗したが「すべきではない」クエリを見ると...その結果から、返されるすべてのIdのシークレット値が1であることがわかります。したがって、これらのId値の場合、シークレットはシークレットではなくなります。
集合体データの検索のみが許可されている統計データベースを調べると、集合体(結果セットのSUM、COUNT、...)値。これはあなたが直面しているよりも複雑なシナリオです(しかし魅力的なシナリオです)。 C J Date's(絶版) "Introduction to Database Systems、Vol II" 統計データベースとユニークトラッカーについての議論があります。 (「統計データベースの一意のトラッカー」でのGoogle検索により、よりアクセスしやすい便利な情報が明らかになります。)
ですから、私が何を望んでいるのかを理解していれば、その欲求は誤った方向に進んでいると思います—そしてSQL標準はあなたが求めるものを許可していません。
回避策はありますか?
クエリをビューに組み込むことができる場合、ビューを作成する人は基になる詳細データにアクセスしてビューへのアクセスを許可できますが、ビューを使用する人は生のクエリを実行できません。これはあなたが求める保護を与えるかもしれません。同様のコメントがストアドプロシージャに適用され、クエリをより適切にパラメータ化できるようになります。