当前位置: 首页 > 工具软件 > Spring-Wind > 使用案例 >

触发器和java的关系_触发器-1 - java ee spring - 博客园

平光明
2023-12-01

------------------------------------环境代码

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;

 类似资料: