触发器-4

原创 2012年03月22日 10:22:08

三、DML触发器
1.控制数据安全
案例01:
/*
限制用户只能在工作时间8:00到17:00修改表apple中的数据
*/

create or replace trigger tr_work_apple
before insert or update or delete on apple
begin
 if to_char(SYSDATE, 'HH24')  not between 9 and 17 then
 raise_application_error(-20001,'不能在非工作时间修改该表数据');
 end if;
end;

 


2.实现数据审计
/*
审计可以用于监视非法和可疑的数据库活动。
*/

案例参考前面的数据审计部分;

 

3.实现数据完整性
/*

希望员工的新工资不能低于原来的工资并且增幅不能超过20%

*/
create or replace trigger tr_check_emp_sal
before update of sal on emp_sal
for each row
when (new.sal<old.sal or new.sal>1.2*old.sal)
begin
 raise_application_error(-20011,'工资只能增不降,并且增幅不能超过20%!');
end;

 

4.实现参照完整性
环境表:
create table p01
(sid int not null,
name varchar2(10)
);


create table p02
(
sid int,
score int
);

alter table p01
add constraint pk01 primary key(sid);

alter table p02
add constraint fk01 foreign key(sid) references p01 (sid);


insert into p01 values (1001, 'wind');
insert into p01 values (1002, 'snow');
insert into p01 values (1003, 'apple');
insert into p01 values (1004, 'mary');

insert into p02 values (1001, 99);
insert into p02 values (1002, 85);
insert into p02 values (1003, 96);
insert into p02 values (1004, 100);


问题:

当p01表更新数据时由于不能级联更新子表所以报错:

SQL> update p01 set sid=101 where name='wind';
update p01 set sid=101 where name='wind'
*
ERROR 位于第 1 行:
ORA-02292: 违反完整约束条件 (SCOTT.FK01) - 已找到子记录日志


解决:使用触发器实现级联更新
create or replace trigger tr_update_cascade_p01
after update of sid on p01
for each row
begin
update p02 set sid=:new.sid where sid=:old.sid;
dbms_output.put_line('子表也同时级联更新!');
end;

 

---------------------------------------------------------------
****************************************************************
四、替代触发器
****************************************************************
--------------------------------------------------------------
/*
对于简单的视图我们可以通过insert、update、delete操作,但是对于复杂的视图则不允许执行这些操作;
当满足下列任意一个条件时都不允许执行DML操作:
1.具体集合操作(union、union all、intersect、minus)
2.具有分组函数(min、max、sum、avg、count等)
3.具有group by、connect by、start with
4.具有distinct关键字
5.具有连接查询

为了使用DML语句修改表,需要使用替代触发器,但是建立instead of触发器有以下注意事项:
1.instead of只适用于视图
2.当基于视图建立触发器时不能指定before和after选项
3.在建立视图时没有指定with chekc option
4.当建立触发器时必须指定for each row

*/

 


--案例01:替代触发器
1)替代触发器子能应用于行级
A.新建视图
create or replace view v01
as
select stu.stuid, stu.stuname, sub.subjectid, sub.subjectname,
sc.score from student stu, subject sub, score sc
where stu.stuid=sc.stuid and sc.subjectid=sub.subjectid;

B、新建替代触发器
create or replace trigger tr02
instead of insert on v01
referencing new n
for each row
declare
  icount int;
begin
select count(*) into icount from student where stuid=:n.stuid;
if icount=0 then
  insert into student (stuid, stuname) values (:n.stuid, :n.stuname);
else
  update student set student.stuname=:n.stuname where stuid=:n.stuid;
end if;
select count(*) into icount from subject where subjectid=:n.subjectid;
if icount=0 then
  insert into subject values (:n.subjectid, :n.subjectname);
else
  update subject set subject.subjectname=:n.subjectname where   subjectid=:n.subjectid;
end if;
select count(*) into icount from score where subjectid=:n.subjectid and stuid=:n.stuid;
if icount=0 then
  insert into score values (:n.stuid, :n.subjectid, :n.score);
