[SQL] 다른 테이블의 열이 업데이트 될 때 하나 개의 테이블에 열을 업데이트하는 트리거를 생성
SQL다른 테이블의 열이 업데이트 될 때 하나 개의 테이블에 열을 업데이트하는 트리거를 생성
나는 두 개의 테이블이
주문 (ID, 날짜, 주)
과
배달 (ID, 주, 일)
나는 날짜 순서대로 업데이트 될 때 배달에 날짜를 업데이트하는 트리거를 만들려고합니다.
내가 좋아하는 뭔가를 생각하고 있었다
CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE
ON Order
DECLARE
BEGIN
UPDATE Delivery set date = ??? where id = ???
END;
어떻게 날짜와 행 ID를받을 수 있나요?
감사
해결법
-
==============================
1.이 주문 테이블에 열 DELIVERY_DATE 불러 ID가 트리거 이런 식으로 뭔가를 보여야하는 가정 :
이 주문 테이블에 열 DELIVERY_DATE 불러 ID가 트리거 이런 식으로 뭔가를 보여야하는 가정 :
CREATE OR REPLACE TRIGGER your_trigger_name BEFORE UPDATE ON Order FOR EACH ROW BEGIN if :new.delivery_date != :old.delivery_date then UPDATE Delivery d set d.delivery_date = :new.delivery_date where d.order_id = :new.id; end if; END;
개별 행에서 기준값에 필요한 각 ROW 절위한 참고. 나는 배달에 업데이트를 실행할지 여부를 테스트하는 IF 구문을 사용했다. 당신이 당신의 트리거에 다른 논리가없는 경우이처럼 쓸 수 ...
CREATE OR REPLACE TRIGGER your_trigger_name BEFORE UPDATE OF delivery_date ON Order FOR EACH ROW BEGIN UPDATE Delivery d set d.delivery_date = :new.delivery_date where d.order_id = :new.id; END;
나는 당신의 데이터 모델은 차선의 것을 지적 할 것이다, 여담으로, 당신이 묻는 질문에 대답 만했다. 제대로 정상화 디자인은 하나 개의 테이블에 DELIVERY_DATE를 개최 것 : 배달 그것을 위해 TEH 논리적 인 장소를 보인다.
-
==============================
2.이전 및 새 바인드 변수를 사용합니다. 변화가 이루어지기 전에 OLD 참조 행 또는 열은 업데이트되고; NEW는 변경 후를 참조합니다.
이전 및 새 바인드 변수를 사용합니다. 변화가 이루어지기 전에 OLD 참조 행 또는 열은 업데이트되고; NEW는 변경 후를 참조합니다.
CREATE OR REPLACE TRIGGER trig1 BEFORE UPDATE ON order REFERENCING NEW AS new FOR EACH ROW BEGIN UPDATE delivery SET ddate = :new.ddate WHERE id = :new.id; END;
당신은 당신의 바인드 변수를 다른 이름을 부여하기 위해 참조하는 절을 수정할 수 있습니다. 당신도 <이름>으로 OLD을 포함 할 수 있습니다. 예:
CREATE OR REPLACE TRIGGER trig1 BEFORE UPDATE ON order REFERENCING OLD AS old_values NEW AS new_values ...
당신이 "이전"과 "새로운"의 기본 이름을 변경하지 않으려면, 당신은 완전히 REFERENCING 절을 남길 수 있습니다.
-
==============================
3.의 형태로 트리거 암시 신규 및 기존 참조가 있습니다 : REFERENCING OLD AS OLD NEW AS NEW
의 형태로 트리거 암시 신규 및 기존 참조가 있습니다 : REFERENCING OLD AS OLD NEW AS NEW
당신은 쓸 수 있습니다 : OLD 값 :에 새로운 가치가 아니라합니다.
UPDATE Delivery set date = :new.delivery_date where id = :new.id; CREATE OR REPLACE TRIGGER "BUR_TABLENAME" BEFORE UPDATE ON "TABLE" FOR EACH ROW BEGIN If :new.active_date is not null Then :new.active_date := TRUNC(:new.active_date); End If; END;
주형:
CREATE OR REPLACE TRIGGER TRIGGER_NAME BEFORE UPDATE ON TABLE_NAME REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE V_VARIABLE NUMBER (1); BEGIN //Do Stuff; null; end;
-
==============================
4.트리거 이런 종류의 필요가있을 때마다, 디자인에서 좋은 모습을 가지고있다. 별도의 배달 기록에 대한 요구가 정말 있나요? 주문은 정말 1 개 이상 배달이 있습니까?
트리거 이런 종류의 필요가있을 때마다, 디자인에서 좋은 모습을 가지고있다. 별도의 배달 기록에 대한 요구가 정말 있나요? 주문은 정말 1 개 이상 배달이 있습니까?
트리거는 좋은 보일하지만 그들은 이렇게까지 꽤 빨리 엉망 일에 경향이있다.
from https://stackoverflow.com/questions/2678102/create-a-trigger-that-updates-a-column-on-one-table-when-a-column-in-another-tab by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL에서 결과의 페이지를 반환? (0) | 2020.06.06 |
---|---|
[SQL] SQL 데이터베이스를 설계하는 것은 OO 클래스 계층 구조를 나타내는 (0) | 2020.06.06 |
[SQL] "and"와 "여기서"에 조인의 차이 (0) | 2020.06.06 |
[SQL] 내가) (ContentResolver.query이 안드로이드 쿼리를 수행 할 수 있습니까? (LEFT는 가입 CASE) (0) | 2020.06.06 |
[SQL] 번호 또는 간격 데이터 유형 - 오라클의 날짜를 빼면? (0) | 2020.06.06 |