网站首页 > 技术文章 正文
1 触发器
触发器是当特定事件出现时自动执行的存储过程
特定事件可以是执行更新的DML语句和DDL语句
触发器不能被显式调用
触发器的功能:
自动生成数据 自定义复杂的安全权限 提供审计和日志记录 启用复杂的业务逻辑
2 创建触发器的语法
CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON table_or_view_name [REFERENCING {OLD [AS] old / NEW [AS] new}] [FOR EACH ROW] [WHEN (condition)] pl/sql_block;
3 触发器的组成部分
触发器由三部分组成:
触发器语句(事件) 定义激活触发器的 DML 事件和 DDL 事件
--在更新 emp_sal 列之后激活触发器 CREATE OR REPLACE TRIGGER trig_sal AFTER UPDATE OF empsal ON salary_records
触发器限制 执行触发器的条件,该条件必须为真才能激活触发器
--如果WHEN子句中的条件得到满足,将执行BEGIN 块中的代码 BEGIN sal_diff:=:NEW.empsal-:OLD.empsal; DBMS_OUTPUT.PUT_LINE(‘工资差额:’sal_diff); END;
触发器操作(主体) 包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
--只有在WHEN子句中的条件得到满足时,才激活trig_sal 触发器 FOR EACH ROW WHEN (NEW.empsal>OLD.empsal) DECLARE Sal_diff NUMBER;
BRFORE触发器的工作原理
AFTER触发器的工作原理
CREATE OR REPLACE TRIGGER aiu_itemfile AFTER INSERT ON itemfile FOR EACH ROW BEGIN IF (:NEW.qty_hand = 0) THEN DBMS_OUTPUT.PUT_LINE('警告:已插入记录,但数量为零'); ELSE DBMS_OUTPUT.PUT_LINE(‘已插入记录'); END IF; END; --AFTER create or replace trigger book_update_trigger1 AFTER update on book begin DBMS_output.put_line(' AFTER修改数据成功!2'); end; ---BRFORE create or replace trigger book_update_trigger2 before update on book begin DBMS_output.put_line(' before修改数据成功!1'); end;
4 触发器类型
4.1 行级触发器
---创建表 CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20)); ---创建序列 CREATE SEQUENCE SEQ_TEST; ----创建触发器(ID自动增长触发器) CREATE OR REPLACE TRIGGER BI_TEST_TRG BEFORE INSERT OR UPDATE OF ID ON TEST_TRG FOR EACH ROW BEGIN IF INSERTING THEN SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL; ELSE RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!'); END IF; END;
4.2 语句级触发器
CREATE OR REPLACE TRIGGER trgdemo AFTER INSERT OR UPDATE OR DELETE ON order_master BEGIN IF UPDATING THEN DBMS_OUTPUT.PUT_LINE(‘已更新 ORDER_MASTER 中的数据'); ELSIF DELETING THEN DBMS_OUTPUT.PUT_LINE(‘已删除 ORDER_MASTER 中的数据'); ELSIF INSERTING THEN DBMS_OUTPUT.PUT_LINE(‘已在 ORDER_MASTER 中插入数据'); END IF; END;
4.3 INSTEAD OF 触发器
--创建视图 CREATE OR REPLACE view book_view as select * from book; --创建触发器 CREATE OR REPLACE TRIGGER upd_ord_view INSTEAD OF UPDATE ON book_view FOR EACH ROW BEGIN update book set book_name=:new.book_name where book_id=:old.book_id; DBMS_OUTPUT.PUT_LINE('已激活触发器'); END; update book_view set book_name='java上班' where book_id='445501'
4.4 模式触发器
CREATE TABLE dropped_obj ( obj_name VARCHAR2(30), obj_type VARCHAR2(20), drop_date DATE); SQL> CREATE OR REPLACE TRIGGER log_drop_obj AFTER DROP ON SCHEMA BEGIN INSERT INTO dropped_obj VALUES( ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE); END;
ORA_DICT_OBJ_NAME 触发DDL的数据库对象名称
ORA_DICT_OBJ_TYPE 触发DDL的数据库对象类型
drop table employee2;
5 启用、禁用和删除触发器
启用和禁用触发器
SQL> ALTER TRIGGER aiu_itemfile DISABLE; SQL> ALTER TRIGGER aiu_itemfile ENABLE;
删除触发器
SQL> DROP TRIGGER aiu_itemfile;
6 查看有关触发器的信息
USER_TRIGGERS 数据字典视图包含有关触发器的信息
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME='EMP'; SQL> SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';
猜你喜欢
- 2024-09-23 (二)SQL数据模式、表、索引的建立与删除
- 2024-09-23 当我们输入一条SQL查询语句时,发生了什么?
- 2024-09-23 超详细!SQL语法速成就靠这篇了!(下)
- 2024-09-23 sql语句(sql语句增删改查)
- 2024-09-23 数据库触发器(数据库触发器的创建和使用)
- 2024-09-23 SQL创建触发器(sql创建触发器禁止修改成绩)
- 2024-09-23 MySQL_08_触发器(mysql触发器的使用及语法)
- 2024-09-23 被低估的SQL(被低估的中国半导体龙头)
- 2024-09-23 都2021年了不会还有人不会用SQL吧
- 2024-09-23 Navicat工具中“清空表”与“截断表”区别,望文生义惹的祸
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 573℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 513℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃启用MySQL查询缓存(mysql8.0查询缓存)
- 469℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 449℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 447℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)