Ошибка Oracle SQL «ORA-00984: столбец здесь не разрешен» при попытке заменить столбец - PullRequest
0 голосов
/ 04 февраля 2019

Этот вопрос не является дубликатом от этого , потому что даже если сообщения об ошибках равны, ответы не применимы к моему делу.

Мне нужноизменить предыдущий столбец PK Id, определенный как VARCHAR(36) NOT NULL, на инкрементное целочисленное значение.Я пытаюсь написать скрипт для этого, но когда я запускаю оператор alter table, он завершается неудачно с ошибкой в ​​заголовке.

Таблица ранее была определена как:

CREATE TABLE journal_messages(
    ID           VARCHAR(36)    NOT NULL, -- column to be changed
    MESSAGE      VARCHAR(2048) NOT NULL,
    MESSAGE_TYPE VARCHAR(30) NOT NULL,
    MSG_DATE     TIMESTAMP      NOT NULL,
    MODULE_CODE  INTEGER NOT NULL    
);

ALTER TABLE journal_messages ADD (CONSTRAINT journal_messages_pk PRIMARY KEY (ID));

Сценарий, который я запускаю:

DELETE FROM JOURNAL_MESSAGES;

ALTER TABLE JOURNAL_MESSAGES DROP COLUMN ID;

CREATE SEQUENCE journal_messages_seq START WITH 1;

ALTER TABLE JOURNAL_MESSAGES ADD (ID NUMBER(10) DEFAULT journal_messages_seq.nextval NOT NULL); -- error happens here

ALTER TABLE journal_messages ADD (
  CONSTRAINT journal_messages_pk PRIMARY KEY (ID));

Когда я пытаюсь создать триггер для обновления инкремента, происходит сбой с SQL Error [4098] [42000]: ORA-04098: trigger 'TRG_SEQ_JOURNAL_MSG' is invalid and failed re-validation, когда я пытаюсь вставить новый кортеж:

ALTER TABLE JOURNAL_MESSAGES DROP COLUMN ID;

ALTER TABLE JOURNAL_MESSAGES ADD (ID NUMBER(10) NOT NULL);

create or replace trigger trg_seq_journal_msg
      before insert on journal_messages
      for each row
    begin
      :new.id := journal_messages_seq.nextval;
    end;
    /

INSERT INTO JOURNAL_MESSAGES (message, MESSAGE_TYPE, msg_date, MODULE_CODE) VALUES ('test', 'alteration', CURRENT_TIMESTAMP, '10');

1 Ответ

0 голосов
/ 04 февраля 2019

Умм ... не так, но вот так:

  • когда таблица пуста, вам не нужно отбрасывать столбец - просто измените его тип данных
  • используйте триггер для автоматической установки значения идентификаторов

Если бы вы были на 12c, вы могли бы использовать столбец identity .

SQL> CREATE TABLE journal_messages(
  2      ID           VARCHAR(36)    NOT NULL, -- column to be changed
  3      MESSAGE      VARCHAR(2048) NOT NULL,
  4      MESSAGE_TYPE VARCHAR(30) NOT NULL,
  5      MSG_DATE     TIMESTAMP      NOT NULL,
  6      MODULE_CODE  INTEGER NOT NULL
  7  );

Table created.

SQL> delete from journal_Messages;

0 rows deleted.

SQL> alter table journal_messages modify (id number(10));

Table altered.

SQL> CREATE SEQUENCE journal_messages_seq START WITH 1;

Sequence created.

SQL> create or replace trigger trg_bi_joumes
  2    before insert on journal_messages
  3    for each row
  4  begin
  5    :new.id := journal_messages_seq.nextval;
  6  end;
  7  /

Trigger created.

SQL>

[EDIT: прочитав ваш комментарий и увидев ваше издание]

Это все еще работает нормально - я буквально скопировал / вставил ваш код и получил следующее:

SQL> ALTER TABLE JOURNAL_MESSAGES DROP COLUMN ID;

Table altered.

SQL> ALTER TABLE JOURNAL_MESSAGES ADD (ID NUMBER(10) NOT NULL);

Table altered.

SQL> create or replace trigger trg_seq_journal_msg
  2        before insert on journal_messages
  3        for each row
  4      begin
  5        :new.id := journal_messages_seq.nextval;
  6      end;
  7      /

Trigger created.

SQL> INSERT INTO JOURNAL_MESSAGES (message, MESSAGE_TYPE, msg_date, MODULE_CODE) VALUES ('test', 'alteration', CURRENT_TIMESTAMP, '10')
  2  ;

1 row created.

SQL>

Как видите, всевроде бы просто отлично.Попробуйте выполнить следующее: перекомпилируйте триггер и покажите ошибки (если они есть; если да, опубликуйте их здесь):

SQL> alter trigger trg_seq_journal_msg compile;

Trigger altered.

SQL> show err
No errors.
SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...