• oracle 触发器


    需求如下:

    公司内部开发人员没有形成统一规范,开发各种的系统,采用不同的用户表清单,现在为方便用户,将各系统用户表信息进行统一。

    解决方案如下:

    1.初始时,采用存储过程做成一个计划任务,每天定时更新。

     1 CREATE OR REPLACE PROCEDURE "UPDATE_DDCM_USERS" AS
     2 
     3   sEmpno         VARCHAR2(20) default '';
     4   sDept          VARCHAR2(40) default '';
     5   sFName         VARCHAR2(20) DEFAULT '';
     6   sLName         VARCHAR2(20) DEFAULT '';
     7   sFLName        VARCHAR2(20) DEFAULT '';
     8   sEmail         VARCHAR2(20) DEFAULT '';
     9   sPassword      VARCHAR2(20) DEFAULT '';
    10   sRETDT         VARCHAR2(20) DEFAULT '';
    11   iusercnt1     number;
    12 
    13   CURSOR USER IS  
    14     SELECT EMP_NO,
    15            E_PASS,
    16            F_NM,
    17            L_NM,
    18            C_NM,
    19            E_MAIL,
    20            DEPT_NM,
    21            RETDT 
    22       FROM SFMG.USERLIST;   
    23 
    24 BEGIN
    25     FOR X in USER LOOP
    26     
    27     sEmpno     := X.EMP_NO;
    28     sDept      := X.DEPT_NM; 
    29     sFName     := X.F_NM;
    30     sLName     := X.L_NM;
    31     sFLName    := X.C_NM;
    32     sEmail     := SUBSTR(X.E_MAIL, 0, INSTR(X.E_MAIL, '@')-1);
    33     sPassword  := X.E_PASS;
    34     sRETDT     := X.RETDT;
    35   
    36     begin
    37       select count(*) into iusercnt1 from USER_LIST where EMP_NO = sEmpno;
    38     EXCEPTION
    39       WHEN no_data_found THEN
    40         iusercnt1 := 0;
    41     end;
    42 
    43        IF iusercnt1 = 0 THEN
    44       INSERT INTO USER_LIST
    45       VALUES
    46         (sEmpno,
    47          sDept,
    48          sFName,
    49          sLName,
    50          sFLName,
    51          sEmail,
    52          sPassword,
    53          ''
    54         );
    55     ELSE
    56       IF sRETDT = '00000000' THEN
    57         UPDATE USER_LIST SET DEPT_NM= sDept,F_NM = sFName,L_NM = sLName,FL_NM = sFLName,
    58                              E_MAIL = sEmail,E_PASS = sPassword,ADMIN_FLAG = ADMIN_FLAG
    59         where EMP_NO = sEmpno;
    60             END IF;
    61     END IF;
    62 
    63 END LOOP;
    64   COMMIT;
    65 EXCEPTION
    66   WHEN PROGRAM_ERROR THEN
    67     ROLLBACK WORK;
    68 END; 
    69 -- 复制用户清单从sfmg.userlist@whdb,应该做为计划任务执行。

    缺点:由于每天只是更新一次,用户变更信息后,没有及时更新。

    2.采用DML 行级触发器解决。

     1 create or replace trigger async_userlist
     2 after insert or update on sfmg.user_list
     3 for each row
     4 
     5 begin
     6      if INSERTING then
     7        insert into dcc.user_list (emp_no,dept_nm,f_nm,l_nm,e_mail,e_pass,admin_flag)
     8          values ( :new.empno,:new.dept_en,:new.name_cn,:new.name_en,substr(:new.email,0,instr(:new.email,'@')-1),:new.password,'');
     9      elsif updating then
    10        update dcc.user_list set dept_nm = :new.dept_cn,f_nm = :new.name_cn, l_nm = :new.name_en,
    11                                  e_mail = substr(:new.email,0,instr(:new.email,'@')-1) ,e_pass = :new.password
    12        where emp_no = :new.empno;
    13      end if;
    14 end async_userlist;

  • 相关阅读:
    SQL SERVER备份数据库存储过程.
    JMail组件使用中文文档
    Oracle,SQL Server,Access万能数据库通用类!
    快速幂的理解及使用
    关于地图坐标问题转换
    ref和依赖注入
    Unity3D 中的程序后台运行
    Unity中创建双面材质
    Unity3d 移动平台中文显示问题
    Unity3D 4.0中使用传统动画
  • 原文地址:https://www.cnblogs.com/sword88/p/3585815.html
Copyright © 2020-2023  润新知