The trigger of ORACLE learning

This article introduces

Triggers are special stored procedures that monitor
operations after adding, deleting, and modifying statements.

Application scenarios

1. Complex security check
2. Data confirmation
3. Data audit function
4. Complete data backup and synchronization

Trigger Syntax

code example

CREATE OR REPLACE TRIGGER tr_hyz_dept
  AFTER INSERT OR DELETE OR UPDATE ON hyz_dept
DECLARE

BEGIN
  IF inserting THEN
    dbms_output.put_line('插入成功');
  ELSIF updating THEN
    dbms_output.put_line('更新成功');
  ELSIF deleting THEN
    dbms_output.put_line('删除成功');
  END IF;
END;
--测试监听器
insert into hyz_dept (DEPTNO, DNAME, LOC)
values (70, '运动员', '浙江');
delete hyz_dept s where s.deptno='70';
commit;

result:

trigger type

Example of complex security check code

--禁止hyz_dept表在21点前插入数据
CREATE OR REPLACE TRIGGER tr_hyz_dept
  AFTER INSERT OR DELETE OR UPDATE ON hyz_dept
DECLARE

BEGIN
  IF to_char(SYSDATE, 'hh24') <= 21 THEN
    ROLLBACK;
    raise_application_error(-20900, '禁止21点前插入数据');
  END IF;
END;
INSERT INTO hyz_dept (deptno, dname, loc) VALUES (70, '运动员', '浙江');
output result

Data confirmation code example

CREATE OR REPLACE TRIGGER tr_hyz_dept
  AFTER UPDATE ON hyz_dept
  FOR EACH ROW
DECLARE

BEGIN
  IF :new.dname = :old.dname THEN
    ROLLBACK;
    raise_application_error(-20901, '修改无效,没有发生变化');
  END IF;
  dbms_output.put_line('原数据:' || :old.dname || ',现数据:' || :new.dname);
END;
--测试
UPDATE hyz_dept s SET s.dname = '会计' WHERE s.deptno = '10';
output result

Data audit function code example

CREATE OR REPLACE TRIGGER tr_hyz_emp
  AFTER UPDATE ON hyz_emp
  FOR EACH ROW
DECLARE
  max_hisal NUMBER;
BEGIN
  SELECT MAX(s.hisal) INTO max_hisal FROM hyz_salgrade s;

  IF :new.sal >= max_hisal THEN
    INSERT INTO hyz_salgrade
      (grade, losal, hisal)
    VALUES
      ('6', '9999', '99999');
  END IF;
  dbms_output.put_line('原数据:' || :old.sal || ',现数据:' || :new.sal || ',最大值' ||
                       max_hisal);
END;
--测试
select * from hyz_emp s where s.empno='4418';
update hyz_emp s set s.sal=10000  where s.empno='4418';
commit;
select * from hyz_salgrade;
output result

Complete data backup and synchronization code example

SQL> grant select any table to erciyuan;
SQL> grant insert any table to erciyuan;
CREATE OR REPLACE TRIGGER tr_hyz_dept
  AFTER INSERT OR DELETE OR UPDATE ON hyz_dept
DECLARE

BEGIN
  INSERT INTO scott.dept
    SELECT s.deptno, s.dname, s.loc
      FROM hyz_dept s
     WHERE NOT EXISTS
     (SELECT o.deptno FROM scott.dept o WHERE s.deptno = o.deptno);
END;
--测试
insert into hyz_dept (DEPTNO, DNAME, LOC)
values (70, '运动员', '浙江');
select * from scott.dept;--查询结果,原scott.dept并没有50,60,70

output result

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326001284&siteId=291194637