无法弄清楚为啥触发器无效?
Posted
技术标签:
【中文标题】无法弄清楚为啥触发器无效?【英文标题】:Cant figure out why the Trigger is invalid?无法弄清楚为什么触发器无效? 【发布时间】:2013-03-18 20:13:19 【问题描述】:正在创建以下触发器,但在插入时出现错误“触发器无效并且重新验证失败”
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;
我错过了什么?
【问题讨论】:
如果手动编译会发生什么?另外,您是否在employee.department_id 值中插入了null? 不,我没有插入 Null 值。当我运行此查询时,我也没有看到任何错误 ALTER TRIGGER check_dept COMPILE; 是否存在您未在其中插入值的部门中缺少的非空列? 没有。两个非空列是我要插入的列。 尝试执行SELECT * FROM ALL_ERRORS WHERE NAME='CHECK_DEPT'
。是否返回任何行?
【参考方案1】:
假设您使用默认的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
架构,在这种情况下,您需要告诉我们您的表是什么看起来像。
【讨论】:
不,这是我正在运行的确切触发器,我正在使用默认的 hr 模式。我只更改了员工表以使除employee_id 和last_name 之外的所有列都可以为空,但我认为这不是这个触发器的问题。我已尝试删除此触发器并再次重新创建。【参考方案2】:也许您需要在代码末尾添加“COMMIT”。
【讨论】:
这是这个问题的有用答案。您不能在触发器中提交,并且 DDL(例如CREATE TRIGGER
)总是在 Oracle 中发出提交。【参考方案3】:
也许这是一个愚蠢的想法,但您是否有权访问触发器正在访问的视图或表?如果它是一个视图,那么也许必须添加一个授权。
【讨论】:
以上是关于无法弄清楚为啥触发器无效?的主要内容,如果未能解决你的问题,请参考以下文章