【问题标题】:Insertion prevent trigger with logical error condition具有逻辑错误条件的插入防止触发器
【发布时间】:2019-08-07 17:10:41
【问题描述】:

我正在尝试阻止将Card1 and Card2 更新为refer 表上的用户,该用户的资金少于表total_balance.total_money

是否可以将这样的逻辑与触发器相结合?

    DELIMITER $$
        CREATE trigger LessMoneyThanRequirePrevent
        Before update ON refer
        FOR EACH ROW
      BEGIN
           IF (total_balance.total_money<10 WHERE total_balance.username= NEW.refer.username)
              THEN
            SIGNAL SQLSTATE '45000' 
                SET MESSAGE_TEXT = 'Not enough money in your account! Insertion canceled';
              END IF;
         END
        $$
        DELIMITER;

我认为 WHERE 条件有问题?

表格:参考

 ID        username        Card1        Card2  
+-------+-------------+-------------+-----------+
|   1   |  John       |  Value      |    Value  |
+-------+-------------+-------------+-----------+
|   2   |  Alex       |  Null       |    Null   |
+-------+-------------+-------------+-----------+

表格:total_balance

 ID        username     total_money        
+-------+-------------+-------------+
|   1   |  John       |     10.0    |
+-------+-------------+-------------+
|   2   |  Alex       |     7.0     |
+-------+-------------+-------------+

例如: 用户 John 在 total_balance 上有足够的钱,允许更新 Card1 and Card2 但 Alex 不够 不允许

【问题讨论】:

    标签: mysql database-trigger


    【解决方案1】:

    需要更改 IF 条件。以下是触发器:

    DELIMITER $$
    CREATE trigger LessMoneyThanRequirePrevent
    Before update ON refer
    FOR EACH ROW
    BEGIN
       IF EXISTS(SELECT 1 FROM total_balance b WHERE b.total_money<10 AND b.username= NEW.username)
       THEN
          SIGNAL SQLSTATE '45000' 
            SET MESSAGE_TEXT = 'Not enough money in your account! Insertion canceled';
       END IF;
    END
    $$
    

    【讨论】:

    • 我不应该只选择一个用户!它应该阻止所有资金不足的人!
    • 触发器在引用表上,适用于更新记录的人,而不是特定用户。
    • 包含完整的触发器
    • FWIW,在我看来,我们希望反过来检查条件。如果存在余额 >= 10 的匹配行,那么我们允许更新继续进行,否则我们会引发错误。考虑例如如果total_balance 表中没有任何匹配的“Alex”行会发生什么。我们要允许更新refer 表吗?这取决于规范,我并不真正了解,但与我可能使用触发器来强制执行此类操作的情况相比,我倾向于确认“是的,此用户有足够的 total_money”跨度>
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多