복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.트리거 이런 종류의 필요가있을 때마다, 디자인에서 좋은 모습을 가지고있다. 별도의 배달 기록에 대한 요구가 정말 있나요? 주문은 정말 1 개 이상 배달이 있습니까?

    트리거 이런 종류의 필요가있을 때마다, 디자인에서 좋은 모습을 가지고있다. 별도의 배달 기록에 대한 요구가 정말 있나요? 주문은 정말 1 개 이상 배달이 있습니까?

    트리거는 좋은 보일하지만 그들은 이렇게까지 꽤 빨리 엉망 일에 경향이있다.

  5. 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