Триггер, который указывает на вставку в одну таблицу и использует информацию из другой таблицы, не работает. - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над назначением базы данных.Я пытаюсь создать триггер, который не позволяет пользователю вставить значение в таблицу уставов, если баланс клиентов в таблице клиентов превышает 400. Триггер компилируется без ошибок, но не работает.Какие-либо предложения?

CREATE OR REPLACE TRIGGER Unpaid_Balance
BEFORE INSERT ON Charter
FOR EACH ROW
DECLARE 
Unpaid DECIMAL;
BEGIN
SELECT Customer_Balance
INTO Unpaid
FROM Customer, Charter
WHERE CUSTOMER.CustomerID = CHARTER.CustomerID;
IF Unpaid > 400 THEN 
Raise_application_error(-20003, 'Customer has an unpaid balance of more than 
$400');
end if;
end; 

1 Ответ

0 голосов
/ 25 апреля 2018

Вы, вероятно, хотели бы что-то похожее на это (посмотрите на ссылку на вставленное значение - :NEW.CustromerID - это то, что вы забыли в своем триггере):

CREATE OR REPLACE TRIGGER Unpaid_Balance
  BEFORE INSERT ON Charter
  FOR EACH ROW
DECLARE 
    V_Unpaid DECIMAL;
BEGIN
    SELECT Customer_Balance
        INTO V_Unpaid
    FROM Customer
    WHERE CUSTOMER.CustomerID = :NEW.CustomerID
    ;
    --
    IF V_Unpaid> 400 THEN 
        Raise_application_error(-20003, 'Customer has an unpaid balance of more than $400');
    end if;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        NULL;
END;
/

Но я настоятельно рекомендую вам не включать бизнес-логику в триггеры. Сделайте это в вашем приложении. Управлять потоком с помощью триггеров очень сложно, потому что все делается автоматически ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...