Oracle触发器(附带SQL语句完整过程及示例)

触发器:定义

    触发器(trigger)设置某个条件,如果SQL语句执行了该条件则触发某个或者某些固定的SQL

触发器:类型

     1.DML触发器 2.替代触发器 3.系统事件触发器

对数据表进行DML语句操作(insert、update、delete)时所触发的触发器,DML触发器有两种

    1.行级触发器 2.表级触发器;行级触发器会对数据库表中的受影响的每一行 触发一次触发器代码;语句级触发器则只触发一次,与语句所影响到的行数无关;触发器中使用before触发则在事件发生之前执行触发器代码;触发器中使用after触发器则在触发事件发生之后执行触发器代码;如果删除重建触发器中的某个表必须要检查触发器是否可用;触发器自动同步Demo请参考https://blog.51cto.com/zhanky/2355285

    1.DML行级触发器

----示例语法
----先了解这个语法它长什么样
create or replace trigger modify_stu
after update
on CSDN_STUDENT
for each row
begin
    dbms_output.put_line(:old.classid||:old.classname);
end;
----示例Demo(跟着示例执行一边就基本上就可以大概明白触发器怎么使用)
----新建SQL表
create table CSDN_STUDENT   ---创建CSDN_STUDENT表
(
  id        NUMBER(19), --id
  stu_no    VARCHAR2(20), --学号
  stu_name  VARCHAR2(32), --姓名
  stu_age   NUMBER,  --年龄
  stu_major VARCHAR2(32) --专业
)

create table CSDN_STU_LOG   ---创建CSDN_STU_LOG表,用于记录对CSDN_STUDENT表的操作日志
(
  log_id     NUMBER,  --日志id
  log_action VARCHAR2(100),  --操作名称
  log_date   DATE,  --操作时间
  log_message   VARCHAR2(32) --
)
----定义行级触发器
----modify_stu 触发器名字  
----insert update delete 条件
----for each row 表示行级触发器 
----:new 引用插入操作的某列值,如 :new.stu_name
----.:old 引用删除操作的某列值,如 :old.stu_name
----CSDN_STUDENT 关联的表
----update of stu_name 对应:new.stu_name和:old.stu_name人名
----如果不想显示人名或者其他信息将第二行和带:new和:old的改成字符'XXX'
------after insert or delete or update
------示例 insert into CSDN_STU_LOG values(1,'insert',sysdate,'XXX');

create or replace trigger modify_stu
after insert or delete or update of stu_name 
on CSDN_STUDENT
for each row
  begin 
    if inserting then
      insert into CSDN_STU_LOG values(1,'insert',sysdate,:new.stu_name);
    elsif deleting then
       insert into CSDN_STU_LOG values(2,'delete',sysdate,:old.stu_name);
    elsif updating then
      insert into CSDN_STU_LOG values(3,'update_old',sysdate,:old.stu_name);
      insert into CSDN_STU_LOG values(4,'update_new',sysdate,:new.stu_name);
     end if;
end;

 ----触发器捕捉到SQL操作进行对应的处理 将日志保存至 CSDN_STU_LOG表中

insert into CSDN_STUDENT values(1,'NO2','李四',21,'数学系');  --插入数据
update CSDN_STUDENT set stu_age=19 where stu_name='李四';    --修改年龄
delete CSDN_STUDENT where stu_name='李四';                   --删除数据

2.DML表级触发器

----表级触发器不加 for each row
create or replace trigger modify_stus
before insert or update or delete on CSDN_STUDENT
begin
   if deleting then
     raise_application_error(-20001,'该表不允许删除数据');
   elsif updating then
     raise_application_error(-20002,'该表不允许修改数据');
    elsif inserting then
     raise_application_error(-20003,'该表不允许插入数据');
    end if;
end;

再次进行添加、删除、更改操作会出现提示框禁止操作(在 IF 里面也可以SQL语句或者自定义的提示信息)

insert into CSDN_STUDENT values(1,'NO2','李四',21,'数学系');  --插入数据
update CSDN_STUDENT set stu_age=19 where stu_name='李四';    --修改年龄
delete CSDN_STUDENT where stu_name='李四';                   --删除数据

禁止删除表触发器特殊形况下使用可以提高安全性

----关键字drop 也可以替换成别的
CREATE OR REPLACE TRIGGER CSDN_ddl_deny_lee
BEFORE  drop OR truncate on database    
begin
    raise_application_error(num => -20000,msg => '主机:' || SYS_CONTEXT('USERENV', 'HOST')||chr(13) || 'IP:' ||SYS_CONTEXT('USERENV', 'IP_ADDRESS')||'试图删除' || ora_dict_obj_name() || '表');
end;

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 --PL/SQL基础1 declare begin dbms_output.('不输出不换行'); dbms_output.put_line('输出并换行'); end; --PL/SQL基础2 declare dig number(20,2); begin select avg(price) into dig from products; dbms_output.put_line('电子产品的平均价格是'||dig); end; --PL/SQL基础3 根据产品编号获得产品对象 --pname products.name%type; pname变量的类型与products.name列的类型一样 declare pid constant products.id%type:=1; --定义常量,初值1 pname products.name%type; pdate products.adddate%type; begin --pid:=1; select name,adddate into pname,pdate from products where id=pid; dbms_output.put_line('产品名称是:'||pname||',日期'||pdate); end; --PL/SQL基础4 根据产品编号获得产品对象 --obj products%rowtype; obj与products表的单行类型一样,可以通过点运算取值obj.price declare obj products%rowtype; begin select * into obj from products where id=&编号; dbms_output.put_line('产品名称是:'||obj.name||',价格:'||obj.price); end; --PL/SQL基础5 条件if declare vid products.id%type; vprice products.price%type; begin vid:=&编号; select price into vprice from products where id=vid; if vprice100 and vprice<=1000 then dbms_output.put_line('价格在100—1000之间'); else dbms_output.put_line('价格在1000以上'); end if; end; --PL/SQL基础5 多条件case begin case '&等级' when 'A' then dbms_output.put_line('优秀'); when 'B' then dbms_output.put_line('合格'); when 'C' then dbms_output.put_line('不合格'); end case; end; select id, name, typeid, price, adddate from products create table students( Id int primary key, sex int ) insert into students select 1,1 from dual union select 2,0 from dual union select 3,1 from dual union select 4,0 from dual union select 5,1 from dual insert into students(Id) values(6) select * from students; select translate(translate('1心1意 3心2意','1','一'),'3','三') from dual; select id,nvl(translate(translate(sex,1,'女'),0,'男'),'未知') from students; select id,case as 性别 from( sele

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子座断点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值