在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];
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;
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;
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官方文档以获取最准确的信息。