更新两个表的SQL触发器

时间:2014-11-18 22:52:40

标签: sql triggers azure-sql-database

我是SQL的新手,有人可以帮我解决下面的触发器。

我有这两个表(评论和提供),我想更新评论表ON插入,更新和删除从提供表中获取数据。如果成功更新,我想使用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

1 个答案:

答案 0 :(得分: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

注意:如果你能用这种逻辑来解释你的目标,我们可能会更好地提出建议。