Tsql 而不是更新触发器是最好的选择吗
我必须检查表何时插入/更新,以查看同一表中是否存在相同HotelID和不同RoomNo的列值。我认为表上的INSTEAD OF触发器是一个不错的选择,但我了解到在触发器内部更新/插入触发器执行的表是一个坏主意,您应该在视图上创建触发器,这会给我带来更多问题 创建这样的触发器可以吗?有更好的选择吗Tsql 而不是更新触发器是最好的选择吗,tsql,Tsql,我必须检查表何时插入/更新,以查看同一表中是否存在相同HotelID和不同RoomNo的列值。我认为表上的INSTEAD OF触发器是一个不错的选择,但我了解到在触发器内部更新/插入触发器执行的表是一个坏主意,您应该在视图上创建触发器,这会给我带来更多问题 创建这样的触发器可以吗?有更好的选择吗 CREATE TRIGGER dbo.tgr_tblInterfaceRoomMappingUpsert ON dbo.tblInterfaceRoomMapping INSTEAD OF
CREATE TRIGGER dbo.tgr_tblInterfaceRoomMappingUpsert
ON dbo.tblInterfaceRoomMapping
INSTEAD OF INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @txtRoomNo nvarchar(20)
SELECT @txtRoomNo = Sonifi_RoomNo
FROM dbo.tblInterfaceRoomMapping r
INNER JOIN INSERTED i
ON r.iHotelID = i.iHotelID
AND r.Sonifi_RoomNo = i.Sonifi_RoomNo
AND r.txtRoomNo <> i.txtRoomNo
IF @txtRoomNo IS NULL
BEGIN
-- Insert/update the record
END
ELSE
BEGIN
-- Raise error
END
END
GO
像那样制造一个触发器通常是不好的
您的触发器假设只有一行更新或插入才会发生-这有保证吗
如果在同一批中插入或更新多行,@txtRoomNo的值是多少
例如,如果对表执行更新,导致1行数据正确,1行数据不正确,您认为触发器在这种情况下会如何处理?记住触发器在每次插入/更新时触发一次,而不是每行触发一次
根据您的要求,您可以保留替代触发器的概念,但是我建议为插入和更新使用单独的触发器
然后,您可以在每个中插入/更新并包含where not exists子句,以仅允许有效的插入/更新,而忽略插入或更新任何无效的内容
我可以避免在触发器中引发错误,如果您需要处理坏数据,还可以使用相反的where exists逻辑插入到一些日志表中,然后单独处理
但最终,应用程序最好检查roomNo是否已被使用。因此,听起来您只希望HotelID和Sonifi_roomNo的组合中有一行
CREATE UNIQUE INDEX UQ_dbo_tblInterfaceRoomMapping
ON dbo.tblInterfaceRoomMapping(HotelID,Sonifi_RoomNo)
现在,如果您尝试使用相同的值放置第二行,它将向您发出吠声。您试图防止哪种类型的数据重复?我通常会说,您应该使用唯一索引来防止数据复制,而不是错误触发。我们需要确保Sonifi_RoomNo不会为具有相同iHotelID的不同RoomNo复制。例如,该表有一条记录,其中HotelID=123、RoomNo=200和Sonifi_RoomNo=200。我们无法插入HotelID=123、RoomNo=201和Sonifi_RoomNo=200的记录,因为Sonifi_RoomNo 200已分配给RoomNo 200。有没有一种不用扳机就能实现的方法?我想这就是我想要的。我来测试一下。谢谢