SQL Server触发器中的列名无效
如果取消预订,我有以下代码从表中删除信息,但我收到以下错误: Msg 207,16级,状态1,程序trgDelBooking,第10行 无效的列名“BookingStatus” 但是,列名绝对正确 这是我的密码:SQL Server触发器中的列名无效,sql,sql-server,triggers,Sql,Sql Server,Triggers,如果取消预订,我有以下代码从表中删除信息,但我收到以下错误: Msg 207,16级,状态1,程序trgDelBooking,第10行 无效的列名“BookingStatus” 但是,列名绝对正确 这是我的密码: ALTER TRIGGER trgDelBooking ON HVCBookings AFTER UPDATE AS BEGIN SELECT * FROM Inserted DELETE FROM HVCActivityBooking WHERE
ALTER TRIGGER trgDelBooking
ON HVCBookings
AFTER UPDATE
AS
BEGIN
SELECT *
FROM Inserted
DELETE FROM HVCActivityBooking
WHERE PartyID = (SELECT PartyID FROM inserted)
AND BookingStatus = 'CANCELLED'
END
GO
有什么建议吗?除了列名的问题外,您的触发器假定inserted只有一行。这是一个非常糟糕的假设。查询应为:
DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT PartyID FROM inserted) AND
BookingStatus = 'CANCELLED';
当然,这并不能解决未知列的问题。这只会让扳机更安全
编辑:如果BookingStatus位于HVCBookings中,则可以在子查询中设置WHERE条件:
DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT i.PartyID FROM inserted i WHERE i.BookingStatus = 'CANCELLED');
除了列名的问题外,触发器还假设inserted只有一行。这是一个非常糟糕的假设。查询应为:
DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT PartyID FROM inserted) AND
BookingStatus = 'CANCELLED';
当然,这并不能解决未知列的问题。这只会让扳机更安全
编辑:如果BookingStatus位于HVCBookings中,则可以在子查询中设置WHERE条件:
DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT i.PartyID FROM inserted i WHERE i.BookingStatus = 'CANCELLED');
我相信数据库:HVCActivityBooking.BookingStatus不存在。请同时提供表结构。您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。每个语句将触发一次触发器,所以如果您的语句更新25行,则将触发一次触发器,但插入的伪表将包含25行。您的代码将在此处选择这25行中的哪一行??从inserted中选择PartyID-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点@marc_s:我同意您的评估,但是如果insert有多行,它不会给子查询返回的值带来多个错误吗?我不希望触发器中的查询与触发器外的查询有不同的工作方式。@BenThul:是的,可能-你在这个问题上是对的。整个触发器本身就是有缺陷的。我相信数据库HVCActivityBooking.BookingStatus不存在。请同时提供表结构。您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。每个语句将触发一次触发器,所以如果您的语句更新25行,则将触发一次触发器,但插入的伪表将包含25行。您的代码将在此处选择这25行中的哪一行??从inserted中选择PartyID-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点@marc_s:我同意您的评估,但是如果insert有多行,它不会给子查询返回的值带来多个错误吗?我不希望触发器中的查询与触发器外的查询有不同的工作方式。@BenThul:是的,可能-你在这个问题上是对的。整个触发器都有缺陷,谢谢你。我将条件从DELETE查询移动到SELECT as BookingStatus在HVCBookings中,而不是你提到的HVCActivityBookings,新手错误。再次感谢汉克斯。我将条件从DELETE查询移动到SELECT as BookingStatus在HVCBookings中,而不是你提到的HVCActivityBookings,新手错误。再次感谢