如何使用触发器向 Oracle 数据库 table 中的列添加默认值?

how to add a default value to the column in a Oracle database table using trigger?

我有一个客户 table 具有以下列:


CREATE TABLE customers
  (
    customer_id NUMBER 
                GENERATED BY DEFAULT AS IDENTITY START WITH 320 
                PRIMARY KEY,
    name         VARCHAR2( 255 ) NOT NULL,
    address      VARCHAR2( 255 )         ,
    website      VARCHAR2( 255 )         ,
    credit_limit NUMBER( 8, 2 )          ,
    isActive VARCHAR2(20) /*values are either TRUE or FALSE(default)*/
  );

这个table中已经有很多记录,现在我想写一个触发器,这样当插入一个新的客户行时,isActive应该默认为FALSE

我做了这样的事情:

CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS" BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
when (NEW.CUSTOMER_ID > 0)
BEGIN
UPDATE CUSTOMERS set NEW.ISACTIVE = 'FALSE';
dbms_output.put('updated flag: ' || new.ISACTIVE);
END;

但我收到以下错误:

Error: SQL statement ignored  
Error: ORA-00904: NEW.ISACTIVE invalid identifier  
Error: NEW.ISACTIVE must be declared  

我只是想在插入前为 isActive 列设置默认值,但无法成功完成。还想看看我是否需要添加任何其他验证。

感谢任何帮助。

编辑:此任务不需要触发器

ALTER TABLE CUSTOMER MODIFY isActive VARCHAR2(20) DEFAULT 'FALSE';

不要尝试 更新 相同的 table 内部触发器 - 你会得到一个“变异 table”错误。只需修改伪记录 :NEW

CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS"
BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
BEGIN
    IF :NEW.CUSTOMER_ID > 0 THEN
        :NEW.ISACTIVE := 'FALSE';
    END IF;
    dbms_output.put('updated flag: ' || :new.ISACTIVE);
END;

如果您想使用 WHEN 子句,请记住

The NEW and OLD keywords, when specified in the WHEN clause, are not considered bind variables, so are not preceded by a colon (:). However, you must precede NEW and OLD with a colon in all references other than the WHEN clause. So

CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS"
BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
WHEN (NEW.CUSTOMER_ID > 0)
BEGIN
    :NEW.ISACTIVE := 'FALSE';
    dbms_output.put('updated flag: ' || :new.ISACTIVE);
END;