触发器定义:
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。
触发器(主要)组成:
触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
触发器一般语法:
创建语法是 :
CREATE TRIGGER trigger_name (触发器名字) {BEFORE | AFTER }(前/后触发 (选一个))
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON [schema.] table_name
(触发条件是什么DML事件)
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
trigger_body;
每张表最多可创建12种触发器:
BEFORE INSERT
BEFORE INSERT FOR EACH ROWA
FTER INSERT
AFTER INSERT FOR EACH ROW
BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDAT
EAFTER UPDATE FOR EACH ROW
BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW
触发器执行的顺序是:
1.执行 BEFORE语句级触发器 对与受语句影响的每一行:
1.1执行 BEFORE行级触发器
1.2执行 DML语句
1.3执行 AFTER行级触发器
2.执行 AFTER语句级触发器
创建触发器举例:
CREATE OR REPLACE TRIGGER del_emp
BEFORE DELETE ON scott.emp FOR EACH ROW
BEGIN
-- 将修改前数据插入到日志记录表 del_emp ,以供监督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,
:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
触发器的限制:
CREATE TRIGGER语句文本的字符长度不能超过32KB
触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句 触发器中不能使用数据库事务控制语句 COMMIT, ROLLBACK, SVAEPOINT 语句
由触发器所调用的过程或函数也不能使用数据库事务控制语句
触发器中不能使用LONG, LONG RAW 类型
触发器内可以参照LOB类型列的列值,但不能通过 :NEW 修改LOB列中的数据
行级别触发器中的相关标识符 :
当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值 ,可以使用: :NEW 修饰符访问操作完成后列的值
:OLD 修饰符访问操作完成前列的值
删除触发器使用下面的语句:
DROP TRIGGER trigger_name;
当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER系统权限,
当删除建立在数据库上的触发器时,用户需要具有ADMINISTER DATABASE TRIGGER系统权限。此外,当删除表或视图时,建立在这些对象上的触发器也随之删除
select * from emp;
--创建触发器
CREATE TRIGGER del_empA
BEFORE update or insert or delete ON scott.emp --触发器触发的满足情况
REFERENCING new AS nn old AS oo
FOR EACH ROW --创建行触发器要写;如果是表触发器则不需要.
-- WHEN (nn.sal > 20)
BEGIN
dbms_output.put_line(:nn.sal||'------'||:oo.sal); --触发器的函数体
END;
--插入数据
insert into emp
values(0001,'zwi','it',222,to_date('1888-9-3','yyyy-mm-dd'),90000,null,20);
--修改数据
update emp
set job='it',sal=900
where empno=1;
--删除数据
delete emp where empno=1;
--删除触发器
drop TRIGGER del_empA;
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。
触发器(主要)组成:
触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
触发器一般语法:
创建语法是 :
CREATE TRIGGER trigger_name (触发器名字) {BEFORE | AFTER }(前/后触发 (选一个))
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON [schema.] table_name
(触发条件是什么DML事件)
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
trigger_body;
每张表最多可创建12种触发器:
BEFORE INSERT
BEFORE INSERT FOR EACH ROWA
FTER INSERT
AFTER INSERT FOR EACH ROW
BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDAT
EAFTER UPDATE FOR EACH ROW
BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW
触发器执行的顺序是:
1.执行 BEFORE语句级触发器 对与受语句影响的每一行:
1.1执行 BEFORE行级触发器
1.2执行 DML语句
1.3执行 AFTER行级触发器
2.执行 AFTER语句级触发器
创建触发器举例:
CREATE OR REPLACE TRIGGER del_emp
BEFORE DELETE ON scott.emp FOR EACH ROW
BEGIN
-- 将修改前数据插入到日志记录表 del_emp ,以供监督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,
:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
触发器的限制:
CREATE TRIGGER语句文本的字符长度不能超过32KB
触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句 触发器中不能使用数据库事务控制语句 COMMIT, ROLLBACK, SVAEPOINT 语句
由触发器所调用的过程或函数也不能使用数据库事务控制语句
触发器中不能使用LONG, LONG RAW 类型
触发器内可以参照LOB类型列的列值,但不能通过 :NEW 修改LOB列中的数据
行级别触发器中的相关标识符 :
当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值 ,可以使用: :NEW 修饰符访问操作完成后列的值
:OLD 修饰符访问操作完成前列的值
删除触发器使用下面的语句:
DROP TRIGGER trigger_name;
当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER系统权限,
当删除建立在数据库上的触发器时,用户需要具有ADMINISTER DATABASE TRIGGER系统权限。此外,当删除表或视图时,建立在这些对象上的触发器也随之删除
select * from emp;
--创建触发器
CREATE TRIGGER del_empA
BEFORE update or insert or delete ON scott.emp --触发器触发的满足情况
REFERENCING new AS nn old AS oo
FOR EACH ROW --创建行触发器要写;如果是表触发器则不需要.
-- WHEN (nn.sal > 20)
BEGIN
dbms_output.put_line(:nn.sal||'------'||:oo.sal); --触发器的函数体
END;
--插入数据
insert into emp
values(0001,'zwi','it',222,to_date('1888-9-3','yyyy-mm-dd'),90000,null,20);
--修改数据
update emp
set job='it',sal=900
where empno=1;
--删除数据
delete emp where empno=1;
--删除触发器
drop TRIGGER del_empA;