----建表
create table buser

  USID            NUMBER(4) not null, 
  Account         VARCHAR2(20) not null, 
  Password        VARCHAR2(50) not null, 
  Role            NUMBER(4) not null, 
  PerferListCount NUMBER(4) DEFAULT 20 not null, 
  PRIMARY KEY (USID) 
);
----建序列
create sequence seq_buser 
start with 1 
minvalue 1 
maxvalue 9999
increment by 1;
----触发器
create trigger buser_tri 
before insert on buser
FOR EACH ROW
begin
:new.USID := seq_buser.nextval; 
end;
----执行语句
INSERT INTO buser (USID,Account,Password,Role,PerferListCount) VALUES (seq_buser.nextval, 'sysop', 'e544dd0728d06566a9cb26d4ad15e979', 0, 100);报错:ora-04098 触发器"TEST1.seq_buser"无效且未通过重新验证

解决方案 »

  1.   

    select status from user_triggers where trigger_name=upper('seq_buser');
    的查询结果是enable
      

  2.   

    :new.USID := seq_buser.nextval; 换成
    select seq_buser.nextval into :new.USID from dual;
      

  3.   


    你这样子的INSERT 那就可以不用触发器,直接用序列就好了!你这样子的话,USID 如果在触发的话,会增加两次!
    ----执行语句 
    INSERT INTO buser (Account,Password,Role,PerferListCount) VALUES ( 'sysop', 'e544dd0728d06566a9cb26d4ad15e979', 0, 100); 
    可以用这个语句来测试一下!
      

  4.   

    恩 LZ按楼上的方法改一下试试不过:new.USID := seq_buser.nextval;这样的写法好像也见过哦……
    记不清了
      

  5.   

    听说9i的不能直接这么写,序列值要在sql语句里产生