我为 Oracle 的 HR 示例数据库中的 Jobs 表定义了一个简单的触发器。我正在 Oracle SQL Developer 中测试它。
set serveroutput on;
create or replace trigger insertjob
before insert on jobs
begin
dbms_output.put_line(' Hello!');
end;
然后我故意插入一行失败,比如
INSERT INTO jobs(job_id, job_title, min_salary, max_salary) VALUES('IT_TEST', 6000, 12000);
控制台输出为:
INSERT INTO jobs(job_id, job_title, min_salary, max_salary) VALUES('IT_TEST', 6000, 12000)
Error at Command Line : 26 Column : 61
Error report -
SQL Error: ORA-00947: not enough values
00947. 00000 - "not enough values"
*Cause:
*Action:
但是在插入之前没有扣动扳机。我期待着看到“你好!”的消息。就在错误之前,因为无论插入操作成功还是失败,触发器都应该触发,但那并没有发生! 有谁知道为什么吗?
最诚挚的问候, 索林
您正在使用:
INSERT INTO jobs(
job_id, job_title, min_salary, max_salary
)VALUES(
'IT_TEST', 6000, 12000 -- nothing for the 4th column
);
您已指定要
INSERT
分为 4 列,但仅提供了 3 个值。您的查询在语法上无效,因此不会执行。您的触发器没有任何问题 - 它只是没有运行,因为您的 INSERT
语句无效并且没有被执行,所以没有任何东西触发 TRIGGER
。
要修复此问题,请向
INSERT
提供第四个值:
INSERT INTO jobs(
job_id, job_title, min_salary, max_salary
)VALUES(
'job_id', 'IT_TEST', 6000, 12000
);
或者如果您想插入默认值,请使用
DEFAULT
:
INSERT INTO jobs(
job_id, job_title, min_salary, max_salary
)VALUES(
DEFAULT, 'IT_TEST', 6000, 12000
);
当您的查询在语法上有效时,SQL 引擎将执行它并且触发器将触发。