diff --git "a/\350\247\246\345\217\221\345\231\250\344\277\235\345\255\230\345\255\230\346\254\276\343\200\201\345\217\226\346\254\276\343\200\201\350\275\254\350\264\246\347\232\204\344\272\244\346\230\223\350\256\260\345\275\225\343\200\202" "b/\350\247\246\345\217\221\345\231\250\344\277\235\345\255\230\345\255\230\346\254\276\343\200\201\345\217\226\346\254\276\343\200\201\350\275\254\350\264\246\347\232\204\344\272\244\346\230\223\350\256\260\345\275\225\343\200\202" new file mode 100644 index 0000000000000000000000000000000000000000..57c88d2355cb719f689d03f9503ae9af84c127c8 --- /dev/null +++ "b/\350\247\246\345\217\221\345\231\250\344\277\235\345\255\230\345\255\230\346\254\276\343\200\201\345\217\226\346\254\276\343\200\201\350\275\254\350\264\246\347\232\204\344\272\244\346\230\223\350\256\260\345\275\225\343\200\202" @@ -0,0 +1,143 @@ +DELIMITER // + +-- 1. 存款触发器 +DROP TRIGGER IF EXISTS trg_after_deposit; +CREATE TRIGGER trg_after_deposit +AFTER UPDATE ON cardInfo +FOR EACH ROW +BEGIN + IF NEW.balance > OLD.balance THEN + INSERT INTO tradeInfo(tradeDate, tradeType, cardID, tradeMoney, remark) + VALUES (NOW(), '存款', NEW.cardid, NEW.balance - OLD.balance, + CONCAT('存款操作,余额:', OLD.balance, '→', NEW.balance)); + END IF; +END // + +-- 2. 取款触发器 +DROP TRIGGER IF EXISTS trg_after_withdraw; +CREATE TRIGGER trg_after_withdraw +AFTER UPDATE ON cardInfo +FOR EACH ROW +BEGIN + IF NEW.balance < OLD.balance AND @transfer_from IS NULL THEN + INSERT INTO tradeInfo(tradeDate, tradeType, cardID, tradeMoney, remark) + VALUES (NOW(), '取款', NEW.cardid, OLD.balance - NEW.balance, + CONCAT('取款操作,余额:', OLD.balance, '→', NEW.balance)); + END IF; +END // + +-- 3. 转账存储过程(优化版) +DROP PROCEDURE IF EXISTS sp_transfer; +CREATE PROCEDURE sp_transfer( + IN from_card CHAR(19), + IN to_card CHAR(19), + IN amount DECIMAL(18,2), + OUT result BOOLEAN, + OUT message VARCHAR(255) +) +proc_main: BEGIN + -- 声明变量及异常处理 + DECLARE from_bal DECIMAL(18,2); + DECLARE from_cur CHAR(3); + DECLARE to_cur CHAR(3); + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + SET result = FALSE; + SET message = '转账失败:系统异常'; + END; + + SET result = FALSE; + SET message = ''; + + -- 验证金额有效性 + IF amount <= 0 THEN + SET message = '转账金额必须大于0'; + LEAVE proc_main; + END IF; + + -- 检查转出账户 + SELECT balance, curid INTO from_bal, from_cur + FROM cardInfo + WHERE cardid = from_card AND isreportloss = '否'; + + IF from_bal IS NULL THEN + SET message = '转出账户不存在或已挂失'; + LEAVE proc_main; + END IF; + + -- 检查转入账户 + SELECT curid INTO to_cur + FROM cardInfo + WHERE cardid = to_card AND isreportloss = '否'; + + IF to_cur IS NULL THEN + SET message = '转入账户不存在或已挂失'; + LEAVE proc_main; + END IF; + + -- 检查余额充足性 + IF from_bal < amount THEN + SET message = CONCAT('余额不足,当前余额:', from_bal); + LEAVE proc_main; + END IF; + + -- 检查货币类型一致性 + IF from_cur <> to_cur THEN + SET message = '转入/转出账户货币类型不匹配'; + LEAVE proc_main; + END IF; + + -- 开启事务并执行转账 + START TRANSACTION; + BEGIN + -- 设置转账标记(用于触发器识别) + SET @transfer_from = from_card; + SET @transfer_to = to_card; + SET @transfer_amount = amount; + + -- 执行账户余额更新 + UPDATE cardInfo SET balance = balance - amount WHERE cardid = from_card; + UPDATE cardInfo SET balance = balance + amount WHERE cardid = to_card; + + -- 清除转账标记 + SET @transfer_from = NULL; + SET @transfer_to = NULL; + SET @transfer_amount = NULL; + END; + COMMIT; + + -- 设置成功状态 + SET result = TRUE; + SET message = '转账操作成功完成'; +END // + +-- 4. 转账转出记录触发器 +DROP TRIGGER IF EXISTS trg_transfer_out; +CREATE TRIGGER trg_transfer_out +AFTER UPDATE ON cardInfo +FOR EACH ROW +BEGIN + IF @transfer_from IS NOT NULL AND NEW.cardid = @transfer_from AND NEW.balance < OLD.balance THEN + INSERT INTO tradeInfo(tradeDate, tradeType, cardID, tradeMoney, remark) + VALUES (NOW(), '转账', NEW.cardid, OLD.balance - NEW.balance, + CONCAT('转出到', @transfer_to, ',金额:', OLD.balance - NEW.balance, + ',余额变化:', OLD.balance, '→', NEW.balance)); + END IF; +END // + +-- 5. 转账转入记录触发器 +DROP TRIGGER IF EXISTS trg_transfer_in; +CREATE TRIGGER trg_transfer_in +AFTER UPDATE ON cardInfo +FOR EACH ROW +BEGIN + IF @transfer_to IS NOT NULL AND NEW.cardid = @transfer_to AND NEW.balance > OLD.balance THEN + INSERT INTO tradeInfo(tradeDate, tradeType, cardID, tradeMoney, remark) + VALUES (NOW(), '转账', NEW.cardid, NEW.balance - OLD.balance, + CONCAT('从', @transfer_from, '转入,金额:', NEW.balance - OLD.balance, + ',余额变化:', OLD.balance, '→', NEW.balance)); + END IF; +END // + +DELIMITER ;