我有一个包含以下列的客户表:
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;