username - 撤消select to database.Person
我设置
GRANT SELECT (id) ON database.Person TO 'username'@'localhost'
不是工作 - >
SELECT secret FROM Person // Good!
不是工作 - >
SELECT id FROM Person WHERE secret = 1 // BAD!
我需要SELECT id FROM Person WHERE secret = 1
才能使用!
答案 0 :(得分:4)
我不确定我是否正确理解了这个问题,但它似乎要求能够限制人员从Persons表中选择数据,以便他们无法在Secret列中看到该值,但是他们应该允许在查询内部使用Secret列(在WHERE子句中等)。
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不再是机密。
如果您查看只允许搜索汇总数据的统计数据库,您会发现有一些名为Unique Trackers的东西基本上允许您识别一个人的特征,即使您只被允许请参阅结果集中的聚合(SUM,COUNT,...)值。这是一个比你面临的更复杂的场景(但是一个非常有趣的场景)。 C J Date(已绝版)"Introduction to Database Systems, Vol II"讨论了统计数据库和唯一跟踪器。 (Google搜索“统计数据库唯一跟踪器”会显示更有用的外观信息。)
所以,如果我理解了所需要的东西,我相信这种愿望是错误的 - 而且SQL标准不允许你所寻求的东西。
有没有解决方法?
如果查询可以构建到视图中,则创建视图的人可以访问基础详细数据并授予对视图的访问权限,但使用该视图的人员无法执行原始查询;这可能会给你你寻求的保护。类似的注释适用于存储过程,并允许更好地参数化查询。
答案 1 :(得分:0)
这是不可能的,因为您不允许访问“秘密”列。你想要程序员能够读取秘密。在这种情况下,您应该让他访问Secret列。
如果您不想允许访问Secret列,那么您也不应该允许WHERE子句。使用二进制搜索,可以找出Secret的实际值。只需执行SELECT并检查每次是否返回任何内容,然后重复。