Oracle Trigger: вставка в объект транзакции новой строки после обновления, вставка объекта счета - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в SQL, и мне очень трудно настроить этот триггер.Это для JDBC Bank Console.

У меня есть схема с тремя объектами: USER, ACCOUNT и TRANSACTION.Я хочу отслеживать все изменения, которые пользователь вносит в одну из своих учетных записей, вставляя новую строку в мою сущность транзакции, которая имеет столбцы с идентификатором

  1. , который я обрабатываюс последовательностью:

  2. user_id (ссылка на внешний ключ, сохраненный в сущности счета),

  3. account_id (ссылка на первичный ключ объекта счета),
  4. отметка времени (для которой я использую функцию Oracle CURRENT_TIMESTAMP),
  5. и тип транзакции, который имеет тип «депозит» или «снятие».

Вот как выглядит мой триггер прямо сейчас.

CREATE OR REPLACE TRIGGER ADD_TX
ON ACCOUNT
AFTER INSERT, UPDATE
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE old_balance number, new_balance number, transaction_type varchar2(100);
BEGIN
  transaction_type := CASE WHEN :NEW.balance < :OLD.balance THEN 'WITHDRAWAL' ELSE 'DEPOSIT' END;
  INSERT INTO TRANSACTIONS VALUES(TRANSACTION_ID_SEQ.NEXTVAL, :NEW.USER_ID, :NEW.id, CURRENT_TIMESTAMP, :NEW.account_type, transaction_type);
   end if; 
END;
/

Любое руководство будет наиболее ценно

1 Ответ

0 голосов
/ 23 октября 2018

Примерно так может работать:

CREATE OR REPLACE TRIGGER add_tx AFTER
  INSERT OR UPDATE ON account
  FOR EACH ROW
BEGIN
  INSERT INTO transactions VALUES (
    transaction_id_seq.NEXTVAL,
    :new.user_id,
    :new.id,
    current_timestamp,
    :new.account_type,
      CASE
        WHEN :new.balance <:old.balance  THEN 'WITHDRAWAL'
        ELSE 'DEPOSIT'
      END
  );    
END;
/

Хотя я бы посоветовал вам назвать ВСЕ столбцы, в которые вы вставляете;как вы это написали, неясно, какое значение входит в какой столбец, и такой код может (и, вероятно, сломается) когда-нибудь.

...