`

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;

 

分享到:
评论

相关推荐

    Oracle数据库plsql客户端

    Oracle数据库PL/SQL Developer客户端是数据库管理员和开发人员常用的工具,它专为Oracle数据库系统设计,提供了便捷的界面来编写、测试和调试PL/SQL代码。这个工具的强大之处在于其全面的功能集,允许用户进行数据库...

    oracle数据库和plsql语法练习

    "Oracle数据库练习PPT"可能包含一系列关于Oracle数据库管理、表的创建、索引、视图、触发器、存储过程、游标以及数据库安全等内容的教程。通过这些PPT,初学者可以了解到如何设计和操作Oracle数据库,包括数据类型、...

    使用plsqldev对oracle数据库做备份还原操作

    在Oracle数据库管理中,PL/SQL Developer是一款非常实用的工具,它专为Oracle数据库的存储程序单元开发设计,包括过程、函数、包、触发器等的编写和调试。这款工具以其用户友好、代码质量优化以及高生产力而受到青睐...

    PLSQL触发器.pdf

    PLSQL 触发器是一种特殊的存储过程,与普通存储过程不同的是,触发器是当某些事件发生时,由 Oracle 自动执行,可以说是隐藏执行的存储过程。 一、 触发器概述 触发器是 Oracle 中的一种特殊对象,它可以在特定的...

    使用PLSQL 创建Oracle数据库用户并设置权限

    "使用PLSQL创建Oracle数据库用户并设置权限" 在 Oracle 数据库中,创建用户并设置权限是数据库管理员的基本任务之一。在本文中,我们将使用 PLSQL 创建 Oracle 数据库用户并设置权限,包括创建用户、设置权限和创建...

    plsql 连接oracle数据库工具

    在开发和管理Oracle数据库时,PL/SQL作为其内建的编程环境,可以编写存储过程、函数、触发器等,实现数据处理和业务规则的封装。 PL/SQL通过SQL*Plus命令行工具或图形化界面工具与Oracle数据库交互。其中,"plsql...

    oracle数据库连接软件—plsql devlope9

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,它提供了高效的数据存储、管理和处理功能。PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库专用的一种编程语言,用于编写...

    PLSQL_oracle数据库

    Oracle数据库是世界上最广泛使用的商业关系型数据库系统之一,以其稳定性、安全性和可扩展性而著称。 在"PLSQLDeveloper_win32位"中,我们关注的是一个专门用于开发PLSQL代码的集成开发环境(IDE),即PL/SQL ...

    oracle数据库连接工具plsql

    "PLSQL Developer"是一款专为Oracle数据库设计的强大开发工具,标题中的"plsql数据库连接工具"指的就是这款软件。它提供了全面的功能,包括但不限于: 1. **数据库连接**:用户可以通过输入数据库实例名、用户名、...

    oracle数据库连接工具PLSQL

    PLSQL Developer是一款强大的Oracle数据库管理工具,主要用于开发、测试和管理Oracle数据库。它以其便捷的界面和丰富的功能深受数据库管理员和开发人员喜爱。标题提到的“免序列号免安装”特性,意味着这是一个便携...

    plsql连接oracle数据库插件

    "plsql连接oracle数据库插件"指的是能够帮助用户更方便地通过PL/SQL工具与Oracle数据库交互的软件组件。 首先,让我们详细了解一下PL/SQL。PL/SQL结合了SQL的查询和数据操作能力,以及结构化编程语言的控制结构,如...

    PLSQL【Oracle数据库视图软件】

    3. **数据库对象管理**:用户可以通过PL/SQL Developer轻松管理Oracle数据库中的各种对象,如表、视图、存储过程、函数、触发器等,可以创建、修改和删除这些对象。 4. **数据浏览和编辑**:可以直接在软件中浏览...

    数据库oracle中PLSQL语句简介及使用方法的举例说明

    PL/SQL是Oracle数据库的核心组成部分,用于创建复杂的业务逻辑、存储过程、触发器、函数以及数据库应用程序。 一、PL/SQL的基本结构 PL/SQL由三部分组成:声明部分、执行部分和异常处理部分。声明部分用于声明变量...

    连接数据库工具PLSQL

    PLSQL Developer是一款强大的Oracle数据库管理工具,主要用于编写、调试、执行和管理PL/SQL代码。它为数据库管理员和开发人员提供了高效的工作环境,简化了与Oracle数据库的交互过程。以下是一些关于PLSQL Developer...

    ORACLE数据库操作工具PLSQL

    PLSQL Developer是一款强大的Oracle数据库管理与开发...总的来说,PLSQL Developer是ORACLE数据库管理员和开发者的得力助手,它简化了复杂的数据库管理工作,提高了开发效率,是ORACLE数据库环境中不可或缺的工具之一。

    ORACLE数据库自动备份3种方法

    ### ORACLE数据库自动备份3种方法详解 #### 一、概述 在企业级应用中,数据库的安全性至关重要,定期进行数据库备份是确保数据安全的重要措施之一。对于Oracle数据库而言,实现自动化的数据库备份不仅可以提高效率...

    PlSQL安装包:用于连接Oracle的工具

    PlSQL Developer是一款强大的集成开发环境,专门用于编写和管理Oracle数据库的PL/SQL代码。它为Oracle数据库管理员、开发人员和分析师提供了全面的功能,简化了与Oracle数据库的交互过程。这款软件是Allround ...

    精通Oracle 10g PLSQL编程

    12. **数据库链接(DB Links)**:通过DB Links,可以在不同的Oracle数据库之间执行远程SQL和PLSQL,实现数据的跨库操作。 13. **PL/SQL内置函数**:Oracle提供大量内置函数,如数学函数、字符串函数、日期时间函数...

Global site tag (gtag.js) - Google Analytics