2017-09-04 21 views
-1

に失敗した私はORA-04098:トリガーが無効であると私は私がここデシベル</p> <p>でいくつかのデータを挿入しようとトリガーとのトラブルを抱えている再検証

INSERT INTO login (login, senha) VALUES ('admin', 'admin') 
を挿入しようとしているデータであり、

エラー

ORA-04098: trigger 'HOTEL.bi_login' is invalid and failed re-validation 

テーブル及び配列

CREATE TABLE login(idLogin NUMBER(5), login VARCHAR2(50) UNIQUE, SENHA VARCHAR2(50), CONSTRAINT idLogin_pk PRIMARY KEY (idLogin)); 
CREATE sequence "login_seq"; 

そしてTriger

CREATE trigger "bi_login" 
    before insert on login 
    for each row 
    DECLARE 
    qntdRows DATATYPE 
BEGIN 
    select "login_seq".nextval 
    INTO qntdRows 
    FROM dual; 
    :NEW.idLogin = qntdRows 
END; 
+2

':NEW.idLogin = qntdRows'の後にセミコロンがない。作成トリガステートメントを実行した直後に、 'show errors'を実行して、トリガがコンパイルされているかどうかを確認してください。ヒント: 'CREATE TRIGGER ...'の代わりに 'CREATE OR REPLACE TRIGGER ...'コマンドを使用してください。別の1つ: 'qntdRows DATATYPE'の後ろにセミコロンがありません。 – krokodilko

+1

さらに、このより良い 'qntdRows:= login_seq.nextval;'を代わりに '' dual ''と併用する –

+0

また、どんなデータ型でも 'DATATYPE'ですか? – APC

答えて

0

セミコロンのカップルが欠落していて、変数の宣言はNUMBERである必要があります。

正しいコード下記参照してください。

CREATE OR REPLACE trigger "bi_login" 
    before insert on login 
    for each row 
DECLARE 
    qntdRows number; 
BEGIN 
    select "login_seq".nextval 
    INTO qntdRows 
    FROM dual; 
    :NEW.idLogin := qntdRows; 
END; 

上記のあなたの無効なトリガーを交換し、エラーなしでコンパイルされます!

さらに、あなたは以下の代替コードと同じ達成することができます:

CREATE OR REPLACE trigger "bi_login" 
    before insert on login 
    for each row 
BEGIN 
    :NEW.idLogin := "login_seq".nextval; 
END; 

Successful Compilation Screenshot

私はそれは、よりシンプルでエレガント:)

テッド見つけます。

+0

送信したこの2つのトリガーを使用しようとしましたが、テーブルに挿入しようとするとエラーが発生します。 –

+0

ORA-00001:ユニーク制約違反が発生していませんか? –

0

私はExDevの2番目のソリューションとその動作をうまくテストしました。

エラー状態で同時にトリガーされる他のトリガーを作成したため、おそらく機能しませんでした。したがって、挿入しようとすると、それらが実行され、それらのためにエラーが発生します。

解決方法:過去に作成された他のトリガをエラー状態で試して削除するようにしてください。その後、ExDevによって提案されたソリューションを試してください。

関連する問題

 関連する問題