我是SQL的新手,有人可以帮助我修复触发器问题吗?
我有这两个表(“评论”和“报价”),我想更新“评论”表,然后在“插入”,“更新”和“删除”中获取要约表中的数据。如果更新成功,我想使用ReviewId和ReviewDate更新商品表。
我正在使用Azure提供的SQL Server。
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
试试下面的代码;希望它能满足您的需求;逻辑并不完全相同,但是我尝试猜测您要针对的目标并编写以下代码:
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
注意:如果您可以使用此逻辑解释您的目标,我们可能会更好地提供建议。
问题内容: 我有一个Maximo数据库,该数据库具有无法更改的表结构。我希望在创建或更新主电子邮件地址时将其复制到PERSON表中。以下结构描述了PERSON表和EMAIL表 PERSON表: EMAIL表: 如您所见,这两个表在PERSONID列上链接。这是我希望触发器执行的操作: 如果EMAIL表已更新或插入了新行,那么如果ISPRIMARY字段,我想将EMAILADDRESS字段复制到PER
userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?
问题内容: 如何在SQL触发器中获取更新的记录的值-像这样: 显然这是行不通的,但是您可以看到我要尝试的内容。 问题答案: 如果您 确定 只会更新一个值,则可以执行此操作… 如果可以一次更新多个值,则此代码将仅处理其中一个。(尽管不会出错。) 您可以使用游标,或者如果它是SQL Server 2008+,则可以使用表变量。 或者,更常见的是,只需将StoredProcedure代码移到触发器中。
我创建了一个用于插入和更新的SQL触发器,它基本上执行以下操作: 从插入的表中获取LineID(表的PrimaryID)和RegionID,并将其存储在INT变量中。然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录。 我的问题是,它没有更新记录,我猜,这是因为记录还没有插入到PurchaseOrderLine表中,我正在
问题内容: 我正在尝试为我的表创建一个触发器,该触发器根据某个标志设置为“ Y”的时间自动添加发布日期 我没有创建触发器的丰富经验,但到目前为止,这是我所拥有的 更新列时出现此错误 触发器“ USER.ADD_CREATE_DT”无效且重新验证失败 有任何想法吗? 谢谢 问题答案: 使用WHEN子句: 或使用IF: 在这种情况下,WHEN更合适,更有效。
问题内容: 我正在尝试编写触发器,我有下表:BookingRequest: 状态表: 被占领的房间: 我需要一个触发器,如果将具有相同ID的请求插入到OccupiedRoom表中,它将把BookingReques中的状态更改为1,所以我尝试了类似的操作 而且它不起作用,所以任何建议都非常有用 问题答案: 尝试这个: