oracle的触发器

版权声明: https://blog.csdn.net/weixin_39892293/article/details/85282171

触发器
            基本语法:
                create [or replace] tigger 触发器名 触发时间 触发事件
                    on 表名
                    [for each row]
                    begin
                     pl/sql语句
                    end
                
            其中:
                触发器名:触发器对象的名称。
                触发时间:before,after
                触发事件:insert,update,delete
                表名:触发器所在的表
                for each row:对表的每一行触发器执行一次,如果没有,则只对整表执行一次。
                
            功能:
                1.允许/限制对表的修改
                2.自动生成派生列,比如自增字段
                3.强制数据一致性
                4.提供审计和日志记录
                5.防止无效的事务处理
                6.启动复杂的业务逻辑
                
            1.每当成功插入新员工之后,自动打印“成功插入新员工”;
                create or replace trigger abcd after insert on emp for each row
                begin
                  dbms_output.put_line('成功');
                end;
            2.在更新表emp之前触发,目的是不允许在周四修改表;
                create  or replace trigger testtrigger before insert or update or delete
                    on emp
                    begin
                      if to_char(sysdate,'day')='星期四' then 
                        RAISE_APPLICATION_ERROR(-20600,'不能在周四修改表emp');
                      end if;
                    end;
            3.使用触发器实现序号自增
                创建一个测试表
                    create table test_emp(
                    id number(10) primary key,
                    username varchar2(100));
                创建序列
                    create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;
                创建触发器
                    create or replace trigger my_tgr
                        before insert on test_emp
                        for each row
                        declare
                            next_id number;
                        begin
                          select my_seq.nextval into next_id from dual;
                          :new.id:=next_id;  -- new表示新插入的那条记录
                        end;
                插入数据
                    insert into test_emp(username) values('test');
            4.用户对表进行dml操作的时候,自动记录日志
                create or replace trigger testtrigger
                    after delete or insert or update on test_emp
                    for each row 
                      
                    declare 
                        v_type test_log.type%type;
                    begin
                      if inserting then 
                        v_type:='insert';
                       DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');
                       elsif updating then
                         v_type:='update';
                         DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');
                         elsif deleting then
                           v_type:='delete';
                           DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');
                          end if;
                          insert into test_log values(user,v_type,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
                end;
            5.创建触发器,用来记录表的删除数据
            --创建表
                CREATE TABLE employee(
                  id  VARCHAR2(4) NOT NULL,
                  name VARCHAR2(15) NOT NULL,
                  age NUMBER(2)  NOT NULL,
                  sex CHAR NOT NULL
                );
                --插入数据
                INSERT INTO employee VALUES('e101','zhao',23,'M');
                INSERT INTO employee VALUES('e102','jian',21,'F');
                --创建记录表(包含数据记录)
                CREATE TABLE old_employee AS SELECT * FROM employee;
                --创建触发器
                CREATE OR REPLACE TRIGGER TIG_OLD_EMP
                 AFTER DELETE ON EMPLOYEE
                 FOR EACH ROW --语句级触发,即每一行触发一次
                BEGIN
                 INSERT INTO OLD_EMPLOYEE VALUES (:OLD.ID, :OLD.NAME, :OLD.AGE, :OLD.SEX); --:old代表旧值
                END;
                
                --下面进行测试
                DELETE employee;
                SELECT * FROM old_employee;
            6.创建触发器,利用视图插入数据
                --创建表
                CREATE TABLE tab1 (tid NUMBER(4) PRIMARY KEY,tname VARCHAR2(20),tage NUMBER(2));
                CREATE TABLE tab2 (tid NUMBER(4),ttel VARCHAR2(15),tadr VARCHAR2(30));
                --插入数据
                INSERT INTO tab1 VALUES(101,'zhao',22);
                INSERT INTO tab1 VALUES(102,'yang',20);
                INSERT INTO tab2 VALUES(101,'13761512841','AnHuiSuZhou');
                INSERT INTO tab2 VALUES(102,'13563258514','AnHuiSuZhou');
                --创建视图连接两张表
                CREATE OR REPLACE VIEW tab_view AS SELECT tab1.tid,tname,ttel,tadr FROM tab1,tab2 WHERE tab1.tid = tab2.tid;
                --创建触发器
                CREATE OR REPLACE TRIGGER TAB_TRIGGER
                 INSTEAD OF INSERT ON TAB_VIEW
                BEGIN
                 INSERT INTO TAB1 (TID, TNAME) VALUES (:NEW.TID, :NEW.TNAME);
                 INSERT INTO TAB2 (TTEL, TADR) VALUES (:NEW.TTEL, :NEW.TADR);
                END;
                /
                --现在就可以利用视图插入数据
                INSERT INTO tab_view VALUES(106,'ljq','13886681288','beijing');
                --查询
                SELECT * FROM tab_view;
                SELECT * FROM tab1;
                SELECT * FROM tab2;
            7.创建触发器,比较emp表中更新的工资
                create or replace trigger testtrigger
                before update on emp
                for each row
                  declare
                  
                  begin
                    if:old.sal>:new.sal then
                    dbms_output.put_line('工资减少');
                    elsif :old.sal<:new.sal then
                     dbms_output.put_line('工资增加');
                     else
                       dbms_output.put_line('工资未作任何变动');
                       end if;
                       DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.SAL);
                        DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.SAL);
                  end;
            8.创建触发器,将操作create、drop存储再log_info表中
                --创建表
                CREATE TABLE log_info(
                  manager_user VARCHAR2(15),
                  manager_date VARCHAR2(15),
                  manager_type VARCHAR2(15),
                  obj_name   VARCHAR2(15),
                  obj_type   VARCHAR2(15)
                );
                --创建触发器
                set serveroutput on;
                CREATE OR REPLACE TRIGGER TRIG_LOG_INFO
                 AFTER CREATE OR DROP ON SCHEMA
                BEGIN
                 INSERT INTO LOG_INFO
                 VALUES
                  (USER,
                   SYSDATE,
                   SYS.DICTIONARY_OBJ_NAME,
                   SYS.DICTIONARY_OBJ_OWNER,
                   SYS.DICTIONARY_OBJ_TYPE);
                END;
                
                --测试语句
                CREATE TABLE a(id NUMBER);
                CREATE TYPE aa AS OBJECT(id NUMBER);
                DROP TABLE a;
                DROP TYPE aa;
                --查看效果
                SELECT * FROM log_info;
                --相关数据字典-----------------------------------------------------
                SELECT * FROM USER_TRIGGERS;
                --必须以DBA身份登陆才能使用此数据字典
                SELECT * FROM ALL_TRIGGERS;SELECT * FROM DBA_TRIGGERS;
                --启用和禁用
                ALTER TRIGGER trigger_name DISABLE;
                ALTER TRIGGER trigger_name ENABLE;
 

猜你喜欢

转载自blog.csdn.net/weixin_39892293/article/details/85282171