触发器(1)

原创 2012年03月27日 18:59:44
------------------------------------环境代码

create  table student
(stuid varchar2(10) not null,
stuname varchar2(10) not null,
sex char(2)
);

create table subject
(subjectid int,
subjectname varchar2(10)
);


create table score
(
stuid int,
subjectid int,
score int
);

insert into student values (1001, 'wind', '男');
insert into student values (1002, 'snow', '女');
insert into student values (1003, 'apple', '男');
insert into subject values (1, 'oracle');
insert into subject values (2, 'java');
insert into score values (1001, 1, 90);
insert into score values (1002, 2, 88);


create table apple
(sid int,
sno int);


---------------主体部分

一、触发器
1.触发器具有三个部分
(1).触发事件
(2).可选的触发器约束条件
(3).触发器动作

2.可以新建对应如下语句的触发器
(1).DML语句(insert、delete、update)
(2)DDL语句(create、alter、drop)
(3).数据库操作(servererror、logon、logoff、startup、shutdown)

3.可以创建触发器的对象:1.数据库表 2.数据库视图 3.用户模式 4.数据库实例

4.触发器类型
(1).DML触发器(包括行级触发器、语句级触发器)
(2).系统触发器
(3).替代触发器
(4).模式触发器

5.执行DML语句的顺序
(1).执行before语句级触发器(如果存在)
(2).对于受语句影响的每一行执行DML语句
(3).执行after语句触发器(如果存在)

6.两个特殊的值
:new 新产生的值
:old 原是的值

7.触发器中的谓语
(1). inserting
(2).updating
(3). deleting

---------------------------------------------------------------
****************************************************************
一、语句触发器
****************************************************************
--------------------------------------------------------------

一、语句触发器

create or replace trigger schemaname.triggername
before | after |delete |update of 列名
on 表名
[for each row]
when 条件

------------------------------------------------------
第一部分:before触发器
------------------------------------------------------


--案例01:新建一个测试的行前触发器
create or replace trigger tr01
before insert on student
begin
  dbms_output.put_line('这个是行前触发器!');
end;

--案例02:禁止工作人员在非工作日修改表信息
create table k01
(sid int,
sno int);

create or replace trigger tr101
before insert or update or delete on k01
begin
if to_char(sysdate, 'DY','nls_date_language=AMERICAN')
in ('SAT','SUN') then
raise_application_error(-20001,'不能休息日修改该表数据');
end if;
end;


--案例03:使用三个条件谓语
create or replace trigger tr102
before insert or update or delete on k01
begin
if to_char(sysdate, 'DY','nls_date_language=AMERICAN')
in ('SAT','SUN') then
case
when inserting then
begin
raise_application_error(-20001,'对不起,不能完成插入操作!');
end;
when updating then
begin
raise_application_error(-20002,'对不起,不能在休息日更新该表数据!');
end;
when deleting  then
begin
raise_application_error(-20003,'对不起,不能在休息日删除该表数据!');
end;
  end case;
end if;
end;


------------------------------------------------------
第二部分:after触发器
------------------------------------------------------

--案例01:新建一个测试的行后触发器
create or replace trigger tr02
after update on student  /*没有for each row说明是个表级别触发器*/
begin
  dbms_output.put_line('这个是表级update触发器!');
/*如果你一次更新的语句是几条只触发一次!*/
end;

--案例02:
/*新建一个触发器完成审计工作,审计在k01表上的insert、update、delete的操作次数、最早执行时间、最近执行时间*/

第一步:新建用于记录审计信息的审计表

create table audit_table
(
name varchar2(10),
login_user varchar2(20),
ins int,
upd int,
del int,
starttime date,
endtime date
);

第二步:新建触发器
方法1:用于后台监控

create or replace trigger tr_audit_k01_01
after insert or update or delete on k01
declare
cnt int;
begin
select count(*) into cnt from audit_table where name='K01';
if cnt=0 then
  insert into audit_table values ('K01',ora_login_user,0,0,0,sysdate, null);
end if;
case
when inserting then
update audit_table set ins=ins+1, endtime=sysdate where name='K01';
when updating then
update audit_table set upd=upd+1, endtime=sysdate where name='K01';
when deleting then
update audit_table set del=del+1, endtime=sysdate where name='K01';
end case;
end;


