+ -
当前位置:首页 → 问答吧 → 在oracle的触发器里,怎么判断修改了某个表的某个字段为1的情况

在oracle的触发器里,怎么判断修改了某个表的某个字段为1的情况

时间:2011-12-21

来源:互联网

然后根据ELSIF UPDATING THEN里对修改字段的值为1和其它的修改情况分别向新表中插入不同的数据

作者: charlesxu   发布时间: 2011-12-21

IF :NEW.字段 = 1 THEN
  处理...



为了能够读取当前行改变前后各列的值,需要借助于行触发器定义的关联名。
OLD-修改之前的行
NEW-修改之后的行
对于INSERT语句只有NEW,而OLD没有意义
对于DELETE语句只有OLD,而NEW没有意义
如果是在PL/SQL块内访问关联名,则需要在关联名前加“:”,如同访问外部变量
如果在PL/SQL块外访问关联名,则不需要加“:”


作者: LuiseRADL   发布时间: 2011-12-21

额..你的描述 我没看清楚..不过基本就着这样了..
SQL code

CREATE OR REPLACE TRIGGER TRG_TEST
  AFTER UPDATE ON table1
  FOR EACH ROW

Begin
  IF(:new.XXX=1) then
     ....
  ELSE
    ...
  END IF;
End;

作者: zujinsheng   发布时间: 2011-12-21

SQL code

CREATE OR REPLACE TRIGGER TR_DML_TableAAA
AFTER INSERT OR DELETE OR UPDATE ON TableAAA
FOR EACH ROW
when new.account=1 //想这么加条件,但是对于把account修改成其它值的update也要插入值的
BEGIN
IF INSERTING THEN 
 INSERT INTO LOG
  values ('root',SYSDATE,'Other','AAAA-01-0001','修改用户操作成功【'||new.ACCOUNT||'',0); 
ELSIF UPDATING THEN
 INSERT INTO HANDLELOG 
  values ('root',SYSDATE,'Other','AAAA-01-0002','修改用户操作成功【'||new.ACCOUNT||'',0); 
ELSIF UPDATING THEN //应该在这加判断是否把account改成1
 INSERT INTO HANDLELOG 
  values ('root',SYSDATE,'Other','AAAA-01-0002','修改用户操作成功【'||111111||'',0); 
END IF;
END;

作者: charlesxu   发布时间: 2011-12-21

明白你的意思了,可是要怎么判断update时把:new.account改成1和其它情况呢?

  IF(:new.XXX=1) and updating then
  ....
  ELSEIf updating then
  ...
  ELSEIf inserting then
  ...
  ELSEIf deleting then
  ...
  END IF;

这样写行吗?



引用 2 楼 zujinsheng 的回复:

额..你的描述 我没看清楚..不过基本就着这样了..
SQL code

CREATE OR REPLACE TRIGGER TRG_TEST
AFTER UPDATE ON table1
FOR EACH ROW

Begin
IF(:new.XXX=1) then
....
ELSE
...
END IF;
End;

作者: charlesxu   发布时间: 2011-12-21

SQL code

  IF updating then
     IF :new.abcd = 1 then
        ...
     ELSE
        ...
     END IF; 
  ELSIF inserting then
  ...
  ELSIF deleting then
  ...
  END IF;





作者: forgetsam   发布时间: 2011-12-21

现在主要是对update时的情况做判断。因为删除数据时是逻辑删除,就是把account字段的值改为1,视作删除该记录。

所以在写触发器时要判断是修改记录的情况,还是做逻辑删除(也就是把account改为1)的情况,还是插入的情况

作者: charlesxu   发布时间: 2011-12-21

我在pl/sql里生成下面这个trigger,怎么有个红叉呢?是哪错了?

SQL code

CREATE OR REPLACE TRIGGER TR_DML_AAA
AFTER INSERT OR UPDATE ON tableAAA
FOR EACH ROW
BEGIN
IF INSERTING THEN 
 INSERT INTO HANDLELOG 
  values (SYSDATE,'Other','AAAA-01-0001','添加用户操作成功【'||:new.ACCOUNT||'',0); 
ELSIF UPDATING THEN
 IF (:new.USER_STATUS=2) THEN
   INSERT INTO HANDLELOG 
    values (SYSDATE,'Other','AAAA-01-0003','删除用户操作成功',0); 
 ELSE
   INSERT INTO HANDLELOG 
    values (SYSDATE,'Other','AAAA-01-0002','修改用户基本信息操作成功【'||:new.ACCOUNT||'',0); 
 END IF;    
END IF;  
END;


作者: charlesxu   发布时间: 2011-12-21

是不是SYSDATE不对,我这里是想取系统时间


  values (SYSDATE,'Other','AAAA-01-0001','添加用户操作成功【'||:new.ACCOUNT||'】',0); 

作者: charlesxu   发布时间: 2011-12-21

那就这样,主要是修改了AFTER,IF 判断就照5L的来
SQL code

CREATE OR REPLACE TRIGGER TRG_TEST
  AFTER UPDATE or INSERT or DELETE ON table1
  FOR EACH ROW

Begin
 IF updating then
     IF (:new.abcd = 1) then
        ...
     ELSE
        ...
     END IF; 
  ELSIF inserting then
  ...
  ELSIF deleting then
  ...
  END IF;

End;
  
  
  

引用 4 楼 charlesxu 的回复:

明白你的意思了,可是要怎么判断update时把:new.account改成1和其它情况呢?

IF(:new.XXX=1) and updating then
....
ELSEIf updating then
...
ELSEIf inserting then
...
ELSEIf deleting then
...
E……

作者: zujinsheng   发布时间: 2011-12-21

插入的字段是number(20)型的,怎么把date转换正number20,谢谢

作者: charlesxu   发布时间: 2011-12-21