ORACLE11g автоинкремент - PullRequest
0 голосов
/ 08 июня 2019

Код ошибки 4098, состояние SQL 42000: ORA-04098: триггер 'HR.TRGM_ID' недействителен и не прошел повторную проверку

У меня возникает эта проблема.Что мне делать?

create table kids(
       id integer primary key, 
       mbrand varchar(100) , 
       mmodel varchar(100), 
       mprice integer,
       mquantity integer,
       mdescription varchar(100),
       mphoto varchar(100)
);

CREATE SEQUENCE  id_seq;

create trigger trgk_id
      before insert on kids
      for each row
    begin
      select id_seq.nextval
        into :new.id
        from dual;

Ответы [ 5 ]

2 голосов
/ 09 июня 2019

Проблема в том, что в вашем триггере отсутствует оператор END. Перепишите триггер как

create OR REPLACE trigger trgk_id
      before insert on kids
      for each row
    begin
      select id_seq.nextval
        into :new.id
        from dual;
END TRGK_ID;  -- added

и тебе должно быть хорошо.

dbfiddle здесь

2 голосов
/ 08 июня 2019

Кажется, что ты ничего не должен делать. Все работает нормально, что касается кода, который вы разместили (кроме того факта, что END отсутствует).

С другой стороны, Oracle жалуется на триггер с именем TRGM_ID, тогда как тот, чей код у нас есть, называется TRGK_ID. Мы говорим об одном и том же триггере?

SQL> create table kids(
  2         id integer primary key,
  3         mbrand varchar(100) ,
  4         mmodel varchar(100),
  5         mprice integer,
  6         mquantity integer,
  7         mdescription varchar(100),
  8         mphoto varchar(100)
  9  );

Table created.

SQL> CREATE SEQUENCE  id_seq;

Sequence created.

SQL> create trigger trgk_id
  2    before insert on kids
  3    for each row
  4  begin
  5    select id_seq.nextval
  6      into :new.id
  7      from dual;
  8  end;
  9  /

Trigger created.

SQL> insert into kids (mbrand) values ('Nike');

1 row created.

SQL> select id, mbrand from kids;

        ID MBRAND
---------- ----------
         1 Nike

SQL>
1 голос
/ 09 июня 2019

Для Oracle11g нет необходимости использовать currval и nextval псевдоколонки в операторе SQL-запроса, скорее их можно использовать в выражении PL / SQL.

Поэтому избегайте использования:

  select id_seq.nextval
    into :new.id
    from dual;

и используйте вместо него

:new.id := id_seq.nextval;

.

PS Конечно, выполните вышеуказанные действия после полного заполнения основногопроблема добавления предложения end в конце триггера.

0 голосов
/ 09 июня 2019

Если вы используете Oracle 12c или новее, вы можете использовать столбец идентификаторов вместо того, чтобы вручную создавать последовательность и триггер. Гораздо чище:

create table kids(
       id integer generated always as identity primary key,
       mbrand varchar(100) , 
       mmodel varchar(100), 
       mprice integer,
       mquantity integer,
       mdescription varchar(100),
       mphoto varchar(100)
);

https://oracle -base.com / статьи / 12c / тождественные-колонки-в-оракула-12cr1

0 голосов
/ 08 июня 2019

В сообщении об ошибке указано «TRGM_ID» (с «m»):

Error code 4098, SQL state 42000: ORA-04098: trigger 'HR.TRGM_ID' is invalid and failed re-validation

В вашем коде написано «TRGK_ID» (с «k»):

create trigger trgk_id

Проверьте «TRGM_ID»"или попробуйте перекомпилировать триггер:

alter trigger [nameOfTrigger] compile;
...