一、什么是触发器?

触发器trigger,是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用,有行级触发器和语句级触发器之分。

  • 行级触发器:触发的表中的每一条数据改变时就会被触发一次。
  • 语句级触发器:在某些语句执行前或执行后被触发。

接着,对触发器的语法和基本操作认识一下:

1、创建触发器(定义)

-- 触发时间参数:before表示在数据库动作之前执行触发器,after则是之后;
-- 触发事件:如insert/delete/update;
-- 表名:触发器触发动作指定的表;
-- for each row:表每一行触发一次,没有这个选项,对整个表触发执行一次;
create [or replace] trigger 触发器名 触发时间 触发事件
on 表名
[for each row]
beginpl/sql语句
end

2、触发器其他基本操作(删除,禁用/启用)

--删除触发器
drop trigger  触发器名;
--禁用指定的触发器
alter trigger 触发器名 disable;
--启用指定的触发器
alter trigger 触发器名 enable;
--禁用指定表中的所有触发器
alter table 表名 disable all triggers;
--启用指定表中的所有触发器
alter table 表名 enable all triggers;

举个例子,实际感受下:

-- 在表 ai_carsharing_record 插入数据后,打印"数据插入成功啦!"。
create or replace trigger tcar
after insert
on  ai_carsharing_record
declare
begin
dbms_output.put_line('数据插入成功啦!');
end;

结果:

二、为什么要用触发器?

实际工作中,可能会遇到如下场景,则需要考虑使用触发器:

  • 允许/限制对表的修改;
  • 自动生成派生列,比如实现字段自增;
  • 强制数据一致性,比如数据的备份和同步;
  • 启用复杂的业务逻辑;
  • 提供审计和日志记录等等。

因此,触发器的使用还是挺广泛的,根据实际情况选择使用。当然,实际开发基本很少使用触发器,因为触发器的效率不高,而且容易导致多个表发生错误,寻找错误相当麻烦,通常使用存储过程

三、Oracle中怎么使用触发器?

通过自己以前写过的两个例子演示下:

1. 通过 触发器(trigger) 和 序列(sequence) 的组合实现指定字段自增

SQL> set serverutput on -- 创建基础表
SQL> create table ai_site(site_id number(10))  not null primary key,site_name varchar2(50),lat number(15,10),lng number(15,10),description varchar2(100));
表已创建。-- 创建序列
SQL> create sequence seq_site  increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;
序列已创建。-- 创建触发器(注意begin-end块里的语法,避免写错报:警告: 创建的触发器带有编译错误。)
SQL> create or replace trigger tsite
before insert  on ai_site
for each row
declare
beginselect seq_site.nextval into :new.site_id from dual;
end;
/
触发器已创建-- 测试触发器是否生效(site_id被设置为了主键不为空,这里利用触发器执行序列自增)
SQL> insert into ai_site(site_name,lat,lng,description) values('科大讯飞北门',null,null,'云飞路与永和路交口附近');
已创建 1 行。SQL> commit;
提交完成。-- 禁用基础表的所有触发器
SQL> alter table ai_site disable all triggers;
表已更改。-- 测试效果
SQL> insert into ai_site(site_name,lat,lng,description) values('科大讯飞北门',null,null,'云飞路与永和路交口附近');
insert into ai_site(site_name,lat,lng,description) values('科大讯飞北门',null,null,'云飞路与永和路交口附近')
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("XIAOPINGZI"."AI_SITE"."SITE_ID")

2. 通过 触发器(trigger) 实现数据的备份和同步

SQL> set serverutput on
SQL>set linesize 200;-- 备份主表结构和数据
SQL> create table ai_carsharing_record_bak as select * from ai_carsharing_record where 1=1;-- 先查询一下主表和备份表的数据
SQL> select "car_way" from ai_carsharing_record where "record_id"=1;
car_way
--------------------------------------------------
皖水公寓SQL> select "car_way" from ai_carsharing_record_bak where "record_id"=1;
car_way
--------------------------------------------------
皖水公寓SQL> create or replace trigger trecord
after update on ai_carsharing_record
for each row
beginupdate ai_carsharing_record_bak set "car_way"=:new."car_way" ,  "car_from"=:new."car_from" where  "record_id"=:new."record_id";
end;
/
触发器已创建--  测试
SQL>   update ai_carsharing_record set "car_way"='华纺新华成' where  "record_id"=1;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select "car_way" from ai_carsharing_record_bak where "record_id"=1;
car_way
--------------------------------------------------
华纺新华成

