更新两个表的SQL触发器
我是SQL新手,有人能帮我修复下面的触发器吗 我有这两个表(Review和Offer),我想在插入、更新和删除时更新Review表,从Offer表获取数据。如果这个更新成功,我想用ReviewId和ReviewDate更新Offer表 我正在使用Azure提供的SQL server UserKey和Asin是唯一的值,所以我使用它们来链接这些表。 我真的非常感谢你的帮助更新两个表的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
查看
表格:
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
等语句-代码看起来会很干净谢谢你的建议!约翰·比万,非常感谢你花时间写这个剧本,你真是太棒了!我会在今天的某个时候测试它,我会让你知道结果。