oracle触发器实现对view的DML操作
oracle数据库的DML语句

oracle数据库的DM L语句SQL:是结构查询语⾔SQL的语句是由D QL(数据查询语⾔:SE L E C T),D ML(数据管理语⾔:增、删、改),D D L(数据定义语⾔:例如 创建表),D C L(数据库控制语⾔)此⽚主要介绍如何写写D ML。
向表中插⼊的数据修改现存数据删除现存数据``` //使⽤INSERT语句向表中插⼊数据的语法 INSERT INTO table [ (column [, column ...])] VALUES (value [ ,value ...]) ;//若使⽤上述语法只能向表中插⼊⼀条数据###要想插⼊字符和⽇期数据应包含在单引号中。
(其中需要注意的有:在插⼊⽇期的格式,要符合⽇期识别的要求。
)###如何向表中插⼊null值INSERT INTO departments (department_id,department_name)VALUES (30,'Purchasing')//这种⽅式是隐式向数据库中插⼊NULL,这种⽅式由数据库帮⽤户将内容插⼊到数据库中,⽤户只将⼀部分列名写出之后,没有写的列名由数据库默认的添加为null输⼊到数据库中去了。
INSERT INTO departmentsVALUES ( 100 ,'Finance',null,null);//该⽅法是显⽰式实现向数据库中插⼊内容,因为当数据表后⾯没有任何列的时候,个⼈理解是按数据表创建的列进⾏数据的插⼊。
所以没有要插⼊的数据写上数据名,没有写的需要数据库管理员⼿动的填⼊NULL。
//上⾯的⽅式都是以单⾏的⽅式进⾏数据的插⼊,但是SQL语⾔中如何⼀次性的插⼊多条数据进⼊到⼀个表中。
⽅法如下(该⽅法涉及到⼦查询)://使⽤的前提是先复制⼀个表中的信息(在oracle中进⾏数据备份的⽅法)create table HR.DEPARTMENTS_COPY //其中HR.DEPARTMENTS_COPY备份的数据(备份过来的有数据和⾮空的约束条件。
oracle 触发器工作原理

oracle触发器工作原理Oracle数据库中的触发器是一种存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。
触发器可以用于实现数据一致性、审计、业务规则验证和复杂的数据处理逻辑。
以下是Oracle触发器工作原理的基本概述:1.定义与激活:在Oracle中,通过使用CREATE TRIGGER语句创建触发器,指定其名称、触发时机(BEFORE或AFTER)、触发事件(INSERT、UPDATE、DELETE或COMMIT等)以及作用的对象(表或视图)。
2.触发时机:BEFORE触发器会在实际操作之前执行,此时可以查看并修改将要插入、更新或删除的数据。
AFTER触发器则在实际操作完成之后执行,此时只能查看已经更改后的结果。
3.触发上下文:对于INSERT操作,触发器可以通过:NEW伪记录访问被插入的新行数据。
对于UPDATE操作,触发器同时可以获得:OLD和:NEW伪记录,分别代表更新前的老数据和更新后的新数据。
对于DELETE操作,触发器可以通过:OLD伪记录访问即将被删除的行数据。
4.执行逻辑:触发器内的PL/SQL代码会根据触发条件进行执行,可以包含任何合法的PL/SQL命令,包括对其他表的操作、控制流语句、异常处理等。
5.事务处理:触发器是事务的一部分,所以它们遵循ACID属性,并且其行为受当前事务的影响。
例如,如果事务回滚,则触发器所做的所有变更也会随之回滚。
6.实例应用:举例来说,一个AFTER INSERT触发器可能用来记录新插入数据到审计表中;而一个BEFORE UPDATE触发器可能用于检查更新的数据是否满足某些业务规则,如果不满足则阻止更新操作。
总之,Oracle触发器是数据库系统内嵌的一种自动化机制,它在特定数据库事件发生时自动执行预定义的逻辑,为确保数据完整性和业务规则得以强制执行提供了强大的支持。
五、DML操作汇总

五、DML操作汇总前⾔: DML(Data Manipulation Language)数据操作语⾔,以INSERT、UPDATE、DELETE三种指令为核⼼,分别代表插⼊、更新与删除,是必须要掌握的指令,DML和SQL中的select熟称CRUD(增删改查)。
⼀、插⼊操作 插⼊单⾏2种⽅式 1、insert into 表名[(字段,字段)] values (值,值); 说明: 值和字段需要⼀⼀对应 如果是字符型或⽇期类型,值需要⽤单引号引起来;如果是数值类型,不需要⽤单引号 字段和值的个数必须⼀致,位置对应 字段如果不能为空,则必须插⼊值 可以为空的字段可以不⽤插⼊值,但需要注意:字段和值都不写;或字段写上,值⽤n u l l代替 表名后⾯的字段可以省略不写,此时表⽰所有字段,顺序和表中字段顺序⼀致。
2、i n s er t i n to表名s et 字段=值,字段=值; 批量插⼊2种⽅式 1、i n s er t i n to表名[(字段,字段)]v al u es(值,值),(值,值),(值,值); 2、i n s er t i n to表[(字段,字段)]数据来源s el ect语句;、 说明: 数据来源s el ect语句可以有很多种写法,需要注意:s el ect返回的结果和插⼊数据的字段数量、顺序、类型需要⼀致。
关于s el ect的写法后⾯⽂章会详细介绍。
⼆、数据更新 单表更新 语法:u pdate 表名[[as]别名]s et [别名.]字段=值,[别名.]字段=值[wh er e条件]; 有些表名可能名称⽐较长,为了⽅便操作,可以给这个表名起个简单的别名,更⽅便操作⼀些。
如果⽆别名的时候,表名就是别名。
多表更新 可以同时更新多个表中的数据 语法: update 表1 [[as] 别名1],表名2 [[as] 别名2] set [别名.]字段 = 值,[别名.]字段 = 值 [where条件] 使⽤建议 建议采⽤单表⽅式更新,⽅便维护。
2 数据操作语言 DML 实验

二、实验内容与步骤: 1、进入 ORACLE 的环境,进入 scott 用户模式(在 sqldeveloper 中使用 scott 用户连 接 Oracle)。 2、用 Create、Insert 语句建立基本表 S、P、J 和 SPJ ,其中:
(6) 请将 S6 向工程项目 J8 供应 500 个 P7 零件的信息加入到供应关系; 意涉及到几个表的添加元组操作?表的添加顺序如何?)
insert into S(SNO) values('S6'); insert into J(JNO) values('J8'); insert into P(PNO) values('P7'); insert into SPJ values('S6','P7','J8','500');
(6) 找出所有供应商的姓名和所在城市; 代码: select SNAME,CITY from S;
(7) 找出所有零件的名称、颜色、重量; 代码: select PNAME,COLOR,WEIGHT from P;
(8) 找出使用供应商 S1 所供应零件的工程号; 代码: select distinct JNO from SPJ where SNO='S1';
代码: create table S( SNO char(3) primary key, SNAME char(10), STATUS char(10), CITY char(10) ); insert into S values ('S1','精益','20','天津'); insert into S values ('S2','盛锡','10','北京'); insert into S values ('S3','东方红','30','北京'); insert into S values ('S4','丰泰盛','20','天津'); insert into S values ('S5','为民','30','上海');
Oracle触发器操作

AS
SELECT * FROM Users
WHERE u_Name='amy';
教
(2)创建行级触发器
师
CREATE OR REPLACE TRIGGER tr_DeleteUser2 AFTER DELETE
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
课堂案例2—使用PL/SQL管理触发器
案例完成步骤-创建触发器
添加标 【例2-4】通过临时表将Users表中删除的记录进行临时保存(行级触发器)。
(1)创建行级触发器的测试表 CREATE TABLE userdel
题文字
建议课时:8课时
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
9.1 触发器概述
触发器简介 触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的 数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中 数据的操作时,将自动触发触发器中定义的操作,以实现数据的一致性 和完整性。 触发器拥有比数据库本身标准的功能更精细和更复杂的数据控制能力。 触发器具有以下的作用: (1)在安全性方面,触发器可以基于数据库的值使用户具有操作数据 库的某种权利。 (2)在审计方面,触发器可以跟踪用户对数据库的操作。 (3)实现复杂的数据完整性规则。 (4)实现复杂的非标准的数据库相关完整性规则。触发器可以对数据 库中相关的表进行连环更新。 (5)同步实时地复制表中的数据。 (6)自动计算数据值,如果数据的值达到了一定的要求,则进行特定 的处理。例如,如果商品的数量低于5,则立即给管理人员发送库存报 警信息。
教
WHO VARCHAR2(30),
师
oracle dcl语句

oracle dcl语句Oracle DCL语句全称为Oracle Data Control Language,是指用于控制数据访问权限的SQL语句。
Oracle数据库中,不同用户拥有不同的权限,使用Oracle DCL语句可以控制用户所能访问的表、列,并对用户进行授权、撤销授权。
在本文中,我们将介绍Oracle DCL语句的相关内容。
一、Oracle DCL语句的种类1、授权语句GRANT:用于授权给某一个用户或角色操作数据的权限。
2、回收授权语句REVOKE:用于撤销已经授权给某一个用户或角色操作数据的权限。
二、Oracle DCL语句的使用方法1、GRANT语句GRANT语句的基本语法为:```GRANT 权限名称 ON 对象名称 TO 用户名 [WITH GRANT OPTION];```其中,权限名称指的是用户拥有的某一种数据库操作权限,可以是SELECT、INSERT、UPDATE等。
对象名称指的是用户将要操作的目标对象,可以是表、视图、序列等。
用户名为要授权操作权限的用户名,可以是已经存在的用户或者角色。
WITH GRANT OPTION是可选项,表示授权用户是否有权将自己的权限再授权给其他用户或者角色。
如下面的例子,为表student授权给haojie用户查询的权限:```GRANT SELECT ON student TO haojie;```如果要将上述所授权的SELECT权限再授权给其他用户,可以加上WITH GRANT OPTION选项:```GRANT SELECT ON student TO haojie WITH GRANT OPTION;```2、REVOKE语句REVOKE语句的基本语法为:```REVOKE 权限名称 ON 对象名称 FROM 用户名;```其中,权限名称和对象名称的意义与GRANT语句相同。
用户名指的是要回收授权操作权限的用户名。
例如,要将haojie用户对student表的SELECT操作权限回收:```REVOKE SELECT ON student FROM haojie;```在上述操作中,如果之前已经授权给其他用户或角色,则会显示“授权对象依然存在”的信息。
ORACLE触发器的技术

ORACLE触发器的技术研究朱 伟(淮北矿业集团 通讯计算机处 安徽 淮北 235000)摘 要: 介绍DML触发器、替代触发器和系统触发器,它们是存储在数据库里的特殊存储过程。
当表、视图发生改变或发生特定用户事件、系统事件时将隐式激发定义在其上的触发器,数据库将自动执行触发器。
触发器能被作为数据库内置审计功能的有益补充用于审计。
关键词: DML触发器;替代触发器;系统触发器中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2012)1120145-010 引言目前企业的计算机应用系统多数都是基于数据库的,在使用这些应用系统的时候,不可避免的要遇到一些数据库中有关数据完整性、批量删除和审计方面的问题。
在这方面触发器能很好的实现复杂的数据完整性检查和约束,拒绝或回退那些破坏相关完整性的变化;审计用户操作数据库的语句。
本文就是对Oracle触发器技术进行的介绍。
1 Oracle触发器的概念和类型数据库触发器是响应插入、更新或删除等数据库事件而执行的过程,它定义了当一些数据库相关事件发生时应采取的动作。
有三种主要的触发器类型:DML触发器、替代触发器和系统触发器。
1.1 DML触发器。
DML触发器就是对表或视图执行DML操作时激发的触发器,并且由该语句的类型决定DML触发器的类型。
它是一个与特定表相关联的存储过程,也就是说一个DML触发器仅与一个表相关联,但一个表可以对应多个DML触发器。
DML触发器分为行触发器和语句触发器,触发事件包括insert、update和delete,触发的时间可以在DML语句之前或之后。
1.2 替代触发器。
替代触发器只能定义在视图上而不能定义在表上,它由视图的DML事件激发而非DDL或数据库系统事件激发,它执行一个替代操作来代替触发语句的操作。
与DML触发器不同,DML触发器是在DML操作之外运行的,而替代触发器则代替激发它的DML语句运行。
替代触发器是行一级的。
oracle 触发器的实例

oracle 触发器的实例触发器使用教程和命名规范目录触发器使用教程和命名规范 11,触发器简介 12,触发器示例 23,触发器语法和功能 34,例一:行级触发器之一 45,例二:行级触发器之二 46,例三:INSTEAD OF触发器 67,例四:语句级触发器之一 88,例五:语句级触发器之二 99,例六:用包封装触发器代码 1010,触发器命名规范 111,触发器简介触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。
在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。
而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。
到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。
要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。
很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。
这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。
从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。
由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。
一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。
触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。
触发器的原理和应用

teacher_id TEACHERS.TID%TYPE;
INSERT_EXIST_TEACHER EXCEPTION;
BEGIN
SELECT TID INTO teacher_id
FROM TEACHERS
WHERE TNAME=new.TNAME;
RAISE INSERT_EXIST_TEACHER;
EXCEPTION --异常处理也可以用在这里
WHEN INSRT_EXIST_TEACHER THEN
INSRT INTO ERROR(TID,ERR)
VALUES(teacher_id,'the teacher already exists!');
创建触发器
创建触发器的语句是CREATE TRGGER,其语法格式如下:
CREATE OR REPLACE TRIGGER<触发器名>
触发条件
触发体
例子:创建触发器 my_trigger
CREATE TRIGGER my_trigger --定义一个触发器my_trigger
1、触发器类型
触发器的类型包括如下三种:
(1)、DML触发器:对表或视图执行DML操作时触发。
(2)、INSTEAD OF触发器:只定义在视图上,用来替换实际的操作语句。
(3)、系统触发器:对数据库系统进行操作(如DDL语句、启动或关闭数据库等系统事件)时触发。
ELSE
info:='Delete';
END IF;
INSERT INTO SQL_INFO VALUES(info); --记录这次操作信息
E发器
Oracle INSTEAD OF 触发器

Oracle INSTEAD OF 触发器INSTEAD OF 触发器也称替代触发器,定义INSTEAD OF触发器后,用户对表的DML 操作将不再被执行,而是执行触发器主体中的操作。
通常情况下,INSTEAD OF触发器是定义在视图上的,而不是在表上定义的触发器,它是用来替换所使用实际语句的触发器。
因为一个视图通常是由多个基表连接而成,这种视图是不允许进行INSERT、UPDATE 和DELETE这样的DML操作。
当为视图编写INSTEAD OF触发器后,用户对视图的DML 操作就不会执行,而是执行触发器中的PL/SQL语句块,这样就可以通过在INSTEAD OF 触发器中编写适当的代码,完成对构成视图的各个表进行操作。
替代触发器与其他触发器类以,只是在触发器定义的头部使用INSTEAD OF子句。
下面通过一个示例来演示INSTEAD OF触发器的应用。
(1)创建一个视图,显示雇员的基本信息和所在部门名称。
SQL> connect system/admin已连接。
SQL> grant create view to scott;授权成功。
SQL> connect scott/tiger已连接。
SQL> create view emp_dep_view2 as select empno,ename,job,sal,dname3 from emp,dept4 where emp.deptno=dept.deptno;视图已创建。
(2)如果试图向表中添加记录,则由于视图引用了两个基表,所以添加记录将失败。
SQL> insert into emp_dep_view(empno,ename,job,sal,dname)2 values(8000,'董鹏','MANAGER',1500,'SALES');insert into emp_dep_view(empno,ename,job,sal,dname)*第 1 行出现错误:ORA-01776: 无法通过联接视图修改多个基表(3)现在为视图EMP_DEP_VIEW创建一个INSTEAD OF触发器,以便使用自定义的操作覆盖系统预定义的操作。
oracle 触发器的种类和触发事件,dml触发器,ddl事件触发器,替代触发器,查看触发

oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发...oracle 数据库开发应用实例,招生录取系统 ... | oracle 创建,删除存储过程,参数传递,创 ...2009-04-14oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,关键字: oracle 触发器种类触发事件dml ddl 事件替代查看触发器的种类和触发事件触发器必须由事件才能触发。
触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。
每类事件包含若干个事件,如下所示。
数据库的事件是具体的,在创建触发器时要指明触发的事件。
种类关键字含义Sql代码DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发触发器的类型可划分为4种:数据操纵语言(DML)触发器、替代(INSTEAD OF)触发器、数据定义语言(DDL)触发器和数据库事件触发器。
oracle触发器-解决mutating table的问题

Oracle触发器mutating table问题解决方案一、问题描述Oracle触发器是特定事件出现的时候,自动执行的代码块。
但在使用过程中,往往遇到如下需求:1、在触发器执行时,使用DML语言操作触发器的基础表,完成更新、插入或删除操作;2、触发器对于父子表,即有外键关联的表的相关操作;或者说trigger访问了自身上的表。
在以上两种情况下,依据Oracle的事务处理规则,通常产生如下错误:ORA-04091。
该错误解释为:当前的trigger下的事物,access(执行)了一个mutating table(冲突的表)。
一个简单的例子拿oracle的示例表emp和dept来做这个试验。
dept的表结构如下:emp表结构如下:emp和dept是一对父子表,关联column为DEPTNO。
接下来创建1个table:emp_log 和1个语句级trigger: emp_del_trg。
取一个最简单的业务功能,emp_del_trg的作用就是当表emp记录被删除的时候,触发器将删除的记录的EMPNO,DNAME和删除时间写入到emp_log中,当子表依赖的父表相关记录删除的时候,emp_log不做处理。
表emp_log的结构如下:触发器trigger代码如下:来看看这个触发器是否能正常工作,首先删除emp的记录。
看似trigger工作正常,删除dept的记录呢?问题分析:ORA-04091错误如约而至。
不难解释,因为父子表指定了级联删除,删除dept的记录从而引起删除emp表上的相应数据,然后触发了emp_del_trg,由于trigger里有对dept的访问,对当前事务说,dept就是一个mutating table,这是不被允许的。
如何来解决这个问题而实现这个简单的业务逻辑功能呢?当然,从表结构逻辑设计上来讲,可以将dept表上的dname字段add到emp表,或者不要显式的指定references,用程序来维护数据的完整性和约束,然后调整业务代码.最直接的方法,在trigger中声明一个ora-04091的exception,对此异常不做处理,也可完成目的。
oracle 触发器(trigger)

触发器的使用1触发器资料来源:《/view/71791.htm?fr=ala0_1_1》触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
触发器可以从DBA_TRIGG ERS ,USER_TRIGGERS 数据字典中查到。
1.1 数据库领域名词触发器可以查询其他表,而且可以包含复杂的SQL语句。
它们主要用于强制服从复杂的业务规则或要求。
例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。
如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
1.2 创建触发器的SQL语法DELIMITER |CREATE TRIGGER `<databaseName>`.`<triggerName>`< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >ON <tableName>FOR EACH ROWBEGIN--do somethingEND |1.3 触发器的优点触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。
与CHECK 约束不同,触发器可以引用其它表中的列。
例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
Oracle 触发器的概述

Oracle 触发器的概述触发器是与一个表或数据库事件联系在一起的,当特定事件出现时将自动执行触发器的代码块。
触发器与过程的区别在于:过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
触发器能够执行的功能包括:●自动生成数据。
●强制复杂的完整性约束条件。
●自定义复杂的安全权限。
●提供审计和日志记录。
●启用复杂的业务逻辑。
与过程和函数不相同,在创建触发器时还需要指定触发器的执行时间和触发事件。
创建触发器的语法规则如下:create [ or replace ] trigger trigger_name[before | after | instead of]trigger_eventon table_name[for each row[when tigger_condition]]begintrigger_bodyend trigger_name;创建触发器的主要参数包括:●BEFORE | AFTER | INSTEAD OF用于指定触发器的触发时间。
BEFORE指定在触发事件之前执行;AFTER指定在触发事件执行之后执行;INSTEAD OF指定触发器为替代触发器。
●TRIGGER_EVENT参数指定引起触发器运行的触发事件。
●TABLE_NAME指定与触发器相关的表名称。
●FOR EACH ROW指定触发器为行级触发器,表示该触发器对影响到的每一行数据都触发执行一次。
如果未指定该条件,则表示创建语句级触发器,这时无论影响到多少行,触发器都只会执行一次。
●TRIGGER_CONDITION参数指定触发器应该满足的条件。
Oracle对触发器的功能进行了扩展,不仅对表或视图的DML操作会引起触发器的运行,而且对Oracle系统的操作也会引发触发器的运行。
根据触发器的触发事件和触发器的执行情况,可以将Oracle所支持的触发器分为如下几种类型:●行级触发器行级触发器对DML语句影响的每个行执行一次。
Oracle考试简答题大全

1.说出数据库系统有哪几部分组成?数据,软件,硬件,人员2.试述SQL语言的功能。
SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询更新和管理关系数据库系统。
3.SQL提供的基本数据类型有哪些?每种举两个例子。
1.数值型(int bit)2.字符串型(char vachar)3.日期时间类型(datetime small datetime)4.货币类型(money small money)5.简述Where子句与Having子句的区别。
Having是筛选组,而where是筛选记录,分组筛选的时候应having;其它情况用where,6.简述视图的定义以及与基本表的区别。
1、视图是一个或几个基本表(或试图)导出的表。
2、他与基本表不同,是一个虚表。
3、数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
4、基本表的数据发生变化,视图中查询出来的数据也随之变化。
可以和基本表一样能被查询,被删除,但对试图的增、删、改操作则有一定限制。
2.试述视图的作用?(1)视图能够简化用户的操作。
(1 分)(2)视图使用户能以多种角度看待同一数据。
(1 分)(3)视图对重构数据库提供了一定程度的逻辑独立性。
(1 分)(4)视图能够对机密数据提供安全保护。
(1 分)(5)适当的利用视图可以更清晰的表达查询P228 使用存储过程的优点(4点)在Oracle中,可以在数据库中定义子程序,这种程序块称为存储过程(procedure)。
它存放在数据字典中,可以在不同用户和应用程序之间共享,并可实现程序的优化和重用。
(1)存储过程在服务器端运行,执行速度快。
(2)存储过程执行一次后驻留在Oracle数据库服务器的高速Cache中,以后再次执行存储过程时,只需从高速Cache中调用已经编译好的代码即可,从而提高了系统性能。
(3)存储过程确保了数据库的安全。
使用存储过程,可以在禁止用户直接访问应用程序中的某些数据表的情况下,授权执行访问这些数据表的存储过程。
DML(数据操纵语言)

DML(数据操纵语⾔)1.概念(C)数据操纵语⾔ DML (Data Manipulation Langua)是SQL语⾔的⼀个分类,⽤于对表的内容或者说数据进⾏增、删、改、查等操作。
通过以下⼏个关键字实现:SELECT(查询) 、INSERT(插⼊)、 UPDATE(更新修改)、 DELETE(删除)2.insert(插⼊):(A)2.1 作⽤:往表中插⼊数据。
2.2 ⽅式:1.元祖值式插⼊(⼀次插⼊⼀⾏)语法:insert into 表(列1,列2...列n) values(值1,值2...值n);例:--⼀次插⼊⼀条记录insert into emp (empno,ename,sal,deptno) values(9527,'华安',500,40);--需要往表中所有列都插⼊数据时,表后⾯的列可以不写insert into emp values(9528,'秋⾹',null,9527,sysdate,100,null,40);2.查询结果式(将⼦查询的结果插⼊到表中)语法:insert into 表名(⼦查询)例:--⾸先创建⼀个emp的临时复制表⽤于实验操作create table emp_temp as select*from emp where1=2;--将⼦查询的结果插⼊到表中insert into emp_temp (select*from emp);3.delete(删除):(A)3.1 作⽤:删除表中的数据。
3.2 语法:delete from 表名 where 过滤条件(删除满⾜条件的)例:--from 可以省略不写delete emp_temp where empno=9528;--没有 where 过滤条件就会删除所有数据delete emp_temp;4.update(更新):(A)4.1 作⽤:修改表中的数据。
4.2 语法:update 表名 set 列1=值1,列2=值2,...,列N=值N where 过滤条件(判断修改哪⼀条记录)例:--给编号为9527的涨⼯资20%,这⾥没有过滤条件的话就变成给所有⼈涨20%updata emp_temp set sal=sal*1.2where empno=9527;5.事务(B)5.1 概念:事务(Transaction)是⼀个操作序列。
oracle触发器触发条件

oracle触发器触发条件
Oracle触发器触发条件
1、触发器的触发条件
在创建一个触发器时,可以通过两种方式来指定触发条件:BEFORE和AFTER。
(1)BEFORE
BEFORE触发器在触发前执行,它的行为与常规的SQL查询没有
任何不同,因此它具有在更新操作发生之前检查行是否满足特定条件、更新以符合要求的表或其他特定操作的能力,然后再运行更新操作。
(2)AFTER
AFTER触发器在触发后执行,它可以让用户在更新(增、删、改)操作发生之后可以运行操作,从而可以根据用户对表的更新操作的结果来完成操作,其中更新或删除的行已经提交而不会回滚,而且不能更新触发器的父表。
2、触发器的触发时机
在创建一个触发器时,可以指定触发器的触发时机,它可以是一个表属性和操作:
(1)BEFORE
BEFORE触发器指SQL语句或DML操作发生之前被触发,可以指
定成INSERT,UPDATE,DELETE,以及在多表中涉及的多个操作中的
任何一个。
(2)AFTER
AFTER触发器指SQL语句或DML操作发生之后被触发,可以指定成INSERT,UPDATE,DELETE,以及在多表中涉及的多个操作中的任何一个。
Oracle触发器详解

Oracle触发器详解一、触发器概述触发器是特定事件出现的时候,自动执行的代码块。
类似于存储过程,但是用户不能直接调用他们。
功能:1、 允许/限制对表的修改2、 自动生成派生列,比如自增字段3、 强制数据一致性4、 提供审计和日志记录5、 防止无效的事务处理6、 启用复杂的业务逻辑触发器触发时间有两种:after和before。
1、触发器的语法:CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件ON表名[FOR EACH ROW]BEGINpl/sql语句END其中:触发器名:触发器对象的名称。
由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:before---表示在数据库动作之前触发器执行;after---表示在数据库动作之后出发器执行。
触发事件:指明哪些数据库动作会触发此触发器:insert:数据库插入会触发此触发器;update:数据库修改会触发此触发器;delete:数据库删除会触发此触发器。
表名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。
如果没有这一选项,则只对整个表执行一次。
触发器的组成部分:1、 触发器名称2、 触发语句3、 触发器限制4、 触发操作触发器类型:1、 语句触发器2、 行触发器3、 INSTEAD OF 触发器4、 系统条件触发器5、 用户事件触发器注释:before和after:指在事件发生之前或之后激活触发器。
instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
insert、 delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。
此类触发器用的不多,经常用于视图,不做重点。
table_or_view_name:指要创建触发器的表或视图的名称。
for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。
DDL和DML触发器基本操作

DDL和DML触发器基本操作-------------------------------------------------------------DDL数据⾃定义语⾔触发器------针对数据库创建触发器create trigger safetyon databasefor drop_table, alter_table ----create_table创建表asprint 'you must disable trigger "safety" to drop or alter tables!'rollback ;------删除触发器if exists (select * from sys.triggers where name = N'safety' and parent_class=0)drop trigger [safety] on database;go------禁⽤触发器disable trigger safety on database ;go-----启⽤触发器enable trigger safety on database;------查看当前系统数据库触发器select type, name, parent_class_desc from sys.triggersunion------查看服务器触发器select type, name, parent_class_desc from sys.server_triggers ;--------创建服务器触发器create trigger ddl_trig_loginon all serverfor ddl_login_eventsasprint 'login event issued.'select eventdata().value('(/event_instance/tsqlcommand/commandtext)[1]','nvarchar(max)') go----删除服务器触发器drop trigger ddl_trig_login on all servergo;create trigger safety1on databasefor create_tableasprint 'create table issued.'select eventdata().value('(/event_instance/tsqlcommand/commandtext)[1]','nvarchar(max)') raiserror ('new tables cannot be created in this database.', 16, 1)rollback;-------------------------------------------------------------DML数据操作语⾔触发器USE AdventureWorksIF OBJECT_ID ('reminder1', 'TR') IS NOT NULLDROP TRIGGER reminder1GOCREATE TRIGGER reminder1ON CustomerAFTER INSERT, UPDATEAS RAISERROR ('Notify Customer Relations', 16, 10)GO--禁⽤触发器DISABLE TRIGGER reminder1 ON Customer;GO---启⽤触发器enable trigger reminder1 on customer-----触发器重命名EXEC sp_rename 'reminder1', 'reminder';。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle触发器实现对view的DML操作一、触发器可以看做是一种特殊的存储过程。
触发事件:DML(insert update delete)DDL(create alterdrop)数据库系统事件(数据库启动、退出、产生错误或者异常等)用户事件(用户的登入登出)二、触发器的创建Create [orreplace] trigger tri_name --触发器名[before | after | istead of] tri_event --触发事件(insert、update、delete、create、alter、drop)On table_name | view_name | user_name |db_name–触发对象[for each row]Begin[when trigger_condition] --触发条件(inserting updatingdeleteing)Procedure(触发的操作)End;三、触发器的分类:语句触发器(只触发一次)行级触发器(for each row)四、Demo1.语句触发器create orreplace trigger tri_empbefore insertor update or deleteon empbeginif inserting thendbms_output.put_line('插入数据');elsif updating thendbms_output.put_line('更新数据');elsif deleting thendbms_output.put_line('删除数据');end if;end tri_emp;insert intoemp(empno,ename,job,sal,comm,deptno) values('8888','小午','CEO',8888,6666,10);update empsetsal=10000 where empno=8888;delete empwhereempno=8888;2.行级触发器Create table student( --创建测试tableId intprimarykey,Namevarchar2(30))--创建序列create sequence seq_idstart with 1minvalue 1nomaxvalueincrement by 1nocachenocycle;create or replace trigger tri_student befor inserton studentfor each rowbeginselect seq_id.nextvalinto :new.id from dual; --从序列中获取id的值插入到studentend;insert into student values(5,'小午'); --插入数据后查看结果注:会覆盖原来的值在使用before 触发器注入新的值时使用:new3.替换触发器好处:实现对VIEW视图的DMLcreateviewview_emp_dept --创建视图asselecta.empno,a.ename,b.deptno,b.dname,a.job,a.hiredate fromempa,dept bwherea.DEPTNO=b.DEPTNO;createor replace trigger tri_insert_view --创建触发器instead of insert --代替触发器on view_emp_deptfor each rowdeclarevar_numnumber(10);beginselect count(*) intorow_dept from dept wheredeptno=:new.deptno;if var_num=0 then --判断部门号是否存在,不存在择插入insertintodept(deptno,dname)values(:new.deptno,:new.dname);end if;insert intoemp(empno,ename,deptno,job,hiredate) --emp 表插入数据values(:new.empno,:new.ename,:new.deptno,:new.job,:new.h iredate);end tri_insert_view;或者在触发器中使用显式游标create or replace trigger tri_insert_viewinstead of inserton view_emp_deptfor each rowdeclarecursor cur_dept isselect * from deptwheredeptno=:new.deptno;beginopen cur_dept;if cur_dept%notfoundthen --判断部门号是否存在,不存在择插入insertintodept(deptno,dname)values(:new.deptno,:new.dname);end if;insert intoemp(empno,ename,deptno,job,hiredate) --emp 表插入数据values(:new.empno,:new.ename,:new.deptno,:new.job,:new.h iredate);end tri_insert_view;--直接在视图上进行数据的插入insertintoview_emp_dept(empno,ename,deptno,dname,job,hiredate) values(8888,'小午',16,'CEO','管理',to_date('19900725','yyyymmdd'));注:隐式游标会报错(像下边这样)create or replace trigger tri_insert_view --创建触发器instead of insert --代替触发器on view_emp_deptfor each rowdeclarevar_deptnonumber(10);beginselect deptno into var_deptnofromdept wheredeptno=:new.deptno;if sql%notfound then --判断部门号是否存在,不存在择插入insertintodept(deptno,dname)values(:new.deptno,:new.dname);end if;insert intoemp(empno,ename,deptno,job,hiredate) --emp 表插入数据values(:new.empno,:new.ename,:new.deptno,:new.job,:new.h iredate);endtri_insert_view;注:不知道隐式游标在这块怎么用,我想如果能用的话可能会在代码上简单点。
替代触发器的好处:1.可以直接对视图进行DML操作(实际是替代触发器的作用)2.在复杂的业务中可以使用,程序中的多表关联处理业务的代码3.在提高数据一致性的效率上很好4.用户事件触发器常见的用户触发事件:create alter drop comment grant remove rename truncate ……等等--创建一张日志表,监视每个用户对数据的操作Create tableddl_oper_log(Db_obj_name varchar2(20),--数据对象名称Db_obj_type varchar2(20),--数据对象类型Db_action varchar2(20),--操作行为Db_user varchar2(30),--数据库用户Db_user_name varchar2(30),--操作则的用户名Db_user_ip varchar2(30),--操作者的ipOper_date date--操作时间);--创建用户触发器(这是在测试机上,我也不知道再生产上能不能这样搞)create or replace trigger tri_ddl_oper_logafter create or alter or drop or renameor grant or revoke ortruncate or logonon scott.schemabegininsert intoscott.ddl_oper_logselectora_dict_obj_name,ora_dict_obj_type,ora_sysevent,ora_login_user,OSUSER,nvl(SYS_CONTEXT('USERENV','IP_ADDRESS'),'127.0.0.1'), sysdatefrom V$SESSIONWHEREAUDSID=SYS_CONTEXT('USERENV','SESSIONID') ;end;呵呵……ok 基本结束,一天就搞了这点玩意儿。
哦哦要注意的是需要对V$session表进行授权,不然会报表不存在。
grant select onv_$session to scott;对于上边的操作我们还可以做最简单的实现视图CREATEOR REPLACE VIEW view_ddl_oper_log AS SELECT ora_dict_obj_name AS Db_obj_name ,ora_dict_obj_type AS Db_obj_type ,ora_sysevent AS Db_action ,ora_login_user AS Db_user ,OSUSER AS customer ,nvl(SYS_CONTEXT('USERENV' ,'IP_ADDRESS') ,'127.0.0.1') AS customerip ,sysdate AS Oper_dateFROMV$SESSIONWHEREAUDSID = SYS_CONTEXT('USERENV' ,'SESSIONID');不知道在实际开发的环境中应该是怎么设计更好,我觉得触发器可能会影响一定的效率吧,在这为了熟悉触发器就这样了。