【Oracle】常用对象之触发器相关推荐

  1. ORACLE 常用的SQL语法和数据对象

    一.数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSE ...

  2. Oracle常用傻瓜问题1000问

    1. Oracle安装完成后的初始口令? internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_tem ...

  3. oracle 常用知识点整理

    转 :  oracle 常用知识点 原文链接:http://blog.csdn.net/weijiaxiaobao/article/details/51323573 Oracle 是一个庞大的系统,里 ...

  4. DBA必知的170张Oracle常用动态性能表介绍

     DBA必知的170张Oracle常用动态性能表介绍 常用动态性能表.pdf 附录C 动态性能(V$)视图 本附录介绍动态性能视图.这些视图一般作为V$视图引用.本附录包括下列内容: ???? 动态性 ...

  5. oracle常用SQL语句(汇总版)

    原文地址:https://www.cnblogs.com/xrhou12326/p/4094737.html Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语 ...

  6. oracle常用笔记(二)

    文章目录 oracle常用笔记(二) 1. 视图 2. 索引 3. pl/sql 基本语法 1. 变量声明 2. if分支 3. LOOP 循环 4. 游标Cursor 4. 存储过程 5. 存储函数 ...

  7. Oracle常用命令(一)

    关于Oracle常用命令总结: 第一点:唯一约束.主键约束 alter table ownername.tablename[注:表名] add constraint 字段名_unique[注:索引名] ...

  8. Oracle常用问题1000问

    1. Oracle安裝完成后的初始口令? internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_tem ...

  9. oracle常用语句大全 来自csdn

    1. Oracle安装完成后的初始口令?  internal/oracle  sys/change_on_install  system/manager  scott/tiger  sysman/oe ...

最新文章

  1. 如何用Pandas处理文本数据?
  2. mapreduce任务出错最大尝试次数
  3. 你对博客中提到的评分规则有何意见和建议?
  4. unity2018关联不到vs_现实VS真爱:远嫁的幸福和悲哀
  5. mysql表连接_SELECT中的多表连接
  6. index merge的数据结构和成本评估
  7. Flask的路由、蓝图和装饰器
  8. SURF算法之Opencv代码详解
  9. 基于STM32的鱼塘远程监测系统
  10. 怎样为受惊吓的孩子叫魂
  11. 计算机图片怎么截图快捷键,电脑怎么截图,常见的截图快捷键
  12. 【优雅解决】:换源后 sudo apt-get update 出现 N: Updating from such a repository can't be done securely……
  13. 如何无痛写文章 - 《麦肯锡教我的写作武器》
  14. Yii Zii组件 CGridView 使用详解
  15. 第二章第十六题(几何:六边形面积)(Geometry: area of a hexagon)
  16. 华为实验28-WAN接入配置
  17. SQL编程-获取员工其当前的薪水比其manager当前薪水还高的相关信息
  18. jq插件处女座 图片轮播
  19. summation()
  20. Building Maintainable Software-java篇之Couple Architecture Components Loosely

热门文章

  1. 将oracle端口1521共享_解决oracle 端口 1521 本机127可通 其他ip不通
  2. 简述TCP/IP四层模型和OSL七层模型的概念,每一层的作用,这两个模型的区别是什么?...
  3. Limitations of the Lipschitz constant as a defense against adversarial examples
  4. 小米手机 小米10、11、12 连接AirPods 声音小
  5. yii框架下的后台管理员登录操作
  6. (附源码)计算机毕业设计ssm电影网站系统设计
  7. easyExcel导入报错excelType
  8. java计算机毕业设计景区在线购票系统MyBatis+系统+LW文档+源码+调试部署
  9. 想转行学Java,却又担心自己半路出家成不了大牛
  10. 契约测试Pact实践