如何使用触发器向 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;
我有一个客户 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;