功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录

5、 防止无效的事务处理
6、 启用复杂的业务逻辑
开始
create trigger
biufer_employees_department_id
before insert or update
of department_id

on employees
referencing old as old_value
new as new_value
for
each row
when (new_value.department_id<>80 )
begin

:new_value.commission_pct :=0;
end;
/
触发器的组成部分:
1、 触发器名称

2、 触发语句
3、 触发器限制
4、 触发操作
1、 触发器名称
create trigger
biufer_employees_department_id
命名习惯:
biufer(before insert update for
each row)
employees 表名
department_id 列名
2、 触发语句
比如:

表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown 等等
before insert or
update
of department_id
on employees
referencing old as old_value

new as new_value
for each row
说明:
1、 无论是否规定了department_id
,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候
3、
触发器限制
when (new_value.department_id<>80 )

限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表跟新之后的值。

4、 触发操作
是触发器的主体
begin
:new_value.commission_pct :=0;
end;

主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into
employees(employee_id,

last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct
)
values( 12345,'Chen','Donny', sysdate, 12,
‘donny@hotmail.com',60,10000,.25);
select commission_pct from employees
where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
触发器类型:
1、 语句触发器

2、 行触发器
3、 INSTEAD OF 触发器
4、 系统条件触发器
5、 用户事件触发器
1、 语句触发器

是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、

DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次

。比如,无论update多少行,也只会调用一次update语句触发器。
例子:

需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);

Create trigger biud_foo
Before insert or update or delete
On foo

