2011-09-01 97 views
0

以下SQL在Oracle 9i服務器上執行時產生錯誤「ORA-04098:觸發器」DBO.WTF_TRIGGER'無效且重新驗證失敗「。Oracle 9i自動增量觸發器/序列不起作用

DROP TABLE "DBO".WTF; 

CREATE TABLE "DBO".WTF 
(id NUMBER PRIMARY KEY, 
name VARCHAR2(30)); 

CREATE SEQUENCE "DBO".WTF_sequence 
START WITH 1 
INCREMENT BY 1; 

CREATE OR REPLACE TRIGGER "DBO".WTF_trigger 
BEFORE INSERT 
ON "DBO".WTF 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
SELECT "DBO".WTF_sequence.nextval INTO :NEW.id FROM dual; 
END; 

INSERT INTO "DBO".WTF (name) VALUES ('asd'); 

任何想法?

+2

如果您運行sql * plus命令SHOW ERRORS,它會告訴您什麼語法錯誤或其他問題阻止您的觸發器編譯。 – APC

回答

3

正如APC指出的那樣,在SQL * Plus中執行SHOW ERRORS來打印出錯將會很有幫助。如果我創建具有相應權限的DBO用戶,您發佈的代碼完全適合我。

SQL> conn/as sysdba 
Connected. 
SQL> create user dbo identified by dbo; 

User created. 

SQL> grant connect, resource, unlimited tablespace to dbo; 

Grant succeeded. 

SQL> conn dbo/dbo 
Connected. 
SQL> DROP TABLE "DBO".WTF; 
DROP TABLE "DBO".WTF 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> 
SQL> CREATE TABLE "DBO".WTF 
    2 (id NUMBER PRIMARY KEY, 
    3 name VARCHAR2(30)); 

Table created. 

SQL> 
SQL> CREATE SEQUENCE "DBO".WTF_sequence 
    2 START WITH 1 
    3 INCREMENT BY 1; 

Sequence created. 

SQL> 
SQL> CREATE OR REPLACE TRIGGER "DBO".WTF_trigger 
    2 BEFORE INSERT 
    3 ON "DBO".WTF 
    4 REFERENCING NEW AS NEW 
    5 FOR EACH ROW 
    6 BEGIN 
    7 SELECT "DBO".WTF_sequence.nextval INTO :NEW.id FROM dual; 
    8 END; 
    9/

Trigger created. 

SQL> INSERT INTO "DBO".WTF (name) VALUES ('asd'); 

1 row created. 

SQL> select * from wtf; 

     ID NAME 
---------- ------------------------------ 
     1 asd