20210813触发器

--创建触发器,在删除学生表学生记录之后触发
create or replace trigger student_trigger
after--后置触发器
delete--删除
on student1 --作用的表名
for each row --行级触发器,影响一行触发器,如果不写,执行一条语句不管影响多少行只触发一次
--pl/sql语句块
begin
  --old指的是旧的记录行对象,获取该行的所有字段值,new指的是新的记录行对象
  dbms_output.put_line('学生记录'||:old.id||'被删除');
end;
select * from student1 order by id;

delete from student1 where id <=5;
commit;

--创建触发器,对学生记录新增,修改,删除操作之后进行触发
create or replace trigger stu_trigger
after 
insert or update or delete
on student1
for each row 
  
begin
  --新增操作
  if inserting then
    dbms_output.put_line('学生记录【'||:new.name||'】新增成功');
  
  --修改操作
  elsif updating then
  dbms_output.put_line('学生记录【'||:old.id||'】密码由【'||:old.password||'【改成新密码【'||:new.password||'】');
  --删除擦操作
  elsif deleting then
  dbms_output.put_line('学生记录【'||:old.id||'】删除成功');
  end if;
end;

insert into student1 (id,name,username,password,sex,age,birthday,create_time)
values(1,'李四','lisi','123456','1','20',to_date('2001-03-10','yyyy-MM-dd'),sysdate);
commit;

update student1 set password ='666666' where id in(1,6);
commit;

delete from student where id<=10;
commit;

select * from student1;


--创建触发器,只能在12点~13点之间新增、修改、删除student表数据
create or replace trigger stu_trigger1
before
insert or update or delete
on student1
for each row
  
begin
  if to_char(sysdate,'hh24')!=12 then
    raise_application_error(-20001,'学生记录只能在12点~13点之间进行增删改操作');
  end if;
end;

select to_char(sysdate,'hh24') from dual;

select * from student1;
--禁用触发器
alter trigger stu_trigger1 disable;
--启动触发器
alter trigger stu_trigger1 enable;
--删除触发器
drop trigger stu_trigger1;

--创建视图
create or replace view view_student1 as
select id,name,username,password from student1 order by id;
---查询视图
select * from view_student;
--修改表数据
update student1 set password ='666666' where id in (1,2);
commit;

--修改视图数据,实则是修改表的数据
update view_student set password ='123456' where id in (1,2);
commit

select * from view_emp;

update view_emp e set e.dept_name = 'ITS' where e.id = 103;
commit;

--创建触发器instead of 对视图数据进行修改,针对包含来自多个
create or replace trigger view_emp_trigger
instead of--视图触发器,只作用在视图上
insert or  update or delete 
on view_emp --视图名称,包含来自多个表的字段
for each row
begin
  if inserting then
    dbms_output.put_line('新增');
  
  elsif updating then
      update departments d set d.department_name = :new.dept_name where d.department_id=(select e.department_id from employees e where e.department_id = :old.id);
     dbms_output.put_line('删除操作');
  elsif deleting then
  dbms_output.put_line('新增');
  end if;
end;
 
--模式触发器,用户级别,主要用在ddl语句中,创建,修改,删除对象时触发

create or replace trigger obj_trigger
after --后置对象
create or alter or drop --删除对象
on schema--作用在模式上,当前用户
begin
  dbms_output.put_line('当前用户;'||ora_dict_obj_owner||'对象名称:'||ORA_DICT_OBJ_NAME||'对象类型:'||ORA_DICT_OBJ_TYPE||',删除时间:'||to_char(sysdate,'yyyy-MM-dd'));
end;

drop table student_bak20210806;

create table test(
id number,
name varchar2(10));

create index idx_test_name on test(name);
 drop index idx_test_name;

--使用触发器,给员工涨工资,工资的值必须大于旧的值,否则提示错误  前置触发器
create or replace trigger emp_sal_trigger
before 
update
on employees
for each row
begin
  if :new.salary < :old.salary then
    raise_application_error(-20001,'工资的值必须大于旧的值');
  end if;
end;
update employees e set e.salary = 50000 where e.employee_id = 105;

select * from employees;



--使用触发器,修改学生性别,必须是1或者是0,否则提示错误  前置触发器
create or replace trigger student_trigger
before
update 
on student
for each row
begin
  if :new.sex not in(0,1) then
    raise_application_error(-20001,'修改学生性别,必须是1或者是0');
  end if;
end;

--测试
select *from student;
update student s set s.sex =0 where s.id =1;

--创建表test和备份test_bak,当对表test 新增,修改,删除数据时,同步更新test_bak表,使用触发器现实
create table test(
id number primary key,
name varchar2(10),
sex number,
age number,
create_time date);

--插入数据
declare
  birthday date;
begin
  for i  in 1..50
    loop
      birthday :=TO_DATE (TRUNC (DBMS_RANDOM.VALUE (TO_NUMBER (TO_CHAR (add_months(sysdate,-20*12), 'J')),TO_NUMBER (TO_CHAR (add_months(sysdate,-30*12), 'J')))),'J');
      insert into test(Id,Name,Sex,Age,Create_Time) 
values(i,'张三'||i,trunc(dbms_random.value(0,2)), ceil(months_between(sysdate,birthday)/12),sysdate);
    end loop;
    commit;
end;

select * from test;
select * from test_bak;
create table test_bak as select * from test;

drop table test;


--创建触发器instead of 对视图数据进行修改,针对包含来自多个
create or replace trigger view_emp_trigger
instead of--视图触发器,只作用在视图上
insert or  update or delete 
on view_emp --视图名称,包含来自多个表的字段
for each row
begin
  if inserting then
    dbms_output.put_line('新增');
  
  elsif updating then
      update departments d set d.department_name = :new.dept_name where d.department_id=(select e.department_id from employees e where e.department_id = :old.id);
     dbms_output.put_line('删除操作');
  elsif deleting then
  dbms_output.put_line('新增');
  end if;
end;
--创建表test和备份test_bak,当对表test 新增,修改,删除数据时,同步更新test_bak表,使用触发器现实
--创建触发器
create or replace trigger test_trigger
after
insert or update or delete
on test
for each row
begin
  
  if inserting then
    insert into test_bak  (id,name,sex,age,create_time)values(:new.id,:new.name,:new.sex,:new.age,:new.create_time);
    dbms_output.put_line('新增成功');
  
  elsif updating then
    update test_bak t set t.id =:new.id,t.name=:new.name,t.sex=:new.sex,t.age=:new.age,t.create_time=:new.create_time where t.id = :new.id;
    dbms_output.put_line('修改成功');
  elsif deleting then
  delete test_bak t where t.id = :old.id;
  dbms_output.put_line('删除成功');
  end if;
  end;

--测试
select * from test;
select * from test_bak;
delete from test where id=51;
insert into test(id,name,sex,age,create_time) values(52,'王五',1,20,sysdate);
commit;

update test t set t.sex =0 where t.id=3;
commit;

delete from test where id = 1;
commit;

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值