方法2:前后台监控
create or replace trigger tr_audit_k01_02
after insert or update or delete on k01
declare
cnt int;
begin
select count(*) into cnt from audit_table where name='K01';
if cnt=0 then
  insert into audit_table values ('K01',ora_login_user,0,0,0,sysdate, null);
end if;
case
when inserting then
begin
update audit_table set ins=ins+1, endtime=sysdate where name='K01';
dbms_output.put_line('你完成了数据插入操作!!');
end;
when updating then
begin
update audit_table set upd=upd+1, endtime=sysdate where name='K01';
dbms_output.put_line('你完成了数据更新操作!');
end;
when deleting then
begin
update audit_table set del=del+1, endtime=sysdate where name='K01';
dbms_output.put_line('你在进行删除操作,请慎重!!');
end;
end case;
end;

各类触发器

1.触发器能够存储一位2值信号的基本单元电路叫做触发器2.SR锁存器(直接置位复位锁存器Set-Reset Latch)由输入引脚直接决定保持状态,不需要触发信号的触发。由2个或非门电路组成,或由两个...
  • Augusdi
  • Augusdi
  • 2013年12月06日 22:45
  • 3787

sqlserver触发器:若插入的事实值超过预警值则向预警表中插入一条预警数据

--创建insert插入类型触发器 create trigger tgr_data_insert on DATA_RECORD_HISTORY for insert --插入触发 as ...
  • wwwcomcn123
  • wwwcomcn123
  • 2014年08月18日 15:46
  • 820

带有异步清0、异步置1的D触发器模块描述及其Testbench测试

1、Verilog描述具有有异步清0、异步置1的D触发器 //带有异步清0、异步置1的D触发器模块描述 module D_trigger(clk,set,rst,D,Q); input cl...
  • shuidetiankong
  • shuidetiankong
  • 2016年03月04日 16:17
  • 1803

带有同步清0、同步置1的D触发器模块描述及其Testbench测试

1、Verilog描述具有有异步清0、异步置1的D触发器 //同步复位、置位D触发器模块描述 module D_synctrigger(clk,rst,set,D,Q); input clk,rst...
  • shuidetiankong
  • shuidetiankong
  • 2016年03月04日 22:22
  • 1955

sql server触发器自动生成编号

--创建编号 alter TRIGGER syttyzNumberCreate ON syttyz after INSERT AS DECLARE @id nvarchar...
  • myk_666888
  • myk_666888
  • 2010年07月21日 16:51
  • 1074

Mysql 触发器和自增重置

触发器 create trigger tg1 before insert on t1 for each row begin insert into t2(name) values(new.nam...
  • zhuixunhebe1
  • zhuixunhebe1
  • 2014年04月07日 10:58
  • 773

sql server触发器(批量删除,使用游标)

if (object_id('DELETE_CLASSIFICATION', 'tr') is not null) drop trigger DELETE_CLASSIFICATION go ...
  • sxrenchao
  • sxrenchao
  • 2015年01月21日 15:50
  • 411

通过触发器解决统计,count(*)问题

单表过千万,以按用户分表1024个,count(*)统计还是会慢 所谓的慢,是指高并发了,MySQL就痿了。SAS硬盘,随机IO速率到达10~15M,IO就基本是100%了。这时就呵呵了。CPU...
  • toontong
  • toontong
  • 2015年10月09日 20:08
  • 1531

自己动手编写触发器

t1为主表,t2为附表,t1,t2是一对多的关系,通过id 其实这个触发器的思路是根据我在公司编写的一个程序对数据库操作而来,由于程序不能直接操作触发器,只能在操作的t1的时候,在同时对t2进行操作...
  • xiaolinyouni
  • xiaolinyouni
  • 2011年11月15日 15:16
  • 2141

触发器新增、修改、删除

/****** Object:  Trigger [dbo].[trigger_Insert_ProjectItem]   ******/ SET ANSI_NULLS ON GO SET QU...
  • tuanzhang2xiaoqi
  • tuanzhang2xiaoqi
  • 2017年01月10日 14:37
  • 273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器(1)
举报原因:
原因补充:

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