Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新两个表的SQL触发器_Sql_Triggers_Azure Sql Database - Fatal编程技术网

更新两个表的SQL触发器

更新两个表的SQL触发器,sql,triggers,azure-sql-database,Sql,Triggers,Azure Sql Database,我是SQL新手,有人能帮我修复下面的触发器吗 我有这两个表(Review和Offer),我想在插入、更新和删除时更新Review表,从Offer表获取数据。如果这个更新成功,我想用ReviewId和ReviewDate更新Offer表 我正在使用Azure提供的SQL server UserKey和Asin是唯一的值,所以我使用它们来链接这些表。 我真的非常感谢你的帮助 查看表格: ReviewId | OfferId | Review | CustomerId | UserKey

我是SQL新手,有人能帮我修复下面的触发器吗

我有这两个表(Review和Offer),我想在插入、更新和删除时更新Review表,从Offer表获取数据。如果这个更新成功,我想用ReviewId和ReviewDate更新Offer表

我正在使用Azure提供的SQL server

UserKey和Asin是唯一的值,所以我使用它们来链接这些表。 我真的非常感谢你的帮助

查看
表格:

 ReviewId | OfferId  |  Review  |  CustomerId  |  UserKey   |   Asin    |  ReviewDate
 ----------------------------------------------------------------------------------------
  25224      null        blah         null        12354ddd     123456     11/24/2014
 OfferId |  CustomerId  |  UserKey  |   Asin   |  ReviewId   |   ReviewDate |  Status
 ---------------------------------------------------------------------------------------------
  25224       55555        12354ddd    12345        null           null        Pending Review
优惠
表格:

 ReviewId | OfferId  |  Review  |  CustomerId  |  UserKey   |   Asin    |  ReviewDate
 ----------------------------------------------------------------------------------------
  25224      null        blah         null        12354ddd     123456     11/24/2014
 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

试试下面的代码;希望它能满足你的需求;逻辑并不完全相同,但我试着猜测您的目标并编写代码:

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

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

另外:你的问题中没有提到任何关于
DELETE
,但是触发器似乎也是
用于DELETE
。同时,您永远不会看到
Deleted
伪表-->此触发器对
DELETE
操作没有任何作用……您好,Marc_s,谢谢您的回复。我正在使用Azure提供的SQL。正如你提到的,我还没有为删除做任何事情(我不知道怎么做)。另外,你认为我可以在同一个触发器中创建另一个thable的更新吗?提前谢谢你!marc_c,我刚更新了触发器,到目前为止它正常工作。但是代码在我看来有点混乱(基于一点经验),你能告诉我这是否是编写脚本的正确方法吗。提前谢谢你!它看起来很混乱,因为你需要做各种各样的
IF
和其他事情来知道你是否在
INSERT
UPDATE
DELETE
触发器中。我个人会创建三个单独的触发器,每个操作一个-然后从一开始就很清楚这个触发器处理的是什么,你可以忘记很多
IF
等语句-代码看起来会很干净谢谢你的建议!约翰·比万,非常感谢你花时间写这个剧本,你真是太棒了!我会在今天的某个时候测试它,我会让你知道结果。