2 테이블을 만들었습니다 : INFORMATION
및 FEED
.동일한 테이블의 다른 열에 값을 삽입/업데이트/삭제할 때 열에 값이 자동으로 반영되도록하는 방법은 무엇입니까?
INFORMATION has 2 attributes : ID(Primary Key), TOT_AMOUNT.
FEED has 4 attributes : ID(Foreign key refer INFORMATION(ID)), S_AMOUNT, S_DATE, TOT_REM.
는 지금, 나는 S_AMOUNT
과 TOT_AMOUNT
의 삽입/제거/업데이트에 따라,// 업데이 트를 삽입 TOT_REM
로/값을 삭제해야합니다.
샘플 내용은 다음과 같습니다
INFORMATION Table
------------------
ID | TOT_AMOUNT
1 | 100
2 | 20
3 | 50
...
FEED Table
----------------------------------------
ID | S_AMOUNT | S_DATE | TOT_REM
1 | 10 |10.10.2010| 90
1 | 10 |13.10.2010| 80
1 | 30 |17.10.2013| 50
1 | 10 |20.10.2016| 40
...
우리는 자동으로 TOT_AMOUNT
& S_AMOUNT
의 도움으로/업데이트/삽입을 기반으로, TOT_REM
속성에 값을 삽입 작업이 S_AMOUNT
수행 삭제해야합니다. 언제든지
이 TOT_REM가 0보다 작은 수 없으며, TOT_REM 자동/제거/삽입 업데이트해야하는 등 그
TOT_REM for i(at a specific date) = (TOT_AMOUNT for ID=i) -
SUM(S_AMOUNT of all instances of ID=i,
which is later than the S_DATE for ID=i);
그래서, 우리는 2 튜플 (1을 삭제하면 가정, 10 '13 .10.2010 ', 80)의 반사 BR_FEED
상태이어야한다 : I가
ORA-04091: table SSUMAN.FEED is mutating, trigger/function may not see it
실패를 나타내는 트리거를 썼다
FEED Table
----------------------------------------
ID | S_AMOUNT | S_DATE | TOT_REM
1 | 10 |10.10.2010| 90
1 | 30 |17.10.2013| 60
1 | 10 |20.10.2016| 50
...
트리거 617,451,515,
코드는 다음과 같습니다
CREATE OR REPLACE TRIGGER BR_INSERT_TRB
AFTER DELETE OR INSERT OR UPDATE OF S_AMOUNT ON FEED
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE FEED bf
SET bf.TOT_REM = bf.S_AMOUNT + :OLD.S_AMOUNT;
END IF;
IF INSERTING THEN
INSERT INTO FEED (TOT_REM) VALUES(
((SELECT TOT_AMOUNT FROM INFORMATION bi WHERE bi.ID=:NEW.ID) -
(SELECT SUM(S_AMOUNT) FROM FEED bf where bf.ID=:NEW.ID) -
:NEW.S_AMOUNT);
END IF;
IF UPDATING THEN
UPDATE FEED bf
SET bf.TOT_REM = (SELECT TOT_AMOUNT FROM BR_INFORMATION bi WHERE bi.ID=bf.ID) -
(SELECT SUM(S_AMOUNT) FROM FEED bf where bf.ID=:NEW.ID) -
:NEW.S_AMOUNT
WHERE :NEW.ID IS NOT NULL;
END IF;
END;
질문 :
- 이 방법은을 결함이 있습니까? 이 방법으로 원하는 것을 달성 할 수 없습니까? [선택 사항]
- 여기에 볼 수있는 범위가 있습니까? 나는 그 라인에서 생각할 수 없다! 아마, 경험 부족은 ... [선택] 그 TOT_REM 값이 자동으로 반영 할 수 있도록
- 더 나은 접근? 나는 뷰를 생성하는 것이 좋습니다 생각
"TOT_REM은 0보다 작을 수 없습니다"라고 말하면 TOT_REM을 계산하는 논리의 일부로, 또는 TOT_REM이 음수가 될 수 있으므로 문제의 삽입/업데이트/삭제가 거부되어야합니까? 이 둘은 매우 다르며 다른 방식으로 해결됩니다. – mathguy
@mathguy - 설명을 요구해 주셔서 감사합니다. 다른 세부 정보가 필요합니까? –
여기 몇 가지 어려움이 있습니다. Biggest는 처음에 TOT_REM을 계산하는 것입니다. 10.10.2010 행을 삭제하면 다음 행의 TOT_REM은 위의 행 대신 정보 테이블에서 읽어야합니다. 첫 번째 행 (10.10.2010 이상) 위에 행을 추가하면 10.10.2010 TOT_ROM이 INFORMATION 대신에 위 행을 기준으로 계산되어야합니다. 더 큰 문제는 여전히 : TOT_ROM을 음수로 만들기 때문에 행을 거부합니다. 나중에 더 오래된 날짜가있는 행을 제거하면 ... 처음에 거절 한 행을 다시 가져와야합니까? – mathguy