`

Oracle数据库之PLSQL触发器

阅读更多
--=======触发器============
--是一段命名的PL/SQL代码块,只不过该代码块在特定的条件下被触发并且执行。
--对于这样的代码我们称之为触发器

--======触发器的分类=============
--通常根据触发条件以及触发级别的不同分为DML触发器,INSTEAD OF 触发器,系统事件触发器。
---DML触发器: ORACLE 对DML语句进行触发,
		--可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
		
---INSTEAD OF 触发器 :在ORACLE里,对于简单视图,可以直接使用DML进行操作,
		--而复杂视图则不能直接使用DML,因此INSTEAD OF 触发器应运而生。
		--INSTEAD OF 触发器主要是为解决复杂视图不能执行DML而创建。
		
---系统事件触发器  
		--在 ORACLE 数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等.
		--使用系统触发器,便于系统跟踪,监测数据库变化情况等。

--============触发器的用途=========
		--控制DDL语句的行为,如通过更改、创建或重命名对象 
		--控制DML语句的行为,如插入、更新和删除 
		--实施参照完整性、复杂业务规则和安全性策略 
		--在修改视图中的数据时控制和重定向DML语句 
		--通过创建透明日志来审核系统访问和行为的信息
		
--=======DML语句触发器==================
--组成部分		描述				可能值
--触发时间		触发事件的时间顺序		before,after
--触发事件		DML语句是触发事件		insert,update,delete
--触发器类型		触发器被执行的次数		statement,row
--触发器体		该触发器将要执行的动作	        完整的PLSQL块

--======DML触发器的类型===========
--语句级触发器
--行级触发器 (for each row) 
--区别:触发的次数不同,如果DML语句影响1行,那么两种效果一样
--		如果影响多行,行级触发次数比语句级触发次数多.

--=========DML触发器的触发顺序===============

--在单行数据上的触发顺序(触发代码仅被执行一次)
---BEFORE 语句级触发器
------BEFORE 行级触发器
------AFTER 行级触发器
-- AFTER 语句级触发器

--.在多行数据上的触发顺序(语句级触发器仅被执行一次,行级触发器在每个作业行上被执行一次)
--BEFORE 语句级触发器
------BEFORE 行级触发器
------AFTER 行级触发器
----------BEFORE 行级触发器
----------AFTER 行级触发器
--AFTER 语句级触发器

--==创建触发器的语法

        CREATE [OR REPLACE] TRIGGER trigger_name
        {BEFORE | AFTER | INSTEAD OF}     
--定义触发类型,即那一种或多种DML以及特定的列
        {INSERT | DELETE | UPDATE [OF column [, column …]]}  
--特定的触发对象,表或视图
        ON {[schema.] table_name | [schema.] view_name}                       

        [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
 --定义触发器为行级触发器
        [FOR EACH ROW ]                                                      

        [WHEN condition] --满足条件才会触发

        BEGIN

            trigger_body;

        END;
	
--=====在行级触发器中使用被插入、更新或删除的记录中的列值,(只能用在行级触发)
---可以使用NEW和OLD限定符来表示
--- :old 修饰符访问操作完成前列的值
--- :new 修饰符访问操作完成后列的值
---============================================
--触发事件	 :old.id						:new.id
--insert 		:old.id结果 为null			数据库会把  的值的值插入id列 
--update		在update之前的值				update之后的新值
--delete		delete之前的原始值			字段null

--需求:完成sequence的调用( 自动生成主键)
--准备表:
create table t1 (id number(4) ,c1 number(4));
create sequence s;--创建系列s
create or replace trigger  get_pk
--在insert , t1表之前触发
	before insert  on t1 	for each row  --每一行都被触发
declare
begin
-- :new是个记录类型的变量,结构类似于表结构,每条新插入的记录存储在其中。
--定义行级的before insert触发器,在插入记录之前,改变:new里的值,从而实现自动产生主键值。
	select s.nextval into :new.id from dual;
	dbms_output.put_line(':new.id'|| :new.id);-- 1,2,3,4,
	dbms_output.put_line(' :old.id'|| :old.id); -- 没有
end;

--执行 会触发 get_pk触发器.
insert into t1 values (100,100);
insert into t1 values (100,200);
insert into t1 values (100,300);

--再次查询:select * from t1 ;
-- id  c1
-- 1  100
-- 2  200
-- 3  300

--==== update :new , :old测试
create or replace trigger up_pk
	before update on t1 for each row
declare
begin
		dbms_output.put_line('update :new .c1'|| :new.c1);--400 
		dbms_output.put_line('update :old.c1'|| :old.c1); -- 300
end;
-- update:触发up_pk触发器
	update t1 set c1 = 400 where id = 3;
-- :new.c1 400 ,   :old.c1 300

--==== 测试delete
create or replace trigger de_pk
	before delete on t1 for each row
declare
begin
	dbms_output.put_line('delete :new .c1'|| :new.c1);--没有
	dbms_output.put_line('delete :old.c1'|| :old.c1);--400
end;
-- delete:触发de_pk触发器
	delete from  t1  where id = 3;
-- :new.c1 没有 ,   :old.c1 400


--=========跟记录更新t1表的时间. 
-- c2存放修改前的值, c3存储修改后的值
create table t_log (c1 varchar2(30),c2 number(4),c3 number(4) , c4 date);

--在t1表上创建触发器
-- for each row : update一行就触发1次.update 2行就触发2次
create or replace trigger update_log
	before update on t1 for each row
	-- before update on t1 这里有错, :old.c1, :new.c1不能用在表级触发器
declare
begin
	insert into t_log values (' Before update on t1 ',:old.c1, :new.c1 , sysdate);
end;


-- 测试 ,行级 ,表级触发的区别
create table t_log (c1 varchar2(30),c4 date);

--在t1表上创建触发器
-- update 1行触发1次,update 2行 也是触发1次
create or replace trigger update_log
	-- before update on t1 for each row
	before update on t1 
declare
begin
	insert into t_log values (' Before update on t1', sysdate);
end;

--== when限制条件的行级触发器
create or replace trigger update_log
	before update on t1 for each row
	when ( old.id = 1) -- 当满足这个条件的时候触发
declare
begin
	insert into t_log values (' Before update on t1', sysdate);
end;

-- == of的使用
create or replace trigger update_log
	before update on t1 of id  for each row --表示当id 被update时 才会被触发
	when ( old.id = 1) -- 当满足这个条件的时候触发
declare
begin
	insert into t_log values (' Before update on t1', sysdate);
end;


-- ==对于复杂的数据完整性,参照完整性,可以通过DML触发器来完成普通约束所不能完成的任务
-- 级联更新
CREATE OR REPLACE TRIGGER update_cascade
    AFTER DELETE OR UPDATE 
		OF deptno ON dept FOR EACH ROW
BEGIN
	-- updaing :修改了返回true ,否则 false 
	--	:old.deptno<>:new.deptno :修改前的值 不等于 修改后的值		
	IF (UPDATING AND :old.deptno<>:new.deptno) THEN
			UPDATE emp SET deptno=:new.deptno WHERE deptno=:old.deptno;

     END IF;
	
	-- deleting :删除true ,否false;
     IF DELETING THEN
        DELETE FROM emp WHERE deptno=:old.deptno;
     END IF;
END;

--查看触发器 名字,状态
select trigger_name,status from user_triggers where table_name='UPDATE_CASCADE';

--查看触发器源码
select line,text from user_source where name='TR_DEL_UPD_DEPTNO';

--禁用触发器
--当触发器被禁用后,则表上的DML操作将不会触发该触发器,
--直到该触发器被解除禁用(alter trigger trigger_name disable)
alter trigger tr_emp_sal disable;

--启用触发器
    -- 被禁用的触发器可以被解除禁用(alter trigger trigger_name enable)
 alter trigger tr_emp_sal enable;

-- 禁用、启用表上的所有触发器
 alter table emp disable all triggers;
 alter table emp enable all triggers;
 
--重新编译触发器
alter trigger tr_emp_sal compile;

-- 删除触发器
 drop trigger tr_emp_sal;

 

分享到:
评论

相关推荐

    完整版Oracle11数据库教程课件 全套PPT课件资源集合 全套12个章节.rar

    完整版Oracle11数据库教程课件 第9章_PLSQL编程基础(共59页).ppt 完整版Oracle11数据库教程课件 第10章_存储过程_函数_触发器(共32页).ppt 完整版Oracle11数据库教程课件 第11章_权限的概述(共32页).ppt 完整...

    oracle进阶之plsql编程

    oracle进阶之plsql编程内容提要:通过对PL/SQL基础语法和存储函数、存储过程、包、触发器等数据库对象的概念及基本语法的学习与练习,达到学以致用的目的,并能在应用程序中调用存储函数及过程。

    plsql 触发器

    触发器(Trigger)在数据库里以独立的对象存储。 存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。...ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。

    Oracle数据库SQL和PL SQL实例教程 高继民(ppt)

    oracle数据库ppt 第1章 关系数据库与SQL语言环境 第2章 数据查询 第3章 数据操作 第4章 表和视图 第5章 其他数据库对象 第6章 SQL基础 第7章 游标和异常处理 第8章 存储过程、函数和包 第9章 触发器 第10章 数据库...

    oracle数据库详解PPT

    oracle数据库安装.ppt oracle数据库创建.ppt oracle数据库对象.ppt oracle异常及触发器.ppt plsql过程及函数.ppt PLSQL介绍.ppt PLSQL控制结构.ppt PLSQL中使用SQL.ppt sql基本命令.ppt 锁和表分区.ppt ...

    oracle数据库对象备份与恢复脚本工具

    getalltrigs.sql:导出数据库所有触发器 getusertrigs.sql:导出数据库指定用户的触发器 getrig.sql:导出数据库指定用户的某个触发器 getallviews.sql:导出数据库所有视图 getuserviews.sql:导出数据库指定用户的...

    Oracle数据库应用与开发实例教程

    Oracle的工作环境、体验Oracle 10g环境中常用工具操作→数据库的创建与管理→数据表的创建与管理→管理视图→SQL编程语言→PL/SQL编程语言→管理PLSQL存储过程与触发器 →管理安全性→数据库安全性→Oracle数据库的...

    Oracle数据库应用开发——数据操作与PLSQL程序设计实验报告.docx

    1.实现数据的增、删、改及合并操作 2.实现简单查询及高级查询操作 3.实现存储过程的创建和调用方法 4.实现触发器的创建方法

    plsqldev6(oracle数据库图形化管理工具)

    可以在图形化界面下操纵oracle数据库,如连接,增删改查,触发器,存储过程等,解压后,运行安装文件,安装即可。

    高级数据库应用实验(Oracle)项目 电商平台商品管理系统 大学编程作业(TUST 天津科技大学 2023 年)

    本电商平台商品管理系统,我使用了使用了 Oracle 数据库和 PLSQL Developer。实现了项目分析与数据表创建、SQL 语句、视图和存储过程、触发器等部分。通过这次高级数据库应用实验(Oracle)项目的实践,我巩固了 SQL ...

    Oracle数据库语句

    Oracle数据库语句,语法,存储过程,函数,触发器。PLsql操作。

    Oracle数据库(表空间、用户、授权、存储过程、触发器)

    Oracle数据库(表空间、用户、授权、存储过程、触发器)

    完整版Oracle11数据库教程课件 第12章_备份与恢复(共66页).ppt

    完整版Oracle11数据库教程课件 第9章_PLSQL编程基础(共59页).ppt 完整版Oracle11数据库教程课件 第10章_存储过程_函数_触发器(共32页).ppt 完整版Oracle11数据库教程课件 第11章_权限的概述(共32页).ppt 完整...

    Oracle-PLSQL-编程语法详解-触发器.docx

    学习永无止境:触发器是许多关系数据库系统都提供的一项技术。在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块。

    oracle数据库技术文档

    1、ORACLE 体系结构 2、sql_plus函数 3、sqlplus常用命令 4、sql 5、锁和表分区 6、数据库对象 7、oop 8、PLSQL 9、游标 10、程和函数 11、触发器 12、导入导出备份 13、如何正确利用rownum来限制查询所返回的行数 ...

    Oracle数据库应用与开发实例教程[吴海波主编][电子教案]

    体验数据库的应用→认识Oracle的工作环境、体验Oracle 10g环境中常用工具操作→数据库的创建与管理→数据表的创建与管理→管理视图→SQL编程语言→PL/SQL编程语言→管理PLSQL存储过程与触发器→管理安全性→数据库...

    plsql_logger:用于Oracle数据库的PLSQL记录器

    plsql_logger英语: 基于 log4j 的 PL/SQL 记录器,但具有按上下文的级别日志,不像 log4j 那样全局。 所以你可以做一个上下文记录调试消息,另一个只记录错误消息。 一些想法来自 有关 proc 示例,请参见examples...

    oracle进阶之PLSQL编程.rar_oracle_oracle 编程_应用于java程序

    通过学习PL/SQL基础语法和函数、存储过程、包、触发器等数据库对象的概念、基本语法及应用,达到学以致用的目的,并能在应用程序中调用存储函数及过程

    oracle数据库主键自增并且返回主键值

    1.1、直接在PLSQL中设置 1.2、命令创建 create sequence seq_users ##创建序列seq_users increment by 1 ## 步长,每次加1 start with 1 ##从1开始 minvalue 1 ##最小值 maxvalue 9999999 ##最大值 order ##确保...

Global site tag (gtag.js) - Google Analytics