Tsql 而不是更新触发器是最好的选择吗

Tsql 而不是更新触发器是最好的选择吗,tsql,Tsql,我必须检查表何时插入/更新,以查看同一表中是否存在相同HotelID和不同RoomNo的列值。我认为表上的INSTEAD OF触发器是一个不错的选择,但我了解到在触发器内部更新/插入触发器执行的表是一个坏主意,您应该在视图上创建触发器,这会给我带来更多问题 创建这样的触发器可以吗?有更好的选择吗 CREATE TRIGGER dbo.tgr_tblInterfaceRoomMappingUpsert ON dbo.tblInterfaceRoomMapping INSTEAD OF

我必须检查表何时插入/更新,以查看同一表中是否存在相同HotelID和不同RoomNo的列值。我认为表上的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。有没有一种不用扳机就能实现的方法?我想这就是我想要的。我来测试一下。谢谢