【问题标题】:How can I test a trigger that generates primary keys?如何测试生成主键的触发器?
【发布时间】:2014-05-04 14:36:50
【问题描述】:

CREATE SEQUENCE EVALUATIONS_SEQ
  INCREMENT BY 1
  START WITH 1 ORDER;

CREATE OR REPLACE TRIGGER NEW_EVALUATION_TRIGGER
  BEFORE INSERT ON angajati
  FOR EACH ROW
  BEGIN
    :NEW.id_angajat := evaluations_seq.NEXTVAL
  END;

如何测试这个触发器?

【问题讨论】:

  • 我的第一个想法:向表中插入行,看看主键是否递增。
  • 我试过这个:插入到 angajati(nume) values('marius');并收到此错误:ORA-04098: trigger 'BDD23.NEW_EVALUATION_TRIGGER' is invalid and failed re-validation
  • 您使用的是哪个 Oracle 版本? (select * from v$version)
  • 你好,我正在使用 apex.oracle.com ,即 sql 研讨会。 Oracle Database 11g 企业版版本 11.2.0.3.0 - 64 位生产 PL/SQL 版本 11.2.0.3.0 - 生产 CORE 11.2.0.3.0 适用于 Linux 的生产 TNS:版本 11.2.0.3.0 - 生产 NLSRTL 版本 11.2.0.3。 0 - 生产

标签: sql database oracle plsql oracle-apex


【解决方案1】:

当我在 Oracle 中编写触发器以创建自动递增值时,我使用以下语法:

select evaluations_seq.NEXTVAL into :NEW.id_angajat from dual;

我没有使用直接分配。试试这个,看看能不能解决问题。

(我也非常感谢他们最终将此功能直接放入语言中,因此 Oracle 12 中不需要触发器,只需 create table 中的 default 语句。)

【讨论】:

  • ORA-02290:违反检查约束 (BDD23.ANG_EMAIL_NN)。当我尝试这个时得到这个错误:插入到 angajati(nume,id_functie) values('marius','IT_PROG');
  • @mariusxd 。 . . (1) 您不应该在已经有数据的表上执行此操作。 (2) 编辑您的问题并包括表上的约束以及列定义。
  • 我添加了约束。我尝试使用另一个插入:插入 angajati(nume,email,id_functie,data_angajare,salariul) values('marius','dada','ff','06/17/1987',20000);.. 我得到了此错误:ORA-02291: 违反完整性约束 (BDD23.ANG_FUNCTIE_FK) - 未找到父密钥
  • 我猜是因为该表有 2 个主键,我尝试了另一个表并且它有效。感谢所有的答案,虽然
  • @mariusxd 没有表可以有 2 个主键。我猜你的意思是复合主键,由 2 列组成。
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多