`
danielhjd
  • 浏览: 246265 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

续触发器:instead of ;事件触发--用户和系统

阅读更多

 定义:instead of

      1) 基于view表单的处理可以在表和视图上指定一个instead of 触发器

      2) 执行这种触发器可以代替原来的触发器,instead of 触发器扩展了视图跟新类型

      3) 每一个表和视图只能有一个instead of 触发器

      4) INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图

      5) INSTEAD OF触发器的主要优点就是可以使不能更新的视图支持更新。基于多个表的视图必须使用。

      6) INSTEAD OF触发器来支持多个表中数据的插入、更新和删除操作。
      注:不能在带有with check option 定义的视图中创建INSTEAD OF触发器

 

第一:instead of 触发器:

a: 有关insert的触发时间的触发器

--step 1 create referenced table

create table stu(
stu_id number(9) primary key,
stu_name varchar2(25)
)

create table course(
c_id number(9) primary key,
grade varchar2(25),
foreign key (c_id) references stu(stu_id)
)

 --step 2 create a view

create view sc_view as 
select stu.stu_id,stu.stu_name,course.grade from stu,course where stu.stu_id=course.c_id

测试:testing insert one statement

insert into sc_view values(5,'lily','75');

结果:result:

 

 --step3  create a trigger

create or replace trigger tri_sc_view
instead of insert on sc_view
begin
insert into stu values(:new.stu_id,:new.stu_name);
insert into course values(:new.stu_id,:new.grade);
end;

 提示:很多人纠结为什么 插入 stu & course表中的:new.stu_id是一样了?其实new.stu_id只是一个数值而已,那这句语句分析insert into sc_view values(5,'lily','75'); :new.new.stu_id 就是5,:new.stu_name就是‘lily’,:new.grade就是‘75’。他们的产生是根据创建的视图表sc_view的到的。触发器的执行过程是,先遇到触发事件这里指:insert into sc_view values(5,'lily','75'); 然后产生想对应的:new.stu_id ,:new.stu_name,:new.grade。将这些值赋值给了触发器作用的表单; 

 

执行语句:

1)

insert into sc_view values(1,'justin','88');
insert into sc_view values(2,'irs','70');
insert into sc_view values(3,'danile,'90);
insert into sc_view values(4,'tina,'75');
insert into sc_view values(5,'lily','75');

 结果:

select * from sc_view

 

  

select * from stu

 

 

select * from course

 

 

创建了view的trigger以后,可以直接通过添加wiew表单的数据来实现其他关联表的处理。。

 

2)

insert into stu values(6,'eric');

 

insert into course values(6,'95');

 

结果:

 

实际上是一起跟新的...

 

b)有关更新update的触发器;

select * from employees

create sequence empl_seq;

alter table employees drop(job_id,manger_id,department_id,dn)

insert into employees values(empl_seq.nextval,'daniel','hwong','daniel@yahoo.com','15902701688',sysdate,2000,.12);

insert into employees values(empl_seq.nextval,'justin','williams','justin@yahoo.com','15902701114',sysdate,5000,.12);

create or replace view tt_view as
select employees.first_name||','||employees.last_name v_name,employees.email,employees.phone_no,employees.employee_id from employees

select * from tt_view

update tt_view set v_name='justin2,william2'where employee_id=2
--执行弹出 oracl-01733此处不允许修改虚拟值--

create or replace trigger tri_employ
instead of update on tt_view
begin
update employees set 
                     employees.first_name=substr(:new.v_name,instr(:new.v_name,',')+1),
                     employees.last_name=substr(:new.v_name,1,instr(:new.v_name,',')-1),
                     employees.phone_no=:new.phone_no,
                     employees.email=:new.email
                     where employees.employee_id=:new.employee_id;
end;

第二:用户事件触发器;

create trigger ad_startup
 after startup
  on database
begin
 -- do some stuff
end;

 第三:系统触发器;

-----用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE /
RENAME / TRUNCATE / LOGOFF

 

create table droped_objects(
 object_name varchar2(30),
 object_type varchar2(30),
 dropped_on date);

 

create or replace trigger log_drop_trigger
 before drop on donny.schema
begin
 insert into droped_objects values(
  ora_dict_obj_name,  -- 与触发器相关的函数
  ora_dict_obj_type,
  sysdate);
end;

 

create table drop_me(a number);
create view drop_me_view as select *from drop_me;
drop view drop_me_view;
drop table drop_me;
select *from droped_objects

 

禁用和启用触发器
alter trigger <trigger_name> disable;
alter trigger <trigger_name> enable;
事务处理:
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用

  • 大小: 11.1 KB
  • 大小: 13.3 KB
  • 大小: 9.2 KB
  • 大小: 7.5 KB
  • 大小: 15.3 KB
分享到:
评论

相关推荐

    触发器---FOR INSERT与INSTEAD OF

    触发器---FOR INSERT与INSTEAD OF 触发器是一种特殊的存储过程,它可以自动执行某些操作以响应特定的事件,如INSERT、UPDATE、DELETE等。触发器可以帮助我们自动执行一些必要的操作,以确保数据的一致性和完整性。...

    oracle触发器实例

    Oracle触发器是数据库管理系统Oracle中的一个重要特性,它允许开发者在特定的数据操作语言(DML)事件发生时自动执行预定义的PL/SQL代码。触发器主要用于实现数据的完整性、一致性控制,以及执行复杂的业务规则。...

    oracle触发器

    触发器与存储过程和函数类似,都是存储在数据库中的程序单元,但触发器的独特之处在于它们不是由用户直接调用,而是由数据库操作(如INSERT、UPDATE、DELETE)或其他系统事件触发执行。 8.1 触发器类型分为三类: ...

    Oracle_plsql讲义:第14章 PL-SQL.ppt

    3. **系统触发器**:这些触发器在特定的系统事件发生时触发,如数据库启动、用户登录或表空间更改。它们不直接与DML操作关联,但可以用于实现更高级别的数据库管理和监控功能。 **创建触发器的语法:** ```sql ...

    oracleDML触发器.pptx

    5. **系统触发器和用户事件触发器** - **系统触发器**是由数据库系统在特定系统事件(如数据库启动、关闭等)发生时触发的。 - **用户事件触发器**是用户定义的,响应特定的用户操作(如DML操作)而触发。 6. **...

    insteadof触发器汇编.pdf

    1. 触发器的创建和使用:在SQL Server中,可以通过使用CREATE TRIGGER语句创建触发器,并通过指定INSTEAD OF子句来指定触发器应该在哪些操作上触发。例如,“CREATE TRIGGER de_em_insert ON v INSTEAD OF INSERT AS...

    把触发器说透

    - **系统触发器事件属性**:理解和设置触发器关联的系统事件属性,以精确控制触发时机。 - **使用触发器谓词**:通过WHEN子句指定触发条件,只有满足条件时触发器才会执行。 - **重新编译触发器**:当触发器的依赖...

    数据库触发器.docx

    - INSTEAD-OF触发器:在DML语句(INSERT, UPDATE, DELETE)执行前触发,可以替代默认的操作。如果定义了INSTEAD-OF触发器,那么对应的DML语句将不直接作用于数据,而是由触发器中的代码处理。 - AFTER触发器:在...

    Oracle触发器 实例讲解

    3. INSTEAD OF 触发器:例如create trigger instead_of_update on view_name for update 4. 系统条件触发器:例如create trigger system_trigger on database 5. 用户事件触发器:例如create trigger user_trigger ...

    精通Oracle核心技术和项目实战之触发器.

    - **系统和用户数据库事件**:例如用户的登录与注销、数据库的打开与关闭以及特定错误消息等。 #### 4. 触发器类型 触发器按照触发事件类型和对象的不同,可以分为多种类型: - **DML触发器**:依赖于DML操作触发...

    触发器介绍

    触发器是数据库管理系统(DBMS)中的一个重要功能,主要用于在特定的数据更改事件发生时自动执行预定义的操作。这些事件包括插入(new row)、删除(old row)或更新(row changes)等。触发器能够帮助确保数据的完整性和...

    对SQL Server数据库触发器的深入研究.pdf

    - INSTEAD OF触发器:在DML操作执行前触发,可以替代默认的操作行为,如果在触发器中没有执行相应的DML操作,则实际的数据修改不会发生。 3. **触发器的嵌套与递归** - 嵌套触发器:一个触发器可以触发另一个...

    SQLSever触发器.pdf

    INSTEAD OF触发器会在触发事件发生之前执行,它通常用于替代原有的插入、更新或删除操作。AFTER触发器则在触发事件发生之后执行,用于在操作之后执行一些额外的逻辑。 3. 触发器创建语法:创建触发器的基本语法结构...

    SQLServer触发器语法.pdf

    2. INSTEAD OF 触发器:执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。 3. FOR 触发器:相当于 AFTER 触发器,但可以选择是否指定触发器所有者名称。 三、触发器的执行顺序 触发器的执行顺序如下所...

    oracle触发器.doc

    - **INSTEAD OF触发器**:替代DML操作,而不是在操作后响应,主要用于视图。 - **系统条件触发器**:响应特定的系统事件,如数据库启动或关闭。 - **用户事件触发器**:响应用户定义的事件,实现定制化的数据库...

    DBA_SQL触发器2.pdf

    SQL触发器是数据库管理系统中的一种特殊程序,它们在特定的数据操作事件发生时自动执行,以响应用户的INSERT、UPDATE或DELETE操作。触发器主要用于维护数据的完整性和一致性,确保数据库中的数据按照预设的规则进行...

    oracleDML触发器1.ppt

    系统触发器是Oracle自动创建并触发的,它们响应数据库级别的事件,如数据库启动、用户登录、表空间变更等。 10.5 用户事件触发器 用户事件触发器是用户定义的,用于响应特定的用户定义事件,比如用户定义的存储过程...

Global site tag (gtag.js) - Google Analytics