一、涉及内容

1.理解触发器的概念、作用和类型。

2.练习触发器的创建和使用。

二、具体操作

(实验)

1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作。(第1题中,user是系统函数,返回当前用户。字符串中使用两个单引号表示一个单引号。)

要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果。

(1)在scott用户下创建触发器

语句:

create or replace trigger tri_dm1
before insert or update or delete on scott.emp
begin
if user <>'SCOTT' then
raise_application_error(-20001,'You don''t have access to modify this table.');
end if;
end;
/

截图:

(2)以system 用户连接,并对emp表执行DML操作

语句:

conn system/orcl1234;
insert into scott.emp(empno,ename) values(8888,'shenxiao');

截图:

(3)以scott用户连接,并对emp表执行DML操作

语句:

conn scott/tiger;
insert into scott.emp(empno,ename) values(8888,'shenxiao');

截图:

2.利用触发器进行表和备份表之间的同步复制。

(1)在scott 用户下创建scott.emp 表的复本 employee。

语句:

conn scott/tiger;

create table employee as select * from scott.emp;

截图:

(2)在scott用户下创建能实现scott.emp和employee 两表之间同步复制的DML触发器。

语句:

create or replace trigger duplicate_emp
after update or insert or delete on scott.emp
for each row
begin
if inserting then
insert into employee values (:new.empno,:new.ename,:new.job,:new.mgr,
:new.hiredate,:new.sal,:new.comm,:new.deptno);
elsif deleting then
delete from employee where empno=:old.empno;
else
update employee set empno=:new.empno,ename=:new.ename,job=:new.job,
mgr=:new.mgr,hiredate=:new.hiredate,sal=:new.sal,comm=:new.comm,
deptno=:new.deptno
where empno=:old.empno;
end if;
end;
/

截图:

(3)对scott.emp表进行插入、删除和更新操作。

删除:delete from scott.emp where empno=7934;

插入:

Insert into scott.emp(empno,ename,job,sal) values(1111,'zhangsan','ANALYST',2900)

更新:

update scott.emp set sal=3900 where empno=1111;

(4)查询scott.emp表和employee表中插入、删除和更新的记录。

语句:select * from scott.emp;

select * from employee;

截图:

3.建立触发器,对scott.emp 表进行DML操作时的时间、用户进行日志记录。

(1)建立日志表emp_log。

语句:create table emp_log(who varchar2(30),when date,oper varchar2(10));

截图:

(2)在emp表上建立语句级触发器,将对emp表执行的操作记录到emp_log表中。

语句:

 create or replace trigger dm1_log
after insert or update or delete on scott.emp
declare
oper emp_log.oper%type;
begin
if inserting then
oper:='insert';
elsif deleting then
oper:='delete';
else
oper:='update';
end if;
insert into emp_log values(user,sysdate,oper);
end;
/

截图:

(3)对scott.emp 执行DML操作,查看emp_log 表中的数据。

语句:

insert into scott.emp(empno)  values(1112);

select * from emp_log;

截图:

(习题)

1.简述Oracle 数据库中触发器的类型及触发条件。

答:触发器的类型及触发条件如下表所示:

按划分类型

触发器的类型

触发条件

按照触发的时间

BEFORE触发器,指事前触发器

在触发语句执行前触发器被触发

AFTER触发器,指事后触发器

在触发语句执行以后触发器被触发

INSTEAD OF触发器,指替代触发器

触发语句被触发器操作替代

按照触发的事件

DML触发器

对表或视图执行DML操作时触发的触发器

DDL触发器

在数据库中执行DDL操作时触发的触发器

用户事件触发器

与用户执行的DCL操作或LOGON/LOGOFF操作相关的触发器

系统事件触发器

是指由数据库系统事件触发的触发器

其中,DML触发器,按照触发时DML操作影响的记录多少,又可分为:

行级触发器 :DML语句每操作一行,行级触发器就会被调用一次

语句级触发器 :DML语句不论影响多少行数据,语句级触发器只被调用一次

DDL触发器又可以分为:

数据库级DDL触发器 :数据库中任何用户执行了相应的DDL操作该类触发器都被触发。

用户级DDL触发器 :只有在创建触发器时指定方案的用户执行相应的DDL操作时触发器才被触发,其他用户执行该DDL操作时触发器不会被触发。

2.描述一个触发器的组成部分及其作用。

答:在Oracle系统中,触发器包括以下几个组成部分:

组成部分

作用

1.触发器名称

触发器名是在创建触发器为触发器起的名称。一般包括:触发器执行的时间、执行的操作、涉及的表、涉及的列等。

2.触发语句

触发语句是导致Oracle执行触发器操作的诱因,它包括对触发时间、触发事件和触发对象的定义。只有用户对数据库执行的操作满足触发语句中定义的所有内容后,触发器才有可能被系统自动调用。

3.触发限制条件

