【发布时间】:2010-10-29 20:29:30
【问题描述】:
让我用一个简化的例子来说明这个问题。假设我正在使用带有 PostgreSQL 关系数据库的 python 构建一个项目。在我的数据库中,我有两个表“parent”和“child”,它们通过表“parent_child”关联到 N 到 M。我希望能够以安全的方式检索有关特定父级所拥有的特定子级的一些数据,以下查询允许我这样做(X、Y 和 Z 是用户提供的文字):
SELECT child.age FROM parent, parent_child, child
WHERE child.id = parent_child.child_id AND parent_child.id = X
AND parent_child.parent_id = parent.id AND parent.id = Y
AND parent.password = Z;
假设用户出现并为 X、Y 或 Z 输入了错误的值,查询将返回一个空集,可以检测到该空集,并将一条消息传递给用户,指出存在错误。问题当然是我无法确定哪个值导致了问题,因此无法向用户提供有关他们错误输入内容的具体信息?
最简单的解决方案是将查询分成几个部分。首先,验证 parent.id 是否存在。
SELECT parent.id FROM parent WHERE parent.id = Y;
其次,检查密码是否正确。
SELECT parent.id FROM parent WHERE parent.id = Y and parent.password = Z;
第三,检查孩子是否存在。
SELECT child.id FROM child WHERE child.id = X;
第四,检查孩子是否为父母所有,并返回我们需要的信息。
SELECT child.age FROM child, parent_child WHERE parent_child.child_id = child.id AND parent_child.parent_id = Y AND parent_child.child_id = X;
这四个查询将允许我们检查有关用户提供的信息的具体内容,并在出现具体问题时报告具体问题。显然,四个查询与单个查询相比有很多额外的开销,我发现四个查询的可读性不如单个查询。那么有没有两全其美的呢?单个查询和详细的错误信息?
【问题讨论】:
-
我知道这只是一个示例,但我真的希望您实际上并没有要求用户直接提供 ID。还有更多用户友好的选择。
-
@Matt:虽然这只是一个例子,但在构建它时,我想到了一个 REST 服务器。 REST 通常在 URI 中有 ID。虽然最终用户通常不会更改 REST URI 的 ID,但使用 API 的程序员可能会导致一些错误,并且有关问题的详细报告可能很有用。
标签: sql user-interface error-handling relational-database