博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle中触发器的讲解
阅读量:5740 次
发布时间:2019-06-18

本文共 2198 字,大约阅读时间需要 7 分钟。

  触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

 

create sequence seq_userInfo_usid start with 1001;

create or replace triggle tri_userInfo_usid --创建或替换触发器tri_userInfo_usid
before insert on userInfo --在向userInfo表中添加 记录之前的触发
for each row --没影响一行出发一次
begin --触发之后执行下面的语句
select seq_userInfo_usid.nextval into :new.usid from dual; --:new新值 :old老值
end;

 

案列

 

--日志 触发器讲解

--查看所有触发器

select * from user_triggers;
--禁用触发器
alert trigger tri_log_uname(触发器名字) disable;
--激活触发器
alert trigger tri_log_uname(触发器名字) enble;
--重新编译
alert trigger tri_log_uname complie;
--禁用某个表上的触发器
alert table <table_name> diable all triggers;
create table log(
uname varchar2(20),
action varchar2(10),
acttime date
);
--从U001开始,以递增的形式对uname进行命名
create sequence seq_log_uname start with 1001;
create or replace trigger tri_log_uname
before insert on log
for each row
begin
select 'U'||substr(seq_log_uname.nextval,1) into :new.uname from dual;
end;
insert into log values(1,'yc',sysdate);
select * from log;
create or replace trigger tri_log
after insert or update or delete on dept
for each row --for each 行级触发,执行语句没影响一行出发一次,默认是语句级触发,没执行一条语句触发一次,无论该语句影响多少行,
begin
if inserting then
insert into log values(user,'insert',sysdate);
elsif updating then
insert into log values(user,'update',sysdate);
elsif deleting then
insert into log values(user,'delete',sysdate);
end if;
end;
select * from dept;
insert into dept values(80,'技术部','湖南衡阳');
select * from log;
--更改dept和emp中的deptno的值(涉及主外键)
create or replace trigger tri_dept
before update on dept
for each row
begin
update emp set deptno=:new.deptno where deptno=:old.deptno;
end;
update dept set deptno=88 where deptno=20;
select * from dual;
select * from dept;
select * from emp;

create or replace trigger tri_emp
before update of sal on emp --当修改emp表中的sal列在值时
for each row
when(new.sal<=old.sal)
begin
select 3000 into :new.sal from dual;
end;
select * from emp;
update emp set sal=4000 where empno=7369;

转载于:https://www.cnblogs.com/yaobolove/p/4781971.html

你可能感兴趣的文章
好用的java进度条上传文件
查看>>
Redis之java操作篇(Jedis)
查看>>
能ping通,能解析,却打不开网页,提示dns错误的解决办法
查看>>
ubuntu Qt WebKit编译
查看>>
批处理遍历当前目录和子目录查找指定后缀名的文件并修改后缀名
查看>>
MySQL SQL语句优化技巧
查看>>
使用 monogodb 的C API 来遍历 bson 的数组对象
查看>>
利用HTML5的一个重要特性 —— DeviceOrientation来实现手机网站上的摇一摇功能
查看>>
java实现简单的四则运算
查看>>
MySQL5.1版本的主从复制搭建
查看>>
XlsReadWrite 写保护疑惑??
查看>>
Mysql中的count()与sum()区别详细介绍
查看>>
页面刷新方法介绍
查看>>
Spark中hive的使用(hive操作es示例)
查看>>
前端页面Javascript实现 考试系统中上一页、下一页 展示
查看>>
PHP与MySQL权威指南
查看>>
曹连雨-曙光云计算与智慧城市战略及实践
查看>>
JFDepthView
查看>>
Don't Release custom typ UIButton by yourself
查看>>
linux定时运行命令脚本——crontab
查看>>