Невозможно вставить NULL в, ОШИБКА во время выполнения триггера

Я создал триггер для таблицы Customers, чтобы каждый раз, когда запись удаляется из таблицы customers, эта же запись вставляется в таблицу Customer_Archives с текущей датой Deletion_Date.

Мне нужно вставить нового клиента в таблицу «Клиенты», а затем удалить его. Запись должна быть правильно вставлена ​​в таблицу 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'

person pyuntae    schedule 21.10.2017    source источник


Ответы (1)


В триггере 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. Когда триггер BEFORE вызывается во время DELETE, значения: OLD имеют значения до удаления, а значения: NEW все равны NULL.

Удачи.

person Bob Jarvis - Reinstate Monica    schedule 21.10.2017
comment
Я попробовал это и получил Errors: check compiler log, а там написано: Error(24,3): PL/SQL: Statement ignored Error(25,32): PLS-00201: identifier 'AR_ROW.CUSTOMER_ID' must be declared - person pyuntae; 22.10.2017
comment
Ага, я пропустил один в строке DBMS_OUTPUT. Исправьте это и попробуйте еще раз. - person Bob Jarvis - Reinstate Monica; 22.10.2017