2014-11-18 4 views
0

SQL에서 새로운 기능입니다. 아무도 트리거 벨로우즈를 수정하는 데 도움을 줄 수 있습니까?SQL 두 테이블을 업데이트하는 트리거

이 2 개의 테이블 (리뷰 및 제안)이 있습니다. 제안 테이블에서 데이터를 가져 오는 검토, 삽입 및 업데이트를 업데이트하고 싶습니다. 그리고 이것이 성공적으로 업데이트되면 ReviewId와 ReviewDate로 Offer Table을 업데이트하고 싶습니다.

저는 Azure에서 제공하는 SQL 서버를 사용하고 있습니다.

UserKey와 Asin은 고유 한 값이므로 이러한 테이블을 연결하는 데 사용됩니다. 나는 정말로 도움을 주실 것입니다!

Review 테이블 :

ReviewId | OfferId | Review | CustomerId | UserKey | Asin | ReviewDate 
---------------------------------------------------------------------------------------- 
    25224  null  blah   null  12354ddd  123456  11/24/2014 

Offer 테이블 : 이것은 내가 지금까지 무엇을 가지고

OfferId | CustomerId | UserKey | Asin | ReviewId | ReviewDate | Status 
--------------------------------------------------------------------------------------------- 
    25224  55555  12354ddd 12345  null   null  Pending Review 

:

// this trigger works, is there any other way to simplify this? 
CREATE TRIGGER dbo.InserUpdateReview 
ON dbo.Review 
FOR INSERT, UPDATE, DELETE 
AS 

IF(Select Review.OfferId from Review, Inserted Where Review.ReviewId = Inserted.ReviewId) IS NULL 

BEGIN 

//Update Review table first, this update it is working 

    UPDATE a 
    SET a.OfferId = (Select Top(1) b.OfferId From dbo.Offer b Where b.UserKey = a.UserKey AND b.ASIN= a.ASiN AND b.ReviewId IS NULL), 
    a.CustomerId = (Select Top(1) b.CustomerId From dbo.Offer b Where b.UserKey = a.UserKey AND b.ASIN= a.ASiN AND b.ReviewId IS NULL) 

FROM dbo.Review a 
INNER JOIN Inserted i 
ON a.ReviewId=i.ReviewId AND a.OfferId IS NULL AND a.CustomerId IS NULL 


    //update Offer table here, 

    UPDATE Top(1) o 
    SET o.ReviewId  = (Select r.ReviewId From dbo.Review r Where r.UserKey = o.UserKey AND r.ASIN= o.ASiN AND r.ReviewId = ins.ReviewId ), 
    o.ReviewDate = getDate() 
FROM dbo.Offer o 
INNER JOIN Inserted ins 
ON o.UserKey = ins.UserKey AND o.ASIN = ins.ASIN AND o.ReviewId IS NULL 

END 
+0

또한 질문에 'DELETE'에 대해서는 언급하지 않았지만 트리거는 'FOR DELETE'인 것처럼 보입니다. 동시에, 당신은'Deleted' 의사 테이블을 결코 보지 않을 것입니다 ->이 트리거는 DELETE 연산을 위해 아무 것도하지 않을 것입니다 .... –

+0

안녕 Marc_s, 당신의 응답에 감사드립니다. Azure에서 제공하는 SQL을 사용하고 있습니다. 당신이 언급했듯이 나는 아직 삭제를 위해 아무것도하지 못했다. (나는 어떻게하는지 모른다). 또한 동일한 트리거에서 다른 thable에 대한 업데이트를 만들 수 있다고 생각합니까? 미리 감사드립니다. – Carlos

+0

marc_c, 방아쇠를 방금 업데이트했습니다. 지금까지 예상대로 작동하고 있습니다. 그러나 코드가 조금 어설픈 것처럼 보입니다. (약간의 경험을 바탕으로)이 스크립트를 작성하는 것이 올바른 방법인지 알려주실 수 있습니까? 미리 감사드립니다. – Carlos

답변

2

아래 코드를 사용해보십시오; 잘하면 그것은 당신이 한 일을합니다. 논리는 정확히 같은 아니지만, 나는 당신이 코드를 목표로하는지 추측 시도한 것을 :

CREATE TRIGGER dbo.InserUpdateReview 
ON dbo.Review 
FOR INSERT, UPDATE, DELETE 
AS 
BEGIN 

    --if it's an update 
    if exists (select top 1 1 from inserted i inner join deleted d on d.ReviewId = i.ReviewId) 
    begin 

     --update the review table 
     UPDATE a 
     SET a.OfferId = max(b.OfferId) 
     , a.CustomerId = max(b.CustomerId) 
     FROM dbo.Review a 
     INNER JOIN Inserted i 
      ON a.ReviewId = i.ReviewId 
      AND a.OfferId IS NULL 
      AND a.CustomerId IS NULL 
     LEFT OUTER JOIN dbo.Offer b 
      ON b.UserKey = a.UserKey 
      AND b.ASIN = a.ASiN 
      AND b.ReviewId IS NULL 

     --and the corresponding orders table 
     UPDATE o 
     SET o.ReviewId = max(r.ReviewId) 
     , o.ReviewDate = getDate() 
     FROM dbo.Offer o 
     INNER JOIN Inserted ins 
      ON o.UserKey = ins.UserKey 
      AND o.ASIN = ins.ASIN 
      AND o.ReviewId IS NULL 
     LEFT OUTER JOIN dbo.Review r 
      ON r.UserKey = o.UserKey 
      AND r.ASIN = o.ASiN 
      AND r.ReviewId = ins.ReviewId 

    end 

END 

NB가 :이 논리와 목적을 설명 할 수 있다면 우리가 조언을 잘 할 수 있습니다.

+0

JohnLBevan,이 스크립트를 작성하는 데 시간을내어 주셔서 대단히 감사합니다. 나는 언젠가 그것을 오늘 시험 할 것이고 나는 당신에게 결과를 알려줄 것이다. – Carlos

관련 문제