触发限制条件是决定触发器是否被系统自动调用的另一个因素。当用户的操作满足触发语句时,触发器不一定被调用,此时,系统还要检查触发器中是否定义了触发限制条件,如果存在,还要检查当前的操作是否满足限制条件。

4.触发器操作

触发器操作是触发器的主体,是被系统自动执行的PL/SQL 程序块。当触发语句和触发限制条件都满足时,系统将自动执行触发器操作部分的代码。

3.简述替代触发器的作用。

答:

创建触发器时若选择了INSTEAD OF子句,那么该触发器就是替代触发器。 替代触发器只能建立在视图上不能建立在表上。用户在视图上执行的DML操作将被替代触发器中的操作代替。

替代触发器主要解决对不可更新视图执行更新操作时带来的问题。在定义视图时,如果视图中没有选择基础表的主键咧,或者视图中的数据来自多个基础表,那么用户将无法对这样的视图直接执行插入、修改、删除操作。这种情况下,用户可以针对是视图创建一个替代触发器,将对视图的更新操作转换为对基础表的操作。

Oracle数据库——触发器的创建与应用的更多相关文章

  1. 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.1 安装Oracle数据库软件和创建数据库概览)

    当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 2.1 安装Oracle数据库软件和 ...

  2. oracle数据库触发器(trigger)用法总结

    from:http://blog.csdn.net/zhanzhib/article/details/48729417 触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert.updat ...

  3. Spotlight监控Oracle数据库的链接创建

    最近在做性能测试时,由于要挂载空间数据,开发人员直接将所有业务表都挂到了Oracle数据库中.最近做了几次测试发现响应时间和吞吐量都不是很理想,进行一番分析后怀疑可能在Oracle中出现问题,因此再网 ...

  4. Oracle数据库体系结构及创建表结构

    Oracle服务器主要由实例.数据库.程序全局区和前台进程组成,其中实例就是用来提供管理数据库的功能:数据库由数据库文件组成,用来存储系统数据:实例可以进一步划分为系统全局区(SGA)和后台进程(PM ...

  5. oracle 数据库中(创建、解锁、授权、删除)用户

    上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...

  6. Oracle数据库触发器使用(删除触发)

    当我们需要用到触发器的时候,还是很方便,你会指定当我在操作某一事件时触发效果完成我所希望完成的事情:这就是触发器, 下面我给大家上一串代码,这是一个当我在操作删除事件操作时候,我希望把即将删除那条数据 ...

  7. 基于oracle数据库存储过程的创建及调用

    1.PLSQL编程 1.1概念和目的 PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循 ...

  8. Oracle数据库视图的创建以及使用

    创建视图语句: CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH C ...

  9. Oracle数据库---触发器

    SQL> --当我们对empnew执行删除操作之后,它就会出现一个提示信息,提示:这是删除操作!SQL> CREATE TRIGGER first_trigger 2 AFTER DELE ...

随机推荐

  1. 在VS2010 中兼容Qt4和Qt5

    1,同时安装Qt4和Qt5 Qt_add,然后在 2. 如果之前的项目使用Qt4编写的,如果新添加新的类和ui的话,一定要选择Qt Add_in 1.1.11,不然就无法生成moc文件,随便选择 Ch ...

  2. Qemu+gdb跟踪内核源码

    1.编译安装Qemu Qemu源码下载地址:http://wiki.qemu.org/Download linux下可以直接用wget下载: wget http://wiki.qemu.org/dow ...

  3. 【LeetCode】Best Time to Buy and Sell Stock IV

    Best Time to Buy and Sell Stock IV Say you have an array for which the ith element is the price of a ...

  4. eclipse GIT使用

    新建工程(要和GIT上同名,同类型)->右键->team->add to index->commit->更新config文件->remote: fetch from ...

  5. 14、C#基础整理(函数)

    函数 1.概念:是一个带有输入参数.输出参数.返回值的代码块. 2.写法: 修饰符  返回值类型  函数名(输入参数,输入参数) { 方法段 return 返回值; } 3.注释: (1)输入参数格式 ...

  6. Unity3D ShaderLab 创建自定义高光类型

    Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数 ...

  7. Rest中获取制定操作的UriTemplate

    UriTemplate uri = WebOperationContext.Current.GetUriTemplate("DownloadFile");

  8. NSData和NSString 、 NSFileManager

    1 NSData和NSMutableData的基本使用 1.1 问题 NSData类是IOS提供的用于以二进制的形式操作文件数据的类,NSData有两个常用的属性length和bytes,length ...

  9. 在SourceInsight中用快捷键打开文件所在的目录

    创建一个Custom Command:  ShellExecute open %d.  然后关联一个快捷键.

  10. dede的pagelist标签的listsize数字属性详解(借鉴)

    dede的pagelist标签的listsize数字属性详解.见远seo经常用织梦搭建各种网站,有次发现列表页面的分页显示超过div的界限,也就是溢出了或者说是撑破了.后来经过研究发现是pagelis ...