xiaotuziyibalang 2024-05-05 00:14 采纳率: 40%
浏览 21
已结题

Oracle触发器记录修改前后的字段值

img

以上两个表,表A是业务表,表B是日志表。
要求用Oracle触发器实现当用户修改了标签价时,将品类、修改前、修改后写入到表B的品类、修改前、修改后字段中,并记录修改时间。

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-05 00:14
    关注

    引自免费微信小程序:皆我百晓生

    为了实现您的需求,我们需要创建一个Oracle触发器,该触发器在表A(业务表)上的标签价字段被更新时触发,然后将修改前后的标签价以及修改时间记录到表B(日志表)中。以下是详细的步骤和触发器代码示例:

    表结构假设

    • 表A (业务表): 假设表名为PRODUCTS

      • ID (主键)
      • CATEGORY (品类)
      • PRICE (标签价)
    • 表B (日志表): 假设表名为PRICE_CHANGE_LOG

      • ID (自增序列主键)
      • PRODUCT_ID (与表A的ID关联)
      • OLD_PRICE (修改前价格)
      • NEW_PRICE (修改后价格)
      • MODIFICATION_TIME (修改时间)

    创建触发器

    创建一个DML触发器(After Update类型),在PRODUCTS表的PRICE字段更新后记录变化信息到PRICE_CHANGE_LOG表。

    CREATE OR REPLACE TRIGGER trg_log_price_changes
    AFTER UPDATE OF PRICE ON PRODUCTS
    FOR EACH ROW
    BEGIN
       -- 检查是否真的有价格变化,避免无意义的日志记录
       IF :NEW.PRICE != :OLD.PRICE THEN
          INSERT INTO PRICE_CHANGE_LOG (
             PRODUCT_ID,
             OLD_PRICE,
             NEW_PRICE,
             MODIFICATION_TIME
          )
          VALUES (
             :OLD.ID,          -- 修改前的ID
             :OLD.PRICE,       -- 修改前的价格
             :NEW.PRICE,       -- 修改后的价格
             SYSDATE           -- 当前系统时间作为修改时间
          );
       END IF;
    END;
    /
    

    解释

    1. TRIGGER: 定义触发器名为trg_log_price_changes
    2. AFTER UPDATE OF PRICE ON PRODUCTS: 指定在PRODUCTS表的PRICE字段更新之后触发。
    3. FOR EACH ROW: 表示对于每一行更新操作都会执行触发器中的代码。
    4. IF条件: 确保只有当价格确实发生变化时才记录日志,避免无变动时产生冗余日志。
    5. INSERT INTO: 将变化的数据插入到PRICE_CHANGE_LOG表中。
    6. :OLD 和 :NEW: 这些是Oracle中的伪列,分别代表更新前的行值(:OLD)和更新后的行值(:NEW)。
    7. SYSDATE: 获取当前系统时间,用于记录修改时间。

    注意事项

    • 确保在执行上述脚本之前,PRICE_CHANGE_LOG表已经存在且具有正确的结构。
    • 如果IDPRODUCTS表中不是唯一的,可能需要调整逻辑以正确记录PRODUCT_ID
    • 在生产环境中部署前,建议先在测试环境中验证触发器的功能。

    通过这个触发器,每当表A中的标签价发生更改时,相关的信息就会自动记录到表B中,满足您的需求。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月5日
  • 修改了问题 5月5日
  • 创建了问题 5月5日