--建表 
create table users( 
  id NUMBER(5) PRIMARY KEY, 
  username varchar2(20) not  null, 
  password varchar2(20), 
  email varchar2(20) 
); 
--建序列 
CREATE SEQUENCE users_seq 
  MINVALUE 1 
  MAXVALUE 9999999999 
  START WITH 1 
  INCREMENT BY 1 
  CACHE 30 
  ORDER; 
--建触発器 
  CREATE OR REPLACE TRIGGER users_tg 
  BEFORE INSERT ON users 
  FOR EACH ROW 
  BEGIN 
  SELECT users_seq.NEXTVAL INTO :NEW.id FROM DUAL; 
  END;  
--執行 
insert into users (id,username,password,email) values(users_seq.NEXTVAL,'www','123','[email protected]'); select * from users; 
到执行插入语句时提示:ORA-04098触发器"TEST1.USERS_TG"无效且未通过重新验证
请问要怎么改?

解决方案 »

  1.   

    --建表 
    create table users( 
      id NUMBER(5) PRIMARY KEY, 
      username varchar2(20) not  null, 
      password varchar2(20), 
      email varchar2(20) 
    ); 
    --建序列 
    CREATE SEQUENCE users_seq 
    MINVALUE 1 
    MAXVALUE 9999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 30 
    ORDER; 
    --建触発器 
    CREATE OR REPLACE TRIGGER users_tg 
    BEFORE INSERT ON users 
    FOR EACH ROW 
    BEGIN 
    SELECT users_seq.NEXTVAL INTO :NEW.id FROM DUAL; 
    END;  
    --執行 
    insert into users (id,username,password,email) values(users_seq.NEXTVAL,'www','123','[email protected]'); --执行结果
    id 为2我这里没有问题,检查一下你得触发器有没有启用
      

  2.   

    你应该这样用要不然你得触发器没起到什么作用,作用就是获得插入序号的下一个序号
    insert into users (username,password,email) values('www','123','[email protected]');
      

  3.   

     这样检查一下你得触发器有没有启用?select * from user_tigger where trigger_name='user_tg';结果是表或试图不存在
    我的这个触发器怎么启用?
      

  4.   

    你用pl/sql工具登录看看也可以select status from user_triggers where trigger_name=upper('user_tg');ENABLED --表示启用了
    DISABLED--表示未启用
      

  5.   

    晕,最终发现,里边居然是全角空格搞的鬼。你这个肯定是因为trigger创建出来有警告信息而你没有注意吧。 
    去掉之后, 没问题了: SQL> CREATE OR REPLACE TRIGGER users_tg 
      2  BEFORE INSERT ON users 
      3  FOR EACH ROW 
      4  BEGIN 
      5  SELECT users_seq.NEXTVAL INTO :NEW.id FROM DUAL; 
      6  END; 
      7  / 触发器已创建 SQL> drop trigger users_tg; 触发器已丢弃 SQL> insert into users (id,username,password,email) values(users_seq.NEXTVAL,'ww 
    w','123','[email protected]'); 已创建 1 行。 SQL> select * from users;         ID USERNAME            PASSWORD            EMAIL 
    ---------- -------------------- -------------------- -------------------- 
            2 www                  123                  [email protected] 
            4 www                  123                  [email protected] 
            5 www                  123                  [email protected] SQL> 
      

  6.   

    重新启动trigger。
    不过,这个trigger好像没什么作用。你的触发器是干什么的呀???