43

1.触发器,当删除表时,要先备份
1.1先建一备份表
1.2create or replace trigger tri4
before delete on scott.emp
fore each row
begin
insert into emp_bak(id,name) values(:old.empno,:old.ename);
end;
//-删除没以new,insert 没有old,update,二者都有。
2.控制员工的新工资不能低于原工资,同时也不高出原工资的20%
create trigger tri5
before insert on scott.emp
for each row
begin
if(:new.sal<:old:sal || :new.sal>:old.sql*1.2) then
dbms_output.put_line('工资范围不对');
raise_application_error(-20003,'工资范围不对');
end if;
end;
3.阻止把小于18岁的用户增加到数据库emp表中,请编写一个角
create table emp2(
id number primary key,
name varchar2(32),
birthday date
);
create trigger tri6
before insert on scott.emp2
fore each row
begin
if add_months(:new.birthday,18*12)>sysdate then
dbms_output.put_line('您年龄小');
raise_application_error(-2001,'您年龄小');
end if;
end;
4.系统触发器
比如有:数据库的启动中,ora_client_ip_address
ora_database_name
ora_
基本语法不一样的。
create or replace trigger 触发器
after[before] logon[logoff] on database
begin
--执行语句
end;


一般用系统管理用来管理创建,还要新创一个表
案例:用于保存用户登录或退出的情况
conn sys/system
create table log_table(
username varchar2(34),
logon_time date;
logoff_time date,
address varchar2(20))
建一个登录触发器,
create trigger tri7
after login on database
begin
insert into log_table (username,logon_time) values (ora_login_user,sysdate,ora_client_ip_address);
end;
create trigger tri8
before login on database
begin
insert into log_table (username,logoff_time) values (ora_login_user,sysdate,ora_client_ip_address);
end;
再建一个退出触发器。
5.ddl触发器(主要纪录create,alter,drop)
语法:
create ore replace trigger onTable
after ddl on 方案名.schema
begin
end;
5.1.建表保存
create table my_ddl_recore(
event varchar2(64),
username varchar2(53)
ddl_time date);
5.2
create trigger tri0
after ddl on scott.schema
begin
insert into onTable values (ora_sysenent,ora_login_user,sysdate);
end;
注意:ddl语句是自动提交的。dml语句要手动提交(若未手动提交,当退出控制台时,oracle也会自动提交)。
6.管理触发器
暂时不使用
alter trigger 触发器名 disable;
激活
alter trigger 触发器名 enable;
禁止或激活表的所有触发器
alter table 表名 enable/disable all trigger
删除触发器
drop trigger 触发器名