惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
U
Unit 42
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
G
Google Developers Blog
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
Jina AI
Jina AI
量子位
宝玉的分享
宝玉的分享
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
美团技术团队
The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tailwind CSS Blog
博客园 - 司徒正美
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
Vercel News
Vercel News
Martin Fowler
Martin Fowler
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Forbes - Security
Forbes - Security
Attack and Defense Labs
Attack and Defense Labs
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
P
Privacy International News Feed
G
GRAHAM CLULEY
The Last Watchdog
The Last Watchdog
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
V2EX - 技术
V2EX - 技术

博客园 - osbreak

ros2::tf2 QML::qml与c++数据交互 k8s:: Service 管理 deployment postgresql 索引 postgresql 基本类型 postgresql 基础运维 PLSQL 程序包 PLSQL 执行块 PLSQL 基础数据类型 PLSQL oracle安装部署 mysql事务与隔离 mysql慢查询分析 mysql建增删改查 mysql常用总结 (9)libevent 常用设置 (8)libevent 构建libevent http服务,支持文件下载 (7)libevent filter(过滤器) (6)libevent定时器 (5)libevent evbuffer
PLSQL 触发器
osbreak · 2023-12-10 · via 博客园 - osbreak

1.触发器

(1)触发器是当特定事件出现时自动执行的存储过程
(2)特定事件可以是执行更新的DML语句和DDL语句
(3)触发器不能被显式调用
(4)触发器的功能:

  • 自动生成数据
  • 自定义复杂的安全权限
  • 提供审计和日志记录
  • 启用复杂的业务逻辑

1.1 触发器类型

  • DDL 触发器: 在模式中执行 DDL 语句时执行
  • 数据库级触发器: 在发生打开、关闭、登录和退出数据库等系统事件时执行
  • DML 触发器: 在对表或视图执行DML语句时执行
  • 语句级触发器: 无论受影响的行数是多少,都只执行一次
  • 行级触发器: 对DML语句修改的每个行执行一次
  • INSTEAD OF 触发器: 用于用户不能直接使用 DML 语句修改的视图

1.2 触发器的组成部分

触发器语句(事件)
	定义激活触发器的 DML 事件和 DDL 事件
触发器限制
	执行触发器的条件,该条件必须为真才能激活触发器
触发器操作(主体)
	包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
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;

1.3 触发器谓词

  • INSERTING如果触发语句是 INSERT 语句,则为TRUE,否则为FALSE
  • UPDATING如果触发语句是 UPDATE语句,则为TRUE,否则为FALSE
  • DELETING如果触发语句是 DELETE 语句,则为TRUE,否则为FALSE

1.4 DML触发器的限制

  • 触发器中不能使用控制语句(commit,rollback,savepoint)
  • 由触发器所调用过程或函数也不能使用控制语句
  • 触发器中不能使用long, long raw类型

1.5 当触发器被触发时,要使用被插入,更新或删除的记录中的列值,有时要使用操作前、后列的值.

  • :new 修饰符访问操作完成后列的值
  • :old 修饰符访问操作完成前列的值
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;

1.6 语句级触发器

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;

1.7 模式触发器

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;

1.8 启用\禁用\删除 触发器

ALTER TRIGGER aiu_itemfile DISABLE;
ALTER TRIGGER aiu_itemfile ENABLE;
DROP TRIGGER  aiu_itemfile;

1.9 查看有关触发器的信息

SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME='EMP';
SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE 
	FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';