Oracle 序列,触发器

--序列是什么
--序列就是按照一定的规则,不断增长(不断减少)的一个数字 ,用于我们数据库表里 作为数据的一个唯一标识。

--序列的语法
--创建序列
CREATE SEQUENCE SEQ_OBJID   --创建一个名称为SEQ_OBJID 的序列
INCREMENT BY 1              --每次增长1  (1,2,3,4,5,6,7,)
START WITH 1                --以1为起点
MAXVALUE  20                --以20为终点
--MINVALUE 1
CYCLE                        --当序列达到最大值时,循环 no cycle就是不循环
CACHE 10                     --cache的意思就是把序列预先放入内存,不会频繁的进行提交事务。

--怎么用序列
SELECT SEQ_OBJID.NEXTVAL FROM DUAL;


CREATE SEQUENCE SEQ_OBJID   --创建一个名称为SEQ_OBJID 的序列
INCREMENT BY 1              --每次增长1  (1,2,3,4,5,6,7,)
START WITH 1000000000
MAXVALUE  9999999999
--MINVALUE 1
NOCYCLE                        --当序列达到最大值时,循环 no cycle就是不循环
CACHE 2000


--删除序列
DROP SEQUENCE SEQ_OBJID;

--修改序列   除了不能修改序列的起始值,其他的都可以修改

ALTER SEQUENCE SEQ_OBJID
INCREMENT BY 10
MAXVALUE 8888888
NOCYCLE
CACHE 1000

--查看序列
SELECT * FROM USER_SEQUENCES;
SELECT * FROM ALL_SEQUENCES;

--触发器
--触发器就是类似于js里面的监听器,用来监视数据库的各种操作,
--当某个操作发生时引起触发器回应做相应的其他数据库操作。

--触发器的类型
--DML触发器     、
--在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
--替代触发器
--由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。
--所以给出了替代触发器。它就是专门为进行视图操作的一种处理方法。
--系统触发器
--它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

--触发器怎么用
--触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
--语法:
CREATE OR REPLACE TRIGGER TREIGGER_NAME
BEFORE/AFTER   --之前/之后
INSERT/UPDATE/DELETE  --插入/更新/删除
ON X_TABLE            --对哪个表
--做些啥(触发)
DECLARE
BEGIN
END;

CREATE OR REPLACE TRIGGER TEST_TRIGGER
BEFORE INSERT OR UPDATE OR DELETE
ON EMP
BEGIN
  IF USER NOT IN('SYS','SYSTEM') THEN
      RAISE_APPLICATION_ERROR(-20000,'您没有权限对t_test执行insert|update|delete操作.');
  END IF;
END;
UPDATE EMP SET SAL = '10000' WHERE DEPTNO = 10;
--删除触发器
DROP TRIGGER  TEST_TRIGGER

--触发器主要应用在这几个方面
--a:删除操作时写日志   或者要满足特定的一些条件才能删除数据
DROP TABLE T_EMP;
CREATE TABLE T_EMP AS SELECT * FROM EMP;
SELECT * FROM T_EMP;

--建立一个简单的日志记录表
--先创建记录信息表
CREATE TABLE DELETEEMP_LOG(
       DELETE_USER VARCHAR2(40),
       DELETE_DATE DATE
);
SELECT * FROM DELETEEMP_LOG;

CREATE OR REPLACE TRIGGER DELETE_EMP_TRIGGER
BEFORE DELETE
ON T_EMP
BEGIN
  INSERT INTO DELETEEMP_LOG(DELETE_USER,DELETE_DATE)VALUES(USER,SYSDATE);
END;

DELETE FROM T_EMP WHERE ENAME = 'SMITH';

--b:增加记录时触发检查数据的完整性和正确性等程序
CREATE OR REPLACE TRIGGER DELETE_EMP_TRIGGER
BEFORE INSERT
ON T_EMP
FOR EACH ROW  --对每行数据有效 行级触发器
BEGIN
   IF :NEW.SAL<0 THEN
      :NEW.SAL :=0;
   END IF;
   IF :NEW.DEPTNO > 30 THEN
       :NEW.DEPTNO :=10;
   END IF;
END;

INSERT INTO T_EMP (EMPNO,ENAME,SAL,DEPTNO)VALUES(1,'KEVEN',-1000,40);
SELECT * FROM T_EMP;
--c:修改记录时触发其他程序
--写修改档案的日志 (oldvalue->newvalue)
CREATE OR REPLACE TRIGGER UPDATE_EMP_TRIGGER
BEFORE UPDATE
ON T_EMP
FOR EACH ROW
BEGIN
    IF :OLD.ENAME <> :NEW.ENAME THEN
      DBMS_OUTPUT.PUT_LINE('ENAME的值由'||:OLD.ENAME||'更改为'||:NEW.ENAME);
    END IF;
    IF :OLD.JOB <> :NEW.JOB THEN
      DBMS_OUTPUT.PUT_LINE('ENAME的值由'||:OLD.JOB||'更改为'||:NEW.JOB);
    END IF;
    IF :OLD.SAL <> :NEW.SAL THEN
      DBMS_OUTPUT.PUT_LINE('ENAME的值由'||:OLD.SAL||'更改为'||:NEW.SAL);
    END IF;
    ---插入日志表
END;

UPDATE T_EMP SET ENAME= 'SMITHS',JOB='MANAGER',SAL=3000 WHERE EMPNO = 7369;






猜你喜欢

转载自blog.csdn.net/mao502010435/article/details/81538880