SQL触发器

create trigger wg_intercept_command_log_trigger
before insert on wg_intercept_command_log
for each row   #这句话在mysql是固定的
begin
if not exists(
select 1 from wg_intercept_command_log where process_id=new.process_id
and unit_id=new.unit_id 
and type='MOVE_EVENT' 
and begin_time=new.begin_time 
 and end_time=new.end_time 
)then
insert into wg_intercept_command_log
  values 
(
new.id,
 new.type,
new.begin_time,
new.end_time,
new.unit_id,
  new.target_unit_id,
new.process_id,
new.force_side_id,
new.sucess
);
 end if;
end;
### SQL 触发器概述 SQL触发器是一种特殊的存储过程,在特定的数据库事件发生时自动执行。这些事件通常涉及对表的操作,如`INSERT`、`UPDATE`或`DELETE`。触发器可以在事件之前(`BEFORE`)或之后(`AFTER`)执行,并且可以针对每一行(`FOR EACH ROW`)单独处理[^2]。 ### 创建触发器的基本语法 创建触发器的标准SQL语法如下: ```sql CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- 触发器要执行的动作 END; ``` 对于某些数据库管理系统(DBMS),比如Oracle,还支持`INSTEAD OF`类型的触发器,用于视图上的操作[^4]。 ### 实际应用案例分析 #### 维护数据完整性 假设有一个员工信息表`employees`和一个部门信息表`departments`。每当向`employees`表中添加新记录时,希望自动更新对应部门的人数统计。这可以通过创建一个`AFTER INSERT`触发器来完成: ```sql CREATE OR REPLACE TRIGGER update_department_count_after_insert AFTER INSERT ON employees FOR EACH ROW BEGIN UPDATE departments SET num_of_employees = num_of_employees + 1 WHERE department_id = :new.department_id; END; / ``` 此代码片段展示了如何利用`:new`伪记录访问刚插入的新行中的值。 #### 审计日志功能 为了跟踪谁何时更改了哪些数据,可以设置触发器在每次更新某张表的时候写入一条新的审计记录到另一张专门的日志表里去。下面是一个简单的例子: ```sql CREATE TABLE audit_log ( id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(50), action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, affected_table VARCHAR(100), old_value TEXT, new_value TEXT ); DELIMITER // CREATE TRIGGER log_employee_changes AFTER UPDATE ON employees FOR EACH ROW BEGIN IF OLD.salary <> NEW.salary THEN INSERT INTO audit_log(user_name, affected_table, old_value, new_value) VALUES ('current_user', 'employees', CONCAT('Salary was ', OLD.salary), CONCAT('New salary is ', NEW.salary)); END IF; END;// DELIMITER ; ``` 这里使用了条件判断语句(IF...THEN...)仅当工资发生变化时才记录变更详情。 ### 注意事项与最佳实践 尽管触发器非常有用,但在实际开发过程中也需要注意一些潜在的风险点: - **性能开销**:频繁触发可能会给系统带来额外负载; - **调试难度较大**:由于其隐秘性质,出现问题不易定位原因; - **事务一致性**:需谨慎考虑触发动作是否应该参与当前事务还是独立运行; 因此建议开发者们合理规划触发器的设计方案,确保既能满足业务需求又不会引入不必要的复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值