2

次のトリガーが作成されていますが、挿入時に「トリガーが無効であり、再検証に失敗しました」というエラーが表示されます

 create or replace trigger check_dept
BEFORE INSERT ON employees
FOR EACH ROW
DECLARE
c number(1);
BEGIN
 select count(*) INTO c from departments where departments.department_id=:new.department_id;

IF c = 0 THEN
insert into departments(department_id,department_name) values (:new.department_id,'others');
END IF;

END;

私は何が欠けていますか?

4

3 に答える 3

2

HRデフォルトのスキーマ を使用していると仮定すると、トリガーは問題なくコンパイルされます。

C:\Users\jcave>sqlplus hr/hr

SQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 18 16:55:42 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create or replace trigger check_dept
  2  BEFORE INSERT ON employees
  3  FOR EACH ROW
  4  DECLARE
  5  c number(1);
  6  BEGIN
  7   select count(*) INTO c from departments where departments.department_id=:new.department_id;
  8
  9  IF c = 0 THEN
 10  insert into departments(department_id,department_name) values (:new.department_id,'others');
 11  END IF;
 12
 13  END;
 14  /

Trigger created.


SQL> ed
Wrote file afiedt.buf

  1  insert into employees( employee_id, first_name, last_name, email, hire_date, job_id, department_id)
  2*    values( -1, 'Justin', 'Cave', 'foo@bar.com', sysdate, 'AC_ACCOUNT', 10 )
SQL> /

1 row created.

トリガーが無効な場合は、投稿したトリガーが実際にコンパイルしているトリガーと異なるものであるか、デフォルトのHRスキーマを使用していないかのいずれかです。この場合、テーブルがどのように見えるかをお知らせください。

于 2013-03-18T21:01:23.520 に答える
0

おそらく、コードの最後に「COMMIT」を追加する必要があります。

于 2013-03-18T21:48:32.353 に答える
0

ばかげた考えかもしれませんが、トリガーがアクセスしているビューまたはテーブルにアクセスできますか? ビューの場合は、おそらく許可を追加する必要があります。

于 2013-03-18T22:10:46.383 に答える