代码之家  ›  专栏  ›  技术社区  ›  Nixuz

是否可以从复杂的数据库查询创建详细的错误消息?

  •  4
  • Nixuz  · 技术社区  · 14 年前

    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输入了错误的值,则查询将返回一个空集,可以检测到该空集,并向用户传递一条错误消息。当然,问题是我无法确定是哪个值导致了问题,因此无法向用户提供有关他们错误输入的内容的特定信息?

    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;
    

    这四个查询将允许我们检查有关用户提供的信息的特定内容,并在出现特定问题时报告这些问题。显然,与单个查询相比,四个查询有很多额外的开销,我发现四个查询的可读性不如一个查询。那么,有没有两个世界都最好的呢?一个查询和详细的错误消息?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Quassnoi    14 年前
    SELECT  p.id, p2.z AS pw, pc.parent_id, CASE p2.z WHEN p.pw THEN c.age END AS age
    FROM    (VALUES (1)) AS p1(y)
    LEFT JOIN
            parent p
    ON      p.id = p1.y
    LEFT JOIN
            (VALUES ('pw1')) AS p2(z)
    ON      p2.z = p.pw
    CROSS JOIN
            (VALUES(1)) AS p3(x)
    LEFT JOIN
            child c
    ON      c.id = p3.x
    LEFT JOIN
            parent_child pc
    ON      pc.parent_id = p.id
            AND pc.child_id = c.id
    

    NULLs 在适当的列中意味着适当的条件失败。

        2
  •  1
  •   Dave Markle    14 年前

    好吧,这里的问题在于查询实际上并没有出错——它每次都会为您的条件提供正确的信息。因此,如果不逐个检查每个查询,就没有办法知道。

        3
  •  0
  •   PerformanceDBA    14 年前

    这四个查询将允许我们检查有关用户提供的信息的特定内容,并在出现特定问题时报告这些问题。

    是的,这是标准程序(这是有原因的)。假设您正在更新行:您将用尽所有类型的服务器资源,例如事务日志,但却发现它失败了,并将整个事务回滚。完全可以避免。在尝试下一个级别之前,请始终检查每个级别。在执行完全验证之前,不要锁定或更新任何内容。不要尝试任何事情,除非你确信它会成功。在这种情况下,您不会进行更新,但是标准允许您在最早的时候以通常的方式隔离错误,并避免浪费资源(在稍后的级别由于先前的失败)。

    显然,与单个查询相比,在四个查询中有很多额外的开销

    • 第一个语句=50
    • 第三个语句=50
    • 第四条语句(因为父语句和子语句在缓存中)=2+2+50
    • 更重要的是,在出现错误的情况下,成本(取决于错误的位置)是50、52或102个单位

    • 而独立的第四个报表则需要150个单位

    我发现四个查询的可读性不如一个查询。

    如果需要提高可读性,请在中间加上空格和注释。(反正你的代码别人很难读,我会格式化的。)

    一个查询和详细的错误消息?

    好吧,您得到的是详细的错误,不多不少;您要求的是将错误隔离到代码中的特定点(或用户请求)。如果您正在编写一个通用的存储过程,并返回一个错误代码,那么将需要我标识的序列。