如何添加一个默认值的列在Oracle数据库表使用触发器?



我有一个包含以下列的客户表:


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)*/
);

这个表中已经有很多记录,现在我想写一个触发器,这样当插入一个新的客户行时,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';

不要尝试在触发器内更新相同的表-你会得到一个"变异的表";错误。只需修改pseudorecord: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子句,记住

NEW和OLD关键字,当在when子句中指定时,不被视为绑定变量,因此前面没有冒号(:)。但是,在除WHEN子句之外的所有引用中,必须在NEW和OLD前面加一个冒号。所以

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;

最新更新