Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          序列、觸發器實例

          Posted on 2009-02-16 19:32 啥都寫點 閱讀(581) 評論(0)  編輯  收藏 所屬分類: DB

          想在項目中插入一個序列,對序列的概念以及用法有點模糊,通過查閱資料現在已經對在oracle中插入序列有了一定的了解:

          創建一個序列:

          create sequence SEQ_FileInfo_GW

          minvalue 100000000

          maxvalue 299999999

          start with 100000000

          increment by 1;

          當向表中插入數據時,SQL語句寫法如下:

          INSERT   INTO   my_table(id,...)   values(seq.NEXTVAL,...)


          觸發器應用場景:

                  1、強化約束

                  2、跟蹤變化

                  3、級聯運行

                  4、存儲過程的調用

          觸發器分類:

                  1、DML觸發器

                  2、INSTEAD OF觸發器

                  3、系統觸發器


          --demo

          --創建一個語句級觸發器,不允許用戶在“星期日”使用emp表。

          CREATE OR REPLACE TRIGGER not_sunday

          BEFORE INSERT OR UPDATE OR DELETE ON emp

          BEGIN

           IF rtrim(to_char(SYSDATE,'day'))='SUNDAY' THEN

              raise_application_error(-20333,'Sorry!Not on Sundays');

           END IF;

          END;

          --demo

          --創建一個行級觸發器,將從emp表中刪除的記錄輸入到ret_emp表中

          --step1

          CREATE TABLE ret_emp AS SELECT * FROM emp;

          --step1

          CREATE OR REPLACE TRIGGER emp_retire

          BEFORE DELETE ON emp

          FOR EACH ROW

          BEGIN

           INSERT INTO ret_emp VALUES (:OLD.empno,:OLD.ename,:OLD.job,:OLD.mgr,:OLD.hiredate,:OLD.sal,:OLD.comm,:OLD.deptno);

          END;

          --demo

          --創建一個行級觸發器,停止用戶刪除'president'的記錄。

          CREATE OR REPLACE TRIGGER not_president

          BEFORE DELETE ON emp

          FOR EACH ROW

          WHEN (old.job='PRESIDENT')

          BEGIN

           raise_application_error(-20444,'CANNOT DELETE PRESIDENTS RECORD');

          END;

          --demo

          --創建instead of觸發器,通過視圖添加數據。

          --step1

          create or replace view v_deptemp

          as

           select dept.deptno,dept.dname,

                   emp.empno,emp.ename

           from dept,emp

           where dept.deptno = emp.deptno;

           

          --step2 

          insert into v_deptemp values(90,'dept',9001,'emp');

          --step3 

          create or replace trigger tr_i_deptemp

          instead of insert on v_deptemp

          for each row

          declare

           v_num number;

          begin

           

           select count(*) into v_num

           from dept where deptno = :new.deptno;

           if v_num = 0 then

             insert into dept(deptno,dname)

             values(:new.deptno,:new.dname);

           end if;

             

           select count(*) into v_num

           from emp where empno = :new.empno;

           if v_num = 0 then

             insert into emp(empno,ename)

             values(:new.empno,:new.ename);

           end if;

             

          end; 

          --step4 

          insert into v_deptemp values(90,'dept',9001,'emp');

          --demo

          --創建DDL觸發器

          --step1

          create table tmp

          ( tid number,

           tdesc varchar2(20)

          );

          --step2

          create or replace trigger ddlschema

          after create or drop or alter on schema

          begin

           insert into tmp values(1,'create');

          end;

          --demo

          --創建DDL觸發器

          --step1

          grant administer database trigger to scott;

          --step2

          create or replace trigger loguser

          after logon on schema

          begin

           insert into tmp values(1,'user log');

          end;

          --step3

          create or replace trigger logalluser

          after logon on database

          begin

           insert into scott.tmp values(2,'user all log');

          end;



                                                                                                                 --    學海無涯
                  


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大连市| 工布江达县| 安仁县| 和硕县| 吐鲁番市| 太白县| 海阳市| 马尔康县| 仙游县| 三江| 化州市| 彰化县| 大渡口区| 桂林市| 股票| 娱乐| 吐鲁番市| 东乡族自治县| 田林县| 自贡市| 密云县| 安徽省| 上饶市| 永康市| 西青区| 伽师县| 大方县| 鲁山县| 鄂伦春自治旗| 望城县| 白银市| 定边县| 大石桥市| 庆阳市| 临澧县| 西乌| 瑞金市| 搜索| 四子王旗| 潜江市| 山阴县|