ubuntu

Ubuntu Informix触发器使用指南

小樊
45
2025-06-07 19:02:17
栏目: 智能运维

在Ubuntu系统上使用Informix数据库触发器,可以参考以下指南:

触发器的基本概念

创建触发器的语法

INSERT触发器

CREATE TRIGGER trigger_name 
INSERT ON table_name 
BEFORE [WHEN (condition)] (trig_action1, trig_action2,...) 
FOR EACH ROW [WHEN (condition)] (trig_action1, trig_action2,...) 
AFTER [WHEN (condition)] (trig_action1, trig_action2,...)[DISABLED ENABLED];

DELETE触发器

CREATE TRIGGER trigger_name 
DELETE ON table_name 
BEFORE [WHEN (condition)] (trig_action1, trig_action2,...) 
FOR EACH ROW [WHEN (condition)] (trig_action1, trig_action2,...) 
AFTER [WHEN (condition)] (trig_action1, trig_action2,...)[DISABLED ENABLED];

UPDATE触发器

CREATE TRIGGER trigger_name 
UPDATE [OF (column, column,...)] ON table_name 
BEFORE [WHEN (condition)] (trig_action1, trig_action2,...) 
FOR EACH ROW [WHEN (condition)] (trig_action1, trig_action2,...) 
AFTER [WHEN (condition)] (trig_action1, trig_action2,...)[DISABLED ENABLED];

示例触发器

  1. 简单的BEFORE INSERT触发器
CREATE TRIGGER check_salary 
BEFORE INSERT ON employees 
FOR EACH ROW 
WHEN (NEW.salary < 0) 
BEGIN 
    RAISE EXCEPTION -746, 0, "Salary cannot be negative"; 
END;
  1. AFTER UPDATE触发器记录变更
CREATE TRIGGER log_employee_changes 
AFTER UPDATE ON employees 
REFERENCING OLD AS old_emp NEW AS new_emp 
FOR EACH ROW 
BEGIN 
    INSERT INTO employee_audit (emp_id, change_date, old_salary, new_salary, changed_by) 
    VALUES (old_emp.emp_id, CURRENT, old_emp.salary, new_emp.salary, USER); 
END;
  1. 级联删除触发器
CREATE TRIGGER cascade_delete_order 
BEFORE DELETE ON orders 
FOR EACH ROW 
BEGIN 
    DELETE FROM order_items WHERE order_id = OLD.order_id; 
END;

管理触发器

SELECT trigname, event, owner 
FROM systriggers 
WHERE tabid IN (SELECT tabid FROM systables WHERE tabname = 'table_name');
SELECT data 
FROM sysprocbody b, sysprocedures p 
WHERE b.procid = p.procid AND p.procname = 'trigger_name';

修改触发器

Informix不支持直接修改触发器,需要先删除再重新创建:

DROP TRIGGER trigger_name;
-- 然后重新创建

禁用/启用触发器

Informix没有直接的禁用触发器命令,可以通过以下方式实现:

export INFORMIXCONTINUE=1
CREATE TRIGGER trigger_name ... WHEN (1=0); -- 条件永远为假

请注意,以上信息基于搜索结果,可能不包含最新的Informix版本更新。建议参考Informix官方文档以获取最准确的信息。

0
看了该问题的人还看了