Informix触发器是数据库对象,本质是一段预编译的SQL代码或存储过程,自动响应表或视图上的特定数据库操作(如INSERT、DELETE、UPDATE)。与存储过程不同,触发器无需手动调用,由数据库引擎在触发事件发生时隐式执行,主要用于实现数据完整性约束、业务规则强制或操作审计等功能。
Informix触发器的实现依赖四大核心要素,这些要素共同决定了触发器的触发条件和执行逻辑:
trg_customer_insert)。INSERT(插入行)、DELETE(删除行)、UPDATE(更新列);UPDATE触发器可通过OF子句指定具体列(如UPDATE OF unit_price),仅当这些列被修改时触发。BEFORE:在触发事件执行前触发(如验证数据合法性);AFTER:在触发事件执行后触发(如记录操作日志);FOR EACH ROW:行级触发(对触发事件的每一行记录都执行,如逐行更新关联表)。INSERT、DELETE、UPDATE或EXECUTE PROCEDURE(如调用log_customer_proc记录日志)。Informix触发器的执行流程遵循“事件触发→条件判断→动作执行”的逻辑,具体步骤如下:
INSERT INTO customer VALUES (...))时,数据库引擎检测该表上是否有匹配的触发器(如BEFORE INSERT触发器)。WHEN子句(如WHEN (new.unit_price > 0)),数据库引擎会先评估该条件;仅当条件为TRUE时,才会执行后续触发操作。BEFORE/AFTER),执行触发操作:
BEFORE触发器:先执行触发操作(如验证new.unit_price合法性),再执行触发事件(插入行);若触发操作失败(如抛出异常),触发事件将回滚(不执行)。AFTER触发器:先执行触发事件(插入行),再执行触发操作(如向customer_log表插入日志);触发操作失败不会影响触发事件的执行结果。FOR EACH ROW,数据库引擎会对触发事件的每一行记录重复上述流程(如插入10行则执行10次)。BEFORE触发器中,可通过NEW虚拟表访问即将插入或更新的行数据(如new.name),并可修改这些值(如SET new.unit_price = new.unit_price * 0.9);AFTER触发器中,可通过OLD虚拟表访问被删除或更新前的行数据(如old.unit_price),但不可修改。ENABLED(默认):触发器激活,触发事件发生时自动执行;DISABLED:触发器创建但不激活,需通过ALTER TRIGGER语句启用。INSERT或DELETE触发器,但可有多个UPDATE触发器(需指定不同OF列,且列清单互斥);以下是一个BEFORE INSERT行级触发器的示例,用于在customer表插入数据前自动设置create_time字段,并记录日志到customer_log表:
-- 创建目标表和日志表
CREATE TABLE customer (
id CHAR(10) PRIMARY KEY,
name VARCHAR(50),
unit_price DECIMAL(10,2),
create_time DATETIME YEAR TO FRACTION(5)
);
CREATE TABLE customer_log (
log_id INT AUTO_INCREMENT,
operation CHAR(1),
customer_id CHAR(10),
log_time DATETIME YEAR TO FRACTION(5),
user_name VARCHAR(30)
);
-- 创建BEFORE INSERT触发器
CREATE TRIGGER trg_customer_before_insert
BEFORE INSERT ON customer
FOR EACH ROW
BEGIN
-- 设置create_time为当前时间
SET new.create_time = CURRENT;
-- 记录日志(调用存储过程)
EXECUTE PROCEDURE log_customer_proc(new.id, 'I', CURRENT, USER);
END;
该触发器的执行流程为:当执行INSERT INTO customer VALUES ('C001', 'Apple', 999.99)时,数据库引擎先执行触发器中的SET new.create_time = CURRENT(设置创建时间),再执行EXECUTE PROCEDURE(记录日志),最后完成customer表的插入操作。