--=======触发器============ --是一段命名的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数据库PL/SQL Developer客户端是数据库管理员和开发人员常用的工具,它专为Oracle数据库系统设计,提供了便捷的界面来编写、测试和调试PL/SQL代码。这个工具的强大之处在于其全面的功能集,允许用户进行数据库...
"Oracle数据库练习PPT"可能包含一系列关于Oracle数据库管理、表的创建、索引、视图、触发器、存储过程、游标以及数据库安全等内容的教程。通过这些PPT,初学者可以了解到如何设计和操作Oracle数据库,包括数据类型、...
PLSQL 触发器是一种特殊的存储过程,与普通存储过程不同的是,触发器是当某些事件发生时,由 Oracle 自动执行,可以说是隐藏执行的存储过程。 一、 触发器概述 触发器是 Oracle 中的一种特殊对象,它可以在特定的...
"使用PLSQL创建Oracle数据库用户并设置权限" 在 Oracle 数据库中,创建用户并设置权限是数据库管理员的基本任务之一。在本文中,我们将使用 PLSQL 创建 Oracle 数据库用户并设置权限,包括创建用户、设置权限和创建...
在Oracle数据库管理中,PL/SQL Developer是一款非常实用的工具,它专为Oracle数据库的存储程序单元开发设计,包括过程、函数、包、触发器等的编写和调试。这款工具以其用户友好、代码质量优化以及高生产力而受到青睐...
在开发和管理Oracle数据库时,PL/SQL作为其内建的编程环境,可以编写存储过程、函数、触发器等,实现数据处理和业务规则的封装。 PL/SQL通过SQL*Plus命令行工具或图形化界面工具与Oracle数据库交互。其中,"plsql...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,它提供了高效的数据存储、管理和处理功能。PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库专用的一种编程语言,用于编写...
Oracle数据库是世界上最广泛使用的商业关系型数据库系统之一,以其稳定性、安全性和可扩展性而著称。 在"PLSQLDeveloper_win32位"中,我们关注的是一个专门用于开发PLSQL代码的集成开发环境(IDE),即PL/SQL ...
"PLSQL Developer"是一款专为Oracle数据库设计的强大开发工具,标题中的"plsql数据库连接工具"指的就是这款软件。它提供了全面的功能,包括但不限于: 1. **数据库连接**:用户可以通过输入数据库实例名、用户名、...
PLSQL Developer是一款强大的Oracle数据库管理工具,主要用于开发、测试和管理Oracle数据库。它以其便捷的界面和丰富的功能深受数据库管理员和开发人员喜爱。标题提到的“免序列号免安装”特性,意味着这是一个便携...
"plsql连接oracle数据库插件"指的是能够帮助用户更方便地通过PL/SQL工具与Oracle数据库交互的软件组件。 首先,让我们详细了解一下PL/SQL。PL/SQL结合了SQL的查询和数据操作能力,以及结构化编程语言的控制结构,如...
3. **数据库对象管理**:用户可以通过PL/SQL Developer轻松管理Oracle数据库中的各种对象,如表、视图、存储过程、函数、触发器等,可以创建、修改和删除这些对象。 4. **数据浏览和编辑**:可以直接在软件中浏览...
PL/SQL是Oracle数据库的核心组成部分,用于创建复杂的业务逻辑、存储过程、触发器、函数以及数据库应用程序。 一、PL/SQL的基本结构 PL/SQL由三部分组成:声明部分、执行部分和异常处理部分。声明部分用于声明变量...
PLSQL Developer是一款强大的Oracle数据库管理工具,主要用于编写、调试、执行和管理PL/SQL代码。它为数据库管理员和开发人员提供了高效的工作环境,简化了与Oracle数据库的交互过程。以下是一些关于PLSQL Developer...
PLSQL Developer是一款强大的Oracle数据库管理与开发...总的来说,PLSQL Developer是ORACLE数据库管理员和开发者的得力助手,它简化了复杂的数据库管理工作,提高了开发效率,是ORACLE数据库环境中不可或缺的工具之一。
### ORACLE数据库自动备份3种方法详解 #### 一、概述 在企业级应用中,数据库的安全性至关重要,定期进行数据库备份是确保数据安全的重要措施之一。对于Oracle数据库而言,实现自动化的数据库备份不仅可以提高效率...
PlSQL Developer是一款强大的集成开发环境,专门用于编写和管理Oracle数据库的PL/SQL代码。它为Oracle数据库管理员、开发人员和分析师提供了全面的功能,简化了与Oracle数据库的交互过程。这款软件是Allround ...
12. **数据库链接(DB Links)**:通过DB Links,可以在不同的Oracle数据库之间执行远程SQL和PLSQL,实现数据的跨库操作。 13. **PL/SQL内置函数**:Oracle提供大量内置函数,如数学函数、字符串函数、日期时间函数...