温馨提示×

Ubuntu Informix的触发器如何使用

小樊
33
2025-12-13 03:58:24
栏目: 智能运维

Ubuntu 上使用 Informix 触发器的完整指南

一 环境准备与连接

  • 安装与配置环境变量:在 Ubuntu 上安装 Informix 客户端/SDK,并设置环境变量(示例):
    • 设置 INFORMIXDIR(如:/opt/informix
    • 设置 LD_LIBRARY_PATH=$INFORMIXDIR/lib:$LD_LIBRARY_PATH
    • 使配置生效:source ~/.bashrcsource /etc/profile
  • 连接与执行 SQL:使用 dbaccessisql 连接数据库并执行 DDL/DML。例如:
    • dbaccess your_database - <<'EOF' ... EOF
    • isql -v your_database your_user your_password
  • 以上准备完成后,即可在 Ubuntu 终端中对 Informix 数据库创建与管理触发器。

二 触发器核心概念与命名规则

  • 触发事件:INSERT、UPDATE、DELETE
  • 触发时机:BEFORE、AFTER,行级触发使用 FOR EACH ROW
  • 触发动作:可执行的 INSERT/UPDATE/DELETEEXECUTE PROCEDURE
  • 行级引用:使用 REFERENCING NEW AS n / OLD AS o 访问新/旧行数据
  • 条件控制:可在触发块前后使用 WHEN (condition) 进行过滤
  • 状态控制:创建时可指定 ENABLED(默认)或 DISABLED
  • 命名规则:触发器名在数据库中必须唯一不超过 18 个字符、且以字母开头

三 常用语法模板

  • 行级触发器通用模板(示意)
    CREATE TRIGGER trigger_name
      {INSERT | UPDATE [OF col1, col2, ...] | DELETE}
      ON table_name
      REFERENCING {NEW AS n | OLD AS o | NEW AS n OLD AS o}
      FOR EACH ROW
      [WHEN (condition)]
      (trig_action1 [, trig_action2 ...])
      [BEFORE | AFTER]
      [WHEN (condition)]
      (trig_action1 [, trig_action2 ...])
      [DISABLED | ENABLED];
    
  • 说明
    • INSERT 仅可使用 NEW
    • DELETE 仅可使用 OLD
    • UPDATE 可使用 NEW/OLD,也可限定 OF 列清单
    • 可在同一触发定义中组合 BEFORE/AFTER 与多个 WHEN
    • 动作体可以是单条或多条 DML,或调用存储过程

四 完整示例 审计日志与字段更新

  • 场景:对业务表 t_cust 的增删改进行审计,并在插入时为 id 生成序列值(通过序列/序列器实现)。
  • 建表与序列
    CREATE TABLE t_cust (
      id   SERIAL PRIMARY KEY,
      name VARCHAR(60) NOT NULL,
      status CHAR(1)
    );
    
    CREATE SEQUENCE seq_cust START WITH 1;
    
  • 审计表
    CREATE TABLE t_cust_audit (
      id       SERIAL PRIMARY KEY,
      cust_id  INTEGER,
      action   CHAR(1),         -- I/U/D
      op_time  DATETIME YEAR TO FRACTION(5)
    );
    
  • 触发器
    -- 插入前:用序列为 NEW.id 赋值,并写入审计
    CREATE TRIGGER trg_cust_ins
      INSERT ON t_cust
      REFERENCING NEW AS n
      FOR EACH ROW
      ( EXECUTE PROCEDURE setval('seq_cust', NEXTVAL('seq_cust')) INTO n.id,
        INSERT INTO t_cust_audit(cust_id, action, op_time)
        VALUES (n.id, 'I', CURRENT) );
    
    -- 更新后:记录审计
    CREATE TRIGGER trg_cust_upd
      UPDATE ON t_cust
      REFERENCING OLD AS o NEW AS n
      FOR EACH ROW
      INSERT INTO t_cust_audit(cust_id, action, op_time)
      VALUES (o.id, 'U', CURRENT);
    
    -- 删除前:记录审计
    CREATE TRIGGER trg_cust_del
      DELETE ON t_cust
      REFERENCING OLD AS o
      FOR EACH ROW
      INSERT INTO t_cust_audit(cust_id, action, op_time)
      VALUES (o.id, 'D', CURRENT);
    
  • 说明
    • 通过 REFERENCING NEW AS nBEFORE INSERT 中为自增列赋值,再写入审计
    • 审计表记录 cust_id、操作类型、时间,便于追踪变更历史。

五 管理与排错常用操作

  • 查看与导出对象定义
    • 导出整个库对象(含触发器)到文件:
      dbschema -d your_database db_schema.sql
      
    • 仅导出触发器定义:
      dbschema -d your_database -t trigger > triggers.sql
      
  • 启停与删除
    • 禁用/启用触发器:
      ALTER TRIGGER trigger_name DISABLE;
      ALTER TRIGGER trigger_name ENABLE;
      
    • 删除触发器:
      DROP TRIGGER trigger_name;
      
  • 事务与锁的注意
    • 触发器在触发语句的事务上下文中执行;若触发器内 DML 失败,将回滚触发语句所在事务
    • 大量行级触发可能增加锁竞争与日志量,必要时考虑批量/异步审计方案
  • 常见限制与建议
    • 触发器名需唯一且 ≤18 字符、以字母开头
    • 触发器动作体不宜复杂,避免长事务与递归触发
    • BEFORE INSERT 中可用 NEW 进行赋值;在 BEFORE UPDATE 中可修改 NEW 列值;OLD 在 DELETE/UPDATE 中为只读
    • 若需跨库/跨模式审计,确保权限与路径正确。

0