日期:2014-05-17  浏览次数:20973 次

触发器的问题
有一个表 tablea 有一个字段 sts .
表 table_log 日值表
现在我想写一个触发器实现一下功能:
1 sts 不能 从'Y' 改为 'N'
2 记录下来是那个ip的用户在做这个操作(把'Y' 改为 'N').

我的程序如下:
  if :old.sts = 'Y' and :new.sts='N' then
  insert into table_log
  values (SYS_CONTEXT('USERENV','IP_ADDRESS'));
   
  raise_application_error(-20004,'不能把Y改成N');
  
  end if ;

但是我测试后发现实现不了以上功能..
请教大侠们该如何实现...



------解决方案--------------------
一、table_log表只有一个字段?如果是同一个IP地址的机器改了STS的值,第一次INSERT可以成功,那第二次INSERT不是主键重复?
二、最好先DECLARE一个VARCHAR2变量internet_ip,然后在触发器里写
select sys_context('userenv','ip_address') into internet_ip from dual; 
insert into table_log values (internet_ip);
 


------解决方案--------------------
上面的语句好像没什么问题,你再看看你的触发器是否正确创建?是哪种触发器(行级,表级?)
如果是表级的话就不行了!!
------解决方案--------------------
要用instead of 触发器!!
create or replace trigger tri_spjk_table 
instead of update on tablea for each row

------解决方案--------------------
再修改一下:
create or replace trigger tri_spjk_table
instead of update of sts on tablea for each row 

------解决方案--------------------
那就创建个图视!!
要实现 1 sts 不能 从 'Y ' 改为 'N 
可以
(1)用instead of 触发器!
(2)在触发器中再把sts值改为'Y'
我知道的只有以上两种,不知道还有什么别的方法?