Instead-of触发器

DML触发器除了执行insert,update或delete操作以外,还要执行触发器主体的命令。
Instead-of触发器会用触发器主体的命令替换相应的DML操作(触发的insert,update,delete都没有执行,仅执行了触发器主体的命令)
Instead-of 触发器常用于管理编写不可更新的视图


1.Instead-of触发器用触发器主体的命令替换相应的DML操作。
现在需要实现:向表student 插入数据时,检查id是否存在于表student中,如存在则进行更新操作,否则就不更新且输出提示信息。

create trigger CheckId
insetead of update --替换原来的update
as
if not exists(select * from student where id=:new.id)
begin
rollback transaction
DBMS_OUTPUT.PUT_LINE(‘要处理记录的学生ID不存在‘);
end;
else
begin
update student
set first_name=:new.first_name;
where id= :new.id;
end;
end CheckId;
/

--触发 trigger CheckId
update student
set first_name=‘David‘
where id=‘12721205‘ --其实没有实现这个update,而是实现了CheckId的主体


2. instead-of触发器常用于管理编写不可更新的视图
->1.不可更新视图
使用了集合操作运算符(UNION,UNION ALL ,INTERSECT,MINUS)
使用了分组函数(MIN,MAX,SUM,AVG)
使用了GROUP BY ,CONNECT BY ,START WITH 子句
使用了DISTINCT 关键字
使用了连接查询
对于基于上述情况创建的视图,不能对其直接执行DML,但可以在该视图上创建INSTEAD OF触发器来间接执行DML。

->2. 使用Instead-of触发器解决不可更新视图示例
books表字段:issbn,title,athour_id1,author_id2,author_id3















books表
ISBN Title Author1 Author2 Author3
72223855 Oracle 9i 38    
authors表字段:id,first_name,last_name










authors表
ID First_name Last_name
38 Robet Freeman

 books_authors 视图












books_authors 视图
ISBN Title First_name Last_name
72223855 Oracle 9i Robet Freeman

  用表 books 和author表,创建视图books_authors


create or replace view books_authors as
select b.isbn,b.title,a.first_name,a.last_name
from books b
join authors a
on b.authors_id1=a.id
or b.authors_id2=a.id
or b.authors_id3=a.id;

  执行DML会报错(在不可更新视图上不能使用DML)

insert into books_authors(isbn,title,first_name,last_name)
vaules(‘72223855‘,‘SQL Cookbook‘,‘Joe‘,‘Blow‘);

解决方案:
用instead-of触发器来实现insert语句的正常操作,即更新两个底层表。


create or replace trigger InsertBooksAuthors
instead of insert on books_authors --这个insert 替换了前面的insert,它没有直接更新不可更新视图,而是更新生成它的两个底层表
declare
v_book books%rowtype;
v_author_id authors.id%type;
begin
begin
select id
into v_author_id
from authors
where first_name= :new.first_name
and last_name= :new.last_name; --如果插入的记录(first_name,last_name 在books表中存在,就取出这条记录)
exception
when no_data_found then
insert into authors(id,first_name,last_name)
vaules(author_sequence.nextval,:new.first_name,:new.last_name)
returning id into v_author_id; --如果不存在则重新插入到authors表
end;

select *
into v_book
from books
where isbn= :new.isbn;

if v_book.author_id2 is null then
update books
set author_id2=v_author_id
where isbn= :new.isbn;
else
update books
set author_id3=v_author_id
where isbn= :new.isbn;
end if;
end InsertBooksAuthors;














Books
ISBN Title Author1 Author2 Author3
72223855 Oracle 9i 38 1000  














authors
ID First_name Second_name
38 Robet Freeman
1000 Esetrt Elegmen

















books_authors
ISBN Title First_name Last_name
72223855 Oracle 9i Robet Freeman
72223855 Oracle 9i Esetrt Elegmen

Instead-of触发器

时间: 2024-11-14 04:11:50

Instead-of触发器的相关文章

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

Mysql中的触发器

阅读目录 什么是触发器 特点及作用 例子:创建触发器,记录表的增.删.改操作记录 弊端 什么是触发器 简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行: 特点及作用 特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行: 作用:保证数据的完整性,起到约束的作用: 例子:创建触发器,记录表的增.删.改操作记录 接下来将创建user和user_history表,以及三个触发器tri_insert_u

oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

information_schema系列五(表,触发器,视图,存储过程和函数)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:TABLES TABLES这张表毫无疑问了,就是记录的数据库中表的信息,其中包括系统数据库和用户创建的数据库.而TABLESPACES 却是标注的活跃表空间. 看一下TABLES 的记录关于TEST1表: 其实我们通过show table status like 'test1'\G;可以看到相同的信息. TABLE_TYPE这列有两种类型,分别是BASE TAB

触发器和存储过程

触发器和存储过程   1.触发器   在进行dml操作的时候(insert,update,delete),可以对事件进行监听和响应,这种机制在数据库中叫做触发器.   触发器与永久性表关联,只能建在永久性表上面,不能是temporary表或view,且只有insert,update,delete三种事件.   mysql -u root -paixocm   show triggers;   show triggers\G;mysql> delimiter // ====改结束符   自动在内存

oracle 触发器

触发器--启动触发器alter trigger schema_trigger enable;--禁用触发器alter trigger schema_trigger disable;--删除触发器DROP TRIGGER COMPONT_GIS_TEM; 这个触发器是为了增加部件时,同步更新部件的缓存表,缓存表是为了在拿gis数据时,不用再联表查询街道.社区.大类的名称了缓存表中的sequence是  COMPONT_GIS_TEM_SEQ加入触发器的语句是CREATE OR REPLACE TR

mysql触发器

这两天写项目,有个要求是记录用户登录登出操作,把这些操作写到日志表里去,我觉得这个功能用MySQL的触发器来写,更方便一些,所以在这整理了一下这一过程. 在这里,我就不把项目的所以代码都粘贴过来了,项目用的是hibernate,这里我创建两个简单的表来演示一下这个过程. 1:登录表,记录用户的账号,密码以及在线状态,0表示不在线,1表示在线.对status进行默认约束,默认值就是0. create table login( id int not null primary key auto_inc

触发器使用教程和命名规范

目  录 触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,例五:语句级触发器之二 9 9,例六:用包封装触发器代码 10 10,触发器命名规范 11 1,触发器简介 触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执 行

20151016触发器

--触发器:一种特殊的存储过程,通过对数据库表操作的动作,来触发,增删改select *from studentselect *from scoreselect *From fruit drop trigger shanchu--第一种触发器 当某个动作之后触发alter trigger xiugaion Fruitafter update --修改之后的动作as select *From inserted --inserted 表示变动的那一行属性go update Fruit set Num

SQLServer与Oracle的数据同步(触发器trigger)

说到同步,其实是靠"作业"定时调度存储过程来操作数据,增,删,改,全在里面,结合触发器,游标来实现,关于作业调度,使用了5秒运行一次来实行"秒级作业",这样基本就算比较快的"同步" 做的是SQL Server往Oracle端同步,先在sql server上建立往Oracle端的链接服务器,我用一个视图"封装"了一下链接服务器下的一张表. create view v_ora_PUBLISHLASTREC as select *