SQL触发器

触发器简介
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。
触发器可以分为:语句级触发器和行级触发器。
1、在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。
这个就是删除表的操作就是触发器执行的条件了。
2、在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。

--触发器语法:
CREATE [OR REPLACE] TRIGGER TRIGGER_NAME
{BEFORE | AFTER} TRIGGER_EVENT
ON TABLE_NAME
[FOR EACH ROW]
[WHEN TRIGGER_CONDITION]
TRIGGER_BODY
语法解释:
TRIGGER_NAME:   触发器名称
BEFORE | AFTER : 指定触发器是在触发事件发生之前触发或者发生之后触发
TRIGGER_EVENT:  触发事件,在DML触发器中主要为INSERTUPDATEDELETE等
TABLE_NAME:     表名,表示发生触发器作用的对象
FOR EACH ROW:   指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
WHEN TRIGGER_CONDITION:添加的触发条件
TRIGGER_BODY:   触发体,是标准的PL/SQL语句块
insert  into dept  values(50,'数据开发','广州')

create table myemp(
       num number,
       name varchar2(10),
       deptno number);

insert  into myemp  values(1001,'张三',50);
insert  into myemp  values(1002,'李四',50);
insert  into myemp  values(1003,'张三',50);

创建触发器,当删除DEPT表中50号部门的时候,同时删除myemp所有50号部门的员工信息
create or replace trigger delete_dept                       --创建dept表触发器
       after delete or insert or update of  deptno       --删除部门号字段后 触发 触发器
       on dept                                                            --
       for each row
begin
  if deleting then delete from myemp where myemp.deptno=:OLD.deptno;
     end if;
end;

delete from dept where deptno=50
### 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、付费专栏及课程。

余额充值