欢迎各位兄弟 发布技术文章
这里的技术是共享的
- create or replace trigger trig
- after update on emp20
- for each row
- begin
- if(:old.sal > :new.sal) then
- raise_application_error(-20000,'新薪资不能少于原薪资');
- end if;
- end;
- create or replace trigger trig
- after update on dept for each row
- begin
- update emp20 set deptno=:NEW.deptno where deptno=:OLD.deptno;
- end;
注意:触发器中不能存在commit或者是rollback;否则报错
--查看用户下的触发器
select * from user_triggers;
--通过触发器名称,查找其源码
select * from all_source where type = 'TRIGGER' and name = 'TRIG1';
来自 https://blog.csdn.net/xldmx/article/details/81331615
来自 https://zhidao.baidu.com/question/555109810.html
看到了触发器 中有个 for each row 不是很明白就查了查资料,因为只是简单研究,就先写总结一下。
触发器的一般语法:
CREATE [OR REPLACE] TIGGER 触发器名 触发时间 触发事件
ON 表名
[FOR EACH ROW]
BEGIN
PL/SQL 语句;
END;
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
for each row 的意思是:这个触发器是行触发器。
行触发器和语句触发器的区别:
1、行触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器
2、语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器
3、当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器
例子:
--限制更新操作
create or replace TRIGGER L_TEST_TRI
BEFORE UPDATE OF YEAR ON L_TEST
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.YEAR<:OLD.YEAR THEN
RAISE_APPLICATION_ERROR(-20002,'更新后的年份比更新前小');
END IF;
END;
--在非规定事件内插入数据
create or replace TRIGGER L_TEST_TRI
BEFORE INSERT ON L_TEST
DECLARE
BEGIN
IF TO_CHAR(SYSDATE,'DAY') IN ('星期四','星期六','星期日')
OR TO_NUMBER(TO_CHAR(SYSDATE,'HH24')) NOT BETWEEN 8 AND 24 THEN
RAISE_APPLICATION_ERROR(-20000, '不能在规定事件之外插入数据');
END IF;
END;
来自 https://blog.csdn.net/yin_jia_521/article/details/66972935