--触发器
--- 触发器定义:触发器是指存放在数据库中,并被隐含执行的存储过程。
--- 触发器组成:触发事件、触发条件、触发操作
--语句触发器语法:
create [or replace] trigger trigger_name
timing event1[or event2 or event3] on table_name
PL/SQL block;
--其中:
trigger_name 用于指定触发器的名称
timing 指定触发器时机
event 指定触发器事件
table_name 指定对应的表名
---当在触发器中同时包含多个触发事件(insert、update、delete),为了在触发器代码区分具体的触发事件,可使用
---条件谓词:
insert/update/delete:当事件被触发时,返回true,否则返回false
--例子1:
create or replace trigger tr_sec_emp
before insert or update or delete onscott.emp
--PL/SQL块
declare
--可以在此处声明变量
begin
--判断
if to_char(sysdate,'DY','nls_date_language=AMERICAN') in ('SAT','SUN') then
case
when inserting then
raise_application_error(-20001,'不能在休息日插入员工信息!');
when updating then
raise_application_error(-20002,'不能在休息日更新员工信息!');
when deleting then
raise_application_error(-20003,'不能在休息日删除员工');
end case;
end if;
end tr_sec_emp;
--执行触发器成功,输入以下语句:
update scott.emp set ename='张三';--如果是在星期六或星期天不能修改
delete from scott.emp;---如果是在星期六或星期天不能删除
--禁用触发器tr_sec_emp:
alter trigger tr_sec_emp disable ;
----行触发器:行触发器是指执行DML操作时,每作用一行就触发一次(审计数据变化时,可使用行触发器)
------行触发器的语法:
create [or replace ] trigger trigger_name
timing event1[or event2 or event3] on table_name
for each row[when condition]
PL/SQL block;
--其中:
trigger_name 用于指定触发器的名称
timing 指定触发器时机
event 指定触发器事件
table_name 指定对应的表名
for each row 表示建立行触发器
when 子句可选
----例子2:(:new.xxx---新数据 :old.xxx----旧数据)
create or replace trigger tr_emp_sal
before update on scott.emp
for each row
begin
if :new.sal<:old.sal then
raise_application_error(-20010,'工资只能涨,不能降');
end if;
end tr_emp_sal;---结束触发器
--执行触发器tr_emp_sal成功,输入以下语句:
update scott.emp set sal=100;---不能更改
---管理触发器
--1.显示触发器信息
select * from user_triggers;
--2.禁用触发器
alter trigger 触发器名 disable;
--3.激活触发器
alter trigger 触发器名 enable;
--4.禁止或激活表的所有触发器
alter table emp disable all triggers;--禁止
alter table emp enable all triggers;---激活
--5.重新编译触发器
alter trigger 触发器名 compile;
--6.删除触发器
drop trigger 触发器;
--- 触发器定义:触发器是指存放在数据库中,并被隐含执行的存储过程。
--- 触发器组成:触发事件、触发条件、触发操作
--语句触发器语法:
create [or replace] trigger trigger_name
timing event1[or event2 or event3] on table_name
PL/SQL block;
--其中:
trigger_name 用于指定触发器的名称
timing 指定触发器时机
event 指定触发器事件
table_name 指定对应的表名
---当在触发器中同时包含多个触发事件(insert、update、delete),为了在触发器代码区分具体的触发事件,可使用
---条件谓词:
insert/update/delete:当事件被触发时,返回true,否则返回false
--例子1:
create or replace trigger tr_sec_emp
before insert or update or delete onscott.emp
--PL/SQL块
declare
--可以在此处声明变量
begin
--判断
if to_char(sysdate,'DY','nls_date_language=AMERICAN') in ('SAT','SUN') then
case
when inserting then
raise_application_error(-20001,'不能在休息日插入员工信息!');
when updating then
raise_application_error(-20002,'不能在休息日更新员工信息!');
when deleting then
raise_application_error(-20003,'不能在休息日删除员工');
end case;
end if;
end tr_sec_emp;
--执行触发器成功,输入以下语句:
update scott.emp set ename='张三';--如果是在星期六或星期天不能修改
delete from scott.emp;---如果是在星期六或星期天不能删除
--禁用触发器tr_sec_emp:
alter trigger tr_sec_emp disable ;
----行触发器:行触发器是指执行DML操作时,每作用一行就触发一次(审计数据变化时,可使用行触发器)
------行触发器的语法:
create [or replace ] trigger trigger_name
timing event1[or event2 or event3] on table_name
for each row[when condition]
PL/SQL block;
--其中:
trigger_name 用于指定触发器的名称
timing 指定触发器时机
event 指定触发器事件
table_name 指定对应的表名
for each row 表示建立行触发器
when 子句可选
----例子2:(:new.xxx---新数据 :old.xxx----旧数据)
create or replace trigger tr_emp_sal
before update on scott.emp
for each row
begin
if :new.sal<:old.sal then
raise_application_error(-20010,'工资只能涨,不能降');
end if;
end tr_emp_sal;---结束触发器
--执行触发器tr_emp_sal成功,输入以下语句:
update scott.emp set sal=100;---不能更改
---管理触发器
--1.显示触发器信息
select * from user_triggers;
--2.禁用触发器
alter trigger 触发器名 disable;
--3.激活触发器
alter trigger 触发器名 enable;
--4.禁止或激活表的所有触发器
alter table emp disable all triggers;--禁止
alter table emp enable all triggers;---激活
--5.重新编译触发器
alter trigger 触发器名 compile;
--6.删除触发器
drop trigger 触发器;
本文介绍了Oracle数据库中的触发器,包括触发器的定义、组成、语句触发器语法及行触发器的使用。通过具体例子展示了如何创建、管理触发器,以及在特定条件下阻止DML操作。内容涵盖触发器在数据审计和业务规则限制上的应用。

642

被折叠的 条评论
为什么被折叠?



