无法将 NULL 插入,执行触发器期间出现错误

Cannot insert NULL into, ERROR during execution of trigger

我在 table 客户上创建了一个触发器,这样每次从 table 客户中删除一条记录时,都会将同一条记录插入到 table Customer_Archives 中当前日期为 Deletion_Date.

我必须在 table 个客户中插入一个新客户,然后将其删除。记录必须正确插入 table Customers_Archive.

这是我目前的脚本:

CREATE TABLE Customer_Archives
(
  customer_id           NUMBER          NOT NULL,
  customer_first_name   VARCHAR2(50),
  customer_last_name    VARCHAR2(50)    NOT NULL,
  customer_address      VARCHAR2(255)   NOT NULL,
  customer_city         VARCHAR2(50)    NOT NULL,
  customer_state        CHAR(2)         NOT NULL,
  customer_zip          VARCHAR2(20)    NOT NULL,
  customer_phone        VARCHAR2(30)    NOT NULL,
  customer_fax          VARCHAR2(30),
  deletion_date         DATE, 
  CONSTRAINT customer_archives_pk 
    PRIMARY KEY (customer_id)
);

CREATE OR REPLACE TRIGGER Customers_before_insert
BEFORE DELETE ON Customers
FOR EACH ROW 
DECLARE 
    ar_row Customers%rowtype;
BEGIN
INSERT INTO Customer_Archives 
VALUES(ar_row.Customer_id,
    ar_row.Customer_First_Name,
    ar_row.Customer_Last_Name,
    ar_row.Customer_Address,
    ar_row.Customer_City,
    ar_row.Customer_State,
    ar_row.Customer_Zip,
    ar_row.Customer_Phone,
    ar_row.Customer_Fax, 
    sysdate());
    dbms_output.put_line('New row is added to Customers_Archive 
    Table with Customer_ID:' ||ar_row.Customer_id ||'on date:' || sysdate());
END;
/

SELECT trigger_name, status FROM user_triggers;

INSERT INTO CUSTOMERS
(customer_id, customer_first_name, customer_last_name, customer_address, 
customer_city, customer_state, customer_zip, customer_phone, customer_fax)
VALUES (27,'Sofia','Chen','8888 Cowden St.','Philadelphia','PA',
'19149',7654321234',NULL);

DELETE FROM CUSTOMERS
WHERE customer_id = 27;

当我尝试删除刚插入的客户时出现错误:

Error starting at line : 47 in command -
DELETE FROM CUSTOMERS
WHERE customer_id = 27
Error report -
ORA-01400: cannot insert NULL into ("TUG81959"."CUSTOMER_ARCHIVES"."CUSTOMER_ID")
ORA-06512: at "TUG81959.CUSTOMERS_BEFORE_INSERT", line 4
ORA-04088: error during execution of trigger 'TUG81959.CUSTOMERS_BEFORE_INSERT'

在您的 DELETE 触发器中,您应该在创建存档记录时使用 :OLD 值:

CREATE OR REPLACE TRIGGER CUSTOMERS_BEFORE_INSERT
  BEFORE DELETE ON CUSTOMERS
  FOR EACH ROW 
BEGIN
  INSERT INTO CUSTOMER_ARCHIVES 
    (CUSTOMER_ID,
     CUSTOMER_FIRST_NAME,
     CUSTOMER_LAST_NAME,
     CUSTOMER_ADDRESS,
     CUSTOMER_CITY,
     CUSTOMER_STATE,
     CUSTOMER_ZIP,
     CUSTOMER_PHONE,
     CUSTOMER_FAX,
     DELETION_DATE)
  VALUES
    (:OLD.CUSTOMER_ID,
     :OLD.CUSTOMER_FIRST_NAME,
     :OLD.CUSTOMER_LAST_NAME,
     :OLD.CUSTOMER_ADDRESS,
     :OLD.CUSTOMER_CITY,
     :OLD.CUSTOMER_STATE,
     :OLD.CUSTOMER_ZIP,
     :OLD.CUSTOMER_PHONE,
     :OLD.CUSTOMER_FAX, 
     SYSDATE());

  DBMS_OUTPUT.PUT_LINE('New row is added to Customers_Archive 
    Table with Customer_ID:' ||:OLD.Customer_id ||'on date:' || SYSDATE());
END;

在您的原始触发器中,您声明了一个名为 ar_row 的行变量,但没有为任何字段分配任何内容 - 因此它们都是 NULL。在 DELETE 期间调用 BEFORE 触发器时,:OLD 值具有删除前的值,而 :NEW 值均为 NULL。

祝你好运。