我不确定我是否正确理解了这个问题,但它似乎要求能够限制从 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 不允许这样做,这是有充分理由的。基本上,如果您可以对 Secret 的查询结果进行条件化,您可以通过重复查询来确定 Secret 的值,因此应该是秘密的东西不会成为秘密。很容易泄露信息。
查看失败但“不应该”的查询...从其结果中,您知道返回的每个 Id 的 Secret 值都是 1,因此对于这些 Id 值,Secret 不再是秘密。
如果您查看统计数据库,您只能在其中搜索聚合数据,您会发现有一些称为独特跟踪器的东西,基本上可以让您识别一个人的特征,即使您只被允许查看结果集中的聚合 (SUM, COUNT, ...) 值。这是一个比您所面临的更复杂的情况(但令人着迷)。 C J Date 的(长期绝版)"Introduction to Database Systems, Vol II" 讨论了统计数据库和唯一跟踪器。 (在“统计数据库唯一跟踪器”上的 Google 搜索显示了更易于访问的有用信息。)
所以,如果我理解了想要什么,我相信这种愿望是错误的——SQL 标准不允许你寻求什么。
有什么解决方法吗?
如果可以将查询构建到视图中,则创建视图的人可以访问底层详细数据并授予对视图的访问权限,但使用视图的人无法执行原始查询;这可能会给您寻求的保护。类似的 cmets 适用于存储过程并允许更好地参数化查询。