source

동일한 테이블에서 업데이트를 수행한 다음 INSERT를 수행하기 위한 MariaDB 트리거

bestscript 2022. 12. 3. 12:44

동일한 테이블에서 업데이트를 수행한 다음 INSERT를 수행하기 위한 MariaDB 트리거

는 현재 ★★★★★★★★★를 가지고 있습니다.account과 블블 tableaccount_audit테이블(여기에서는 모든 코드를 바이올린으로 사용할 수 있습니다).

계정 테이블에 삽입된 데이터에 따라 레코드를 account_audit 테이블에 삽입하는 트리거가 2개 있습니다.

1 트리거는 이러한 값을 삽입하기만 하는 ON INSERT 트리거로, 정상적으로 작동합니다.

그래서 감사테이블에 2개의 레코드를 삽입한 후 아래와 같이 양테이블에 2개의 레코드가 있습니다.

SELECT * FROM account;

주다

acct_id acct_name   acct_balance    tax_rate    acct_opened
      1 Bill            100.00          0.10     2019-11-01
      2 Ben            1000.00          0.10     2019-11-01

그리고.

SELECT * FROM account_audit;

주다

acct_id txn_id  acct_name   acct_balance    tax_rate    valid_from  valid_to
      1      1       Bill         100.00        0.10    2021-11-07  2038-01-19
      2      2        Ben        1000.00        0.10    2021-11-07  2038-01-19

2038은 MariaDB 무한대입니다. 적어도 시간 테이블에서는요!

, UPDATE 트리거는 다음과 같습니다.

CREATE TRIGGER testtrigger_upd 
AFTER UPDATE ON account
  FOR EACH ROW BEGIN
    UPDATE account_audit SET valid_to = NOW() 
    WHERE ((valid_to = '2038-01-19') AND (OLD.acct_name = NEW.acct_name));
    INSERT INTO 
      account_audit (acct_id, acct_name, acct_balance, tax_rate) 
      VALUES 
      (
        OLD.acct_id, 
        OLD.acct_name, 
        NEW.acct_balance, 
        OLD.tax_rate
        
        -- valid_from - NOW()!
        -- valid_to DEFAULTs to '2038-01-19' which is what we want for updates to balance 
      );
END;

때) 를 account_audit trail로 .valid_to 및 새로운 (the records)에 대해서valid_fromvalid_to2038년(MariaDB)의무도도의 。

문제는 이 명령어를 실행하면

UPDATE account 
SET acct_balance = acct_balance + 50 WHERE acct_name = 'Bill';  -- name is UNIQUE

account_displays 테이블 내의 레코드는 다음과 같습니다.

acct_id txn_id  acct_name   acct_balance    tax_rate    valid_from  valid_to
      1      1       Bill         100.00    0.10        2021-11-07  2021-11-07
      1      3       Bill         150.00    0.10        2021-11-07  2038-01-19
      2      2        Ben        1000.00    0.10        2021-11-07  2021-11-07

Bill의 레코드가 삽입된 것을 알 수 있지만, 문제는 Ben의 레코드도 오늘 삽입일로 갱신되었다는 것입니다.Bill에게만 분명히 이런 일이 일어나기를 바랍니다!

있다WHERE ((valid_to = '2038-01-19') AND (OLD.acct_name = NEW.acct_name));다른 많은 시도도 해봤지만WHERE OLD.acct_id = NEW.acct_id그리고 이름 대신 acct_id를 사용하도록 업데이트를 변경해보았습니다.이치노이전 주문과 새 주문을 바꾸려고 합니다. - 업데이트 전 또는 업데이트 후 주문 - 정말 당황스럽습니다!

account_audit 테이블을 갱신하는 트리거는 어떻게 하면 모든 계정이 아닌 자신의 계정만 갱신할 수 있습니까?즉, Bill 계정만 갱신하고 Ben 계정만 갱신할 수 있습니까?

시간 테이블 기능에 대해 알고 있습니다. 스터디용이고 트리거를 사용해야 하므로 이 기능을 사용하고 싶지 않습니다.

바이올린이 왔어요.

모든 행에 대해 your where 절이 true이기 때문입니다.

따라서 테이블에서 확인할 업데이트 쿼리를 변경합니다.

CREATE TRIGGER testtrigger_upd 
AFTER UPDATE ON account
  FOR EACH ROW BEGIN
    UPDATE account_audit SET valid_to = NOW() 
    WHERE ((valid_to = '2038-01-19') AND (acct_name = NEW.acct_name));
    INSERT INTO 
      account_audit (acct_id, acct_name, acct_balance, tax_rate) 
      VALUES 
      (
        OLD.acct_id, 
        OLD.acct_name, 
        NEW.acct_balance, 
        OLD.tax_rate
        
        -- valid_from - NOW()!
        -- valid_to DEFAULTs to '2038-01-19' which is what we want for updates to balance 
      );
END;
UPDATE account 
SET acct_balance = acct_balance + 50 WHERE acct_name = 'Bill';
SELECT * FROM account_audit
acct_id | txn_id | acct_name | acct_balance | tax_rate | valid_from | valid_to------: | -----: | :-------- | -----------: | -------: | :--------- | :---------1 | 1 | 과금 | 100.00 | 0 | 2021-11-07 | 2021-11-072 | 2 | Ben | 1000.00 | 0 | 2021-11-07 | 2038-01-191 | null | 과금 | 150.00 | 0 | null | null

db <>여기에 추가

내가 보기엔 'where' 조항은

WHERE ((valid_to = '2038-01-19') AND (OLD.acct_name = NEW.acct_name));

Ben과 Bill 모두에게 유효합니다.따라서 둘 다 업데이트가 됩니다.

해결책은 다음과 같이 약간 변경하는 것입니다.

WHERE ((valid_to = '2038-01-19') AND (acct_name = OLD.acct_name));

언급URL : https://stackoverflow.com/questions/69874080/mariadb-trigger-to-perform-an-update-and-then-an-insert-on-the-same-table