尝试替换列时,Oracle SQL错误“ ORA-00984:此处不允许列”

时间:2019-02-04 16:58:22

标签: sql oracle

此问题不是this one的重复项,因为即使错误消息相等,那里的答案也不适用于我的情况。

我需要将先前定义为VARCHAR(36) NOT NULL的PK Id列更改为增量整数值。我正在尝试编写脚本来执行此操作,但是当我运行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 :(得分:1)

嗯...不是那样,而是这样:

  • 一旦表为空,则不必删除列-只需修改其数据类型
  • 使用触发器自动设置ID值

如果您使用的是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>

[编辑:阅读您的评论并看到您的出版物后]

那仍然可以正常工作-我从字面上复制/粘贴了您的代码并得到了这个信息:

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>