• 11、触发器


      1 一.触发器
      2 分类:
      3 (1)行级触发器:DML,如果操作批量数据,会出现多个影响语句
      4 (2)语句级触发器:DML ,如果操作批量数据,会出现一个影响语句
      5 (3)instead of 触发器
      6 (4)模式触发器:DDL
      7 (5)数据库级触发器 :数据库登陆、注销等操作
      8 
      9 --行级触发器语法
     10 create  or replace trigger  触发器名字
     11 before|after  (动作update|insert|delete 12 on 表名
     13 for each row --行级触发器
     14 begin
     15     --备份操作(插入删除的数据到备份表)
     16 end;
     17 
     18 --快速复制表结构并创建
     19 --where条件为true或不写where条件复制表数据和表结构,
     20 --where条件为false只复制表结构不复制表数据
     21 
     22 -- 创建一个删除存放记录的表
     23 create  table del_emp as select * from emp where 1=2 24 
     25 --1.建立一个行级触发器,当删除某一条记录时,将删除数据插入到某张备份表
     26 create or replace trigger tr_del_emp
     27    before delete  --触发的时机是删除前触发
     28    on emp    --指定操作的表
     29    for each row              --行级触发器
     30    when (old.deptno<>10)  --触发的条件
     31 begin
     32    --删除前将数据插入到备份表
     33    insert into del_emp(deptno,empno,ename,job,mgr,sal,comm,hiredate)
     34       values( :old.deptno, :old.empno, :old.ename, :old.job, :old.mgr, :old.sal, :old.comm,
     35        :old.hiredate);
     36 end;
     37  /
     38 
     39 --删除5001数据
     40 delete emp where empno=7902;
     41 
     42 --查询备份表
     43 select * from del_emp;
     44 
     45 --回滚
     46 rollback 47 
     48 --删除触发器
     49 drop trigger tr_del_emp; 
     50 
     51 
     52 
     53 --2.创建行级触发器,删除批量数据
     54 create or replace trigger upda_emp_row
     55   after insert or update or delete
     56   on emp
     57   for each row
     58 begin
     59   if updating then
     60     dbms_output.put_line('数据已经更新!');
     61   elsif deleting then
     62     dbms_output.put_line('数据已经删除!');
     63   elsif inserting then
     64     dbms_output.put_line('数据已经插入');
     65   end if;
     66 end;
     67 /
     68 
     69 --删除表中所有记录
     70 delete from emp;
     71 
     72 --回滚删除的数据
     73 rollback;
     74 
     75 --删除触发器
     76 drop trigger upda_emp_row;
     77 
     78 --3.创建语句触发器,删除批量数据
     79 --.语句触发器( 默认触发器)
     80 create or replace trigger upda_emp
     81   after insert or update or delete
     82   on emp
     83 begin
     84    if updating then
     85       dbms_output.put_line('数据已经更新');
     86   elsif deleting then
     87      dbms_output.put_line('数据已删除');
     88   elsif inserting then
     89     dbms_output.put_line('数据插入');
     90   end if;
     91 end;   
     92 /
     93 --删除
     94 delete from emp;
     95 
     96 --回滚
     97 rollback;
     98 
     99 --删除触发器
    100 drop trigger upda_emp;
    101 
    102 conn system/accp
    103 
    104 --创建用户
    105 create user user1 identified by user1;
    106 
    107 --授权
    108 grant connect,resource to user1;
    109 
    110 --切换用户user1
    111 conn user1
    112 
    113 --创建记录表
    114 create table event_ddl(event varchar2(20), username varchar2(10),owner varchar2(10),
    115    objname varchar2(20),objtype varchar2(10),time date);
    116 
    117 --4.模式触发器DDL
    118 --创建用户
    119  create user user1 identified by user1;
    120  
    121  --给用户赋权
    122  grant connect ,resource to user1;
    123  
    124  --切换用户登录
    125  conn user1/user1;
    126  
    127  --创建记录表
    128   create table event_ddl(
    129    event varchar2(20),
    130    username varchar2(20),
    131    owner varchar2(10),
    132    objnamename varchar2(20),
    133    objtype varchar2(10),
    134    time date);
    135   
    136 --创建触发器记录user1模式的所有ddl的操作
    137 create or replace trigger tr_ddl
    138 after ddl on user1.schema
    139 begin
    140 --ora_sysevent是创建还是删除
    141 --ora_login_user 登录用户
    142 --ora_dict_obj_owner 操作用户
    143 --ora_dict_obj_name 操作对象名称=表名
    144 --ora_dict_obj_type操作类型是表还是其他
    145   insert into event_ddl values(ora_sysevent,ora_login_user,ora_dict_obj_owner,ora_dict_obj_name,ora_dict_obj_type,sysdate);
    146 end;
    147 /
    148 
    149 --调用触发器
    150 create table temp(a int);
    151 drop table temp;
    152 
    153 --查看结果
    154 select * from event_ddl;
    155 drop table event_ddl purge;
    156 
    157 EVENT  USERNAME    OWNER  OBJNAMENAME   OBJTYPE   TIME
    158 ----- ----------- ------- ------------  -------   -----
    159 CREATE  USER1      USER1    TEMP       TABLE      13-12月-15
    160 
    161 DROP    USER1      USER1    TEMP       TABLE      13-12月-15
    162 
    163 CREATE  USER1      USER1    TEMP       TABLE      23-3月 -16
    164 
    165 DROP    USER1      USER1    TEMP       TABLE      23-3月 -16
    166 
    167 --删除触发器
    168 drop trigger tr_ddl;
    169    
    170    
    171 --5.数据库级触发器
    172 --题目:记录所有用户登录和退出数据库的用户名称、登录和退出时间
    173 --用管理员操作
    174 conn system
    175 输入密码:
    176 
    177 --创建记录表
    178 create table log_table(
    179   username varchar2(20), login_time date,
    180   logoff_time date,address varchar2(20)
    181   );
    182   
    183 --创建数据库级触发器
    184 create or replace trigger tr_login
    185 after logon on database
    186 begin
    187   insert into log_table(username,login_time,address)
    188     values(ora_login_user,sysdate,ora_client_ip_address);
    189 end;
    190 /
    191 
    192 --切换用户登录
    193 conn holly/sys
    194 conn scott/tiger
    195 conn system/sys
    196 --查询记录表
    197 select * from log_table;
    198 USERNAME             LOGIN_TIME     LOGOFF_TIME    ADDRESS
    199 -------------------- -------------- -------------- --------------------
    200 HOLLY                13-12月-15
    201 SCOTT                13-12月-15
    202 SYSTEM               13-12月-15
    203 SYSMAN               13-12月-15
    204 
    205 --删除表数据并且不进入回收站
    206 drop table log_table purge;
    207 
    208 --删除触发器
    209 drop trigger tr_login;
    210    
  • 相关阅读:
    在eclipse中安装 Activiti Designer插件
    Maven settings.xml配置(指定本地仓库、阿里云镜像设置)
    unity调用MMBilling_2.4.2 Android SDK.
    unity与Android相互调用
    Unity3D研究院之与Android相互传递消息
    Unity3D研究院之打开Activity与调用JAVA代码传递参数
    Objec c 字符串比较
    判断不同IOS设备
    Unity3D研究院之IOS本地消息通知LocalNotification的使用
    【Unity3D】iOS 推送实现
  • 原文地址:https://www.cnblogs.com/holly8/p/5701849.html
Copyright © 2020-2023  润新知