else
  update score set score.score=:n.score where subjectid=:n.subjectid and stuid=:n.stuid;
end if;
end;


C.测试

 

版权声明:日常札记,乐于分享

我的虚幻4之旅03 添加按键事件

unreal engine 4输入设置
  • ztk881012
  • ztk881012
  • 2014年12月14日 18:19
  • 1972

虚幻4游戏开发_2_触发器

虚幻4刚开源不久,网上也没啥像模像样的正规教程,自己趟着石头,慢慢摸索,我也不知道从哪里开始学,有时候也不知道自己在学什么 - - ! 关于怎么下载UE4源代码啦,怎么编译源代码啦,怎么运行啦......
  • lunweiwangxi3
  • lunweiwangxi3
  • 2015年06月10日 13:18
  • 1062

UE4物体移动

先设置盒体触发器,接着设置碰撞事件和时间轴,让他按照时间轴的走动而更新坐标。 时间轴 几个比较重要的点:     1是物体要移动必须在细节里面设置成可移动。     2.需要设...
  • AlenCzf
  • AlenCzf
  • 2016年06月18日 21:22
  • 6117

【虚幻4】学习总结4-蓝图碰撞与蓝图间的通信

由于上周考试一周,所以虚幻的学习断了一周,博客也断了一周 最近正好学习蓝图碰撞和蓝图间通信的有关部分,所以,我正好在此记录一下,首先是蓝图和角色间的碰撞,比如下面这个蓝图 蓝图与玩家间的碰撞,其实...
  • shangdi712
  • shangdi712
  • 2016年01月04日 13:41
  • 2723

一个比较简单的D触发器4分频verilog程序

转自 http://blog.sina.com.cn/s/blog_605fa0af0100djnz.html 将两个D触发器级联起来,前一个D触发器的输出做为下一个触发器的时钟输入,就构成了一个由...
  • ZSS1990
  • ZSS1990
  • 2016年06月13日 09:58
  • 1115

MySQL数据库总结(9)触发器

触发器 trigger 一触即发 四要素 创建触发器的语法 如何在触发器引用行的值 触发器里before和after的区别 应用场合触发器: trigger 一触即发 作用:监视某...
  • sinat_29912455
  • sinat_29912455
  • 2016年03月13日 14:01
  • 453

虚幻4 碰撞过滤

原创翻译,转载请注明出处。 原文:https://www.unrealengine.com/blog/collision-filtering?lang=zh-CN选择什么样的碰撞显然是非常重要的,但...
  • sinat_24229853
  • sinat_24229853
  • 2016年04月07日 22:44
  • 3503

【虚幻4】学习总结3-蓝图入门2

这一次说一下类蓝图,上次说过,类蓝图就是把蓝图封装成一个类,然后调用它的方法就好,下面是一个类蓝图的示例,具体操作请看虚幻4的官方视频,英语不好没关系,可以先看操作,真的,可以          首...
  • shangdi712
  • shangdi712
  • 2015年12月27日 15:44
  • 2408

数电实验大作业1-D触发器制作的同步4位倒计时器

系统名称:D触发器制作的同步4位倒计时器 1. 系统功能:实现循环倒计时的功能,共4位,模为16,数码管能够循环显示F-0的数字. 2. 设计用到的芯片:74LS74(2片),74LS00(2片)...
  • abysshal
  • abysshal
  • 2010年06月20日 08:24
  • 931

5.触发器实现计数器

前面我们讲述了门、继电器,其实继电器可以有很多方面的应用,通电后可以做成电子蜂鸣器和电铃。听起来很不可思议,继电器和这些东西有什么关系?继电器也称为双掷继电器,因为有两个不同的输出,一种是当电键闭合时...
  • xiazdong
  • xiazdong
  • 2011年07月22日 22:33
  • 4107
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器-4
举报原因:
原因补充:

(最多只允许输入30个字)