Begin
If user not in (‘DONNY') then
Raise_application_error(-20001,
‘You don't have access to modify this table.');
End if;
End;
/

即使SYS,SYSTEM用户也不能修改foo表
[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表

create table employees_copy as select *from hr.employees
2、 建立日志表

create table employees_log(
who varchar2(30),
when date);
3、
在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger
biud_employee_copy
Before insert or update or delete
On employees_copy

Begin
Insert into employees_log(
Who,when)
Values( user,
sysdate);
End;
/
4、 测试
update employees_copy set salary=
salary*1.1;
select *from employess_log;
5、 确定是哪个语句起作用?

即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING /
DELETING 条件谓词,作判断:
begin
if inserting then
-----
elsif updating
then
-----
elsif deleting then
------
end if;
end;
if
updating(‘COL1') or updating(‘COL2') then
------
end if;
[试验]
1、
修改日志表
alter table employees_log
add (action varchar2(20));
2、
修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copy
Before
insert or update or delete
On employees_copy
Declare
L_action
employees_log.action%type;
Begin
if inserting then

l_action:='Insert';
elsif updating then
l_action:='Update';

elsif deleting then
l_action:='Delete';
else

raise_application_error(-20001,'You should never ever get this error.');

Insert into employees_log(
Who,action,when)
Values( user,
l_action,sysdate);
End;
/
3、 测试
insert into employees_copy(
employee_id, last_name, email, hire_date, job_id)

values(12345,'Chen','Donny@hotmail',sysdate,12);
select *from
employees_log
update employees_copy set salary=50000 where employee_id =
12345;
2、 行触发器
是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:

1、 定义语句中包含FOR EACH ROW子句
2、 在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。

比如:
定义:
create trigger biufer_employees_department_id
before
insert or update
of department_id
on employees_copy
referencing old
as old_value
new as new_value
for each row
when
(new_value.department_id<>80 )
begin
:new_value.commission_pct
:=0;
end;
/
Referencing 子句:
执行DML语句之前的值的默认名称是 :old ,之后的值是 :new

insert 操作只有:new
delete 操作只有 :old
update 操作两者都有

referencing子句只是将new 和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为
new的表时。

作用不很大。
[试验]:为主健生成自增序列号
drop table foo;
create table foo(id
number, data varchar2(20));
create sequence foo_seq;
create or replace
trigger bifer_foo_id_pk
before insert on foo
for each row
begin

select foo_seq.nextval into :new.id from dual;
end;
/
insert
into foo(data) values(‘donny');
insert into foo values(5,'Chen');
select
* from foo;
3、 INSTEAD OF 触发器更新视图
Create or replace
view company_phone_book as
Select first_name||', '||last_name name, email,
phone_number,
employee_id emp_id
From hr.employees;
尝试更新email和name

update hr.company_phone_book
set name='Chen1, Donny1'
where
emp_id=100
create or replace trigger update_name_company_phone_book

INSTEAD OF
Update on hr.company_phone_book
Begin
Update
hr.employees
Set employee_id=:new.emp_id,
First_name=substr(:new.name,
instr(:new.name,',')+2),
last_name=
substr(:new.name,1,instr(:new.name,',')-1),
phone_number=:new.phone_number,

email=:new.email
where employee_id=:old.emp_id;
end;
4、
系统事件触发器
系统事件:数据库启动、关闭,服务器错误
create trigger ad_startup
after
startup
on database
begin
-- do some stuff
end;
/

5、 用户事件触发器
用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE
/ AUDIT / GRANT / REVOKE /
RENAME / TRUNCATE / LOGOFF
例子:记录删除对象
1.
日志表
create table droped_objects(
object_name varchar2(30),

object_type varchar2(30),
dropped_on date);
2.触发器
create or
replace trigger log_drop_trigger
before drop on donny.schema
begin

insert into droped_objects values(
ora_dict_obj_name, -- 与触发器相关的函数

ora_dict_obj_type,
sysdate);
end;
/
3. 测试

create table drop_me(a number);
create view drop_me_view as select *from
drop_me;
drop view drop_me_view;
drop table drop_me;
select *from
droped_objects
禁用和启用触发器
alter trigger <trigger_name> disable;

alter trigger <trigger_name> enable;
事务处理:
在触发器中,不能使用commit /
rollback
因为ddl语句具有隐式的commit,所以也不允许使用
视图:
dba_triggers

本文转自http://www.jb51.net/article/18252.htm

转载于:https://www.cnblogs.com/bingle/p/4034434.html

oracle触发器update本表数据相关推荐

  1. oracle中before,oracle触发器before和after数据区别

    oracle触发器中,一旦数据被插入了,不能使用after insert去更改已经插入的,已经存在,更改会使触发器不执行. 如果想将查询出来的数据插入到数据库中,应该先拼接好,然后before命令会将 ...

  2. 使用SQL语句UPDATE更新表数据

    使用SQL语句UPDATE更新表数据 基本语法格式如下: TOP(expression)[PERCENT]:指定将要更新的行数或行百分比. SET:指定要更新的列或变量名称的列表. column_na ...

  3. oracle 触发器统计本表数据库,Oracle触发器查询统计本表

    Oracle触发器查询统计本表 这次由于项目需要,实际动手演练了一把,达到了需要的效果,大致是插入数据后,统计表内和当前插入数据时间相同的个数. 采用行级触发器+语句级触发器. --包 CREATE ...

  4. mysql 触发器 本表_MySQL触发器处理本表数据

    关于MySQL的触发器,基本上每个Mysql教程里都有讲到,但是我发现那些教程里讲的都是如何处理其他表的数据.在MySQL中写触发器操作 关于MySQL的触发器,基本上每个Mysql教程里都有讲到,但 ...

  5. oracle条件批量更新表数据

    更新表数据,当t2.t3的条件符合时更新t1为null update table_name t set t.t1 = null where t.t2 = '是' or t.t3='否' 在plsql工 ...

  6. Oracle 触发器 Update 不能操作本表的疑问

    今天要解决一个需求,类似表A有个字段叫flag存储的是0 or  1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...

  7. 两台oracle怎样定期导表数据,定期从Oracle导数据至MySQL

    因部分项目需求,需要将Oracle中单表的数据定期导入至MySQL,注意此处对数据的时效性要求不高.要求高可以利用goldengate 首先,需要将visit表中的vid,userid,goodid, ...

  8. oracle触发器中保存临时数据,Oracle使用游标触发器存储实操

    如果你在Oracle游标触发器的存储的实际操作中,你对Oracle使用游标触发器的存储过程有不解之处时,你可以通过以下的文章对其的实际应用与功能有所了解,以下是文章的具体介绍,望你浏览完以下的内容会有 ...

  9. oracle比较两个表数据的差异

    转自:https://zhidao.baidu.com/question/494572740.html 如有两张相同表结构的表: test表: test1表: 现在要找出两张表有差异的数据,需要用mi ...

  10. Oracle导出表结构和表数据

    导出文件 找到oracle安装目录ORACLE_HOME,进入bin目录,找到 exp.exe exp 用户名/密码@数据库连接 file=dmp文件导出路径 log=日志文件输出路径 例子: exp ...

最新文章

  1. DreamWeaver文件保存时,提示发生共享违例问题的解决方法
  2. 傅里叶变换应用——信号调制与解调
  3. 43 MM配置-采购-条件-定价过程-定义存取顺序
  4. IT公司组织机构和职位、职位职责
  5. 远程连接Linux密码特殊字符,[转载]linux shell 命令_特殊字符
  6. 39.伪造重定向ICMP数据包
  7. TPC-DS生成数据
  8. 计算机找不到网络链接,找不到宽带连接的解决办法-电脑故障
  9. dismiss和remove_为什么不会在onDestroy或onPause中解雇Dialog,removeDialog或dialog.dismiss工作?...
  10. python打砖块游戏程序设计报告_打砖块游戏课程设计报告
  11. 【Java 8 新特性】Java Stream 通过min()和max()获取列表最小值和最大值
  12. 生活中的统计概率思维
  13. 一个在线测试正则表达式的网站推荐
  14. 7-11 到底是不是太胖了(10 分)
  15. 求平均数(1~10)
  16. 【20考研】如何度过一个有意义的寒假?
  17. Linux环境下不安装DM数据库,编译dmPython
  18. 历史数据双色球小工具
  19. BUUCTF-Crypto-MD5
  20. M3U8视频下载合并工具

热门文章

  1. 组件化与插件化的差别在哪里?醍醐灌顶!
  2. oracle的floor用法,PLSQL FLOOR用法及代码示例
  3. 对校招生培养工作的建议_19、贵单位对我院学生培养工作有何建议:
  4. SOS关于组建星际物质研究自愿者协会的倡议
  5. 18岁少年辍学组建黑客俱乐部 已覆盖62所学校
  6. 如何使用pdf转换器
  7. iOS CNContactStore 与AddressBook
  8. 《图解TCP/IP》读书笔记
  9. 腾达f6虚拟服务器,腾达(Tenda)F6路由器无线wifi设置
  10. flappy bird用java实现_java实现Flappy Bird游戏源代码