oracle数据库触发器使用 trigger

1.

//更新前触发,不允许周日修改

create or replace trigger auth_secure before insert or update or DELETE

on tb_emp

begin

  IF(to_char(sysdate,'DY')='星期日') THEN

    RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表tb_emp');

  END IF;

END;

2.

//自增序列

CREATE OR REPLACE TRIGGER MY_TGR

 BEFORE INSERT ON TAB_USER

 FOR EACH ROW--对表的每一行触发器执行一次

DECLARE

 NEXT_ID NUMBER;

BEGIN

 SELECT MY_SEQ.NEXTVAL INTO NEXT_ID FROM DUAL;

 :NEW.ID := NEXT_ID; --:NEW表示新插入的那条记录

END;

3.

//DML时,记录日志

--创建触发器

CREATE OR REPLACE TRIGGER TEST_TRIGGER

 AFTER DELETE OR INSERT OR UPDATE ON TEST

DECLARE

 V_TYPE TEST_LOG.L_TYPE%TYPE;

BEGIN

 IF INSERTING THEN

  --INSERT触发

  V_TYPE := 'INSERT';

  DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');

 ELSIF UPDATING THEN

  --UPDATE触发

  V_TYPE := 'UPDATE';

  DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');

 ELSIF DELETING THEN

  --DELETE触发

  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')); --USER表示当前用户名

END;

4.

//创建触发器,它将映射emp表中每个部门的总人数和总工资

--创建映射表

CREATE TABLE dept_sal AS

SELECT deptno, COUNT(empno) total_emp, SUM(sal) total_sal

FROM scott.emp

GROUP BY deptno;

--创建触发器

CREATE OR REPLACE TRIGGER EMP_INFO

 AFTER INSERT OR UPDATE OR DELETE ON scott.EMP

DECLARE

 CURSOR CUR_EMP IS

  SELECT DEPTNO, COUNT(EMPNO) AS TOTAL_EMP, SUM(SAL) AS TOTAL_SAL FROM scott.EMP GROUP BY DEPTNO;

BEGIN

 DELETE DEPT_SAL; --触发时首先删除映射表信息

 FOR V_EMP IN CUR_EMP LOOP

  --DBMS_OUTPUT.PUT_LINE(v_emp.deptno || v_emp.total_emp || v_emp.total_sal);

  --插入数据

  INSERT INTO DEPT_SAL

  VALUES

   (V_EMP.DEPTNO, V_EMP.TOTAL_EMP, V_EMP.TOTAL_SAL);

 END LOOP;

END;

--对emp表进行DML操作

INSERT INTO emp(empno,deptno,sal) VALUES('123','10',10000);

SELECT * FROM dept_sal;

DELETE EMP WHERE empno=123;

SELECT * FROM dept_sal;

猜你喜欢

转载自blog.csdn.net/miluli1/article/details/82898526
今日推荐