列上的 MSSQL 触发器更新

杰斯帕·塔普

我有 2 个表,我希望表 1 有一个触发器,可以在表 2 中插入或更新,但我不知道该怎么做。

表格1:

CREATE TABLE [dbo].[DevicePorts](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [IsInUse] [bit] NOT NULL,
)

表 2:

CREATE TABLE [dbo].[DevicePortActivities](
    [ID] [uniqueidentifier] NOT NULL,
    [StartTime] [datetimeoffset](7) NOT NULL,
    [EndTime] [datetimeoffset](7) NULL,
    [FK_DevicePortID] [int] NOT NULL FOREIGN KEY REFERENCES DevicePorts(ID),
)

我的触发器开始:

CREATE TRIGGER PortInUse
   ON  DevicePorts
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (IsInUse) 
    BEGIN
        IF IsInUse = 1
        THEN
            INSERT INTO [dbo].[DevicePortActivities]
            (
                [ID]
                ,[StartTime]
                ,[EndTime]
                ,[FK_DevicePortID]
            )
            VALUES
            (
                NEWID(),
                SYSDATETIMEOFFSET(),
                null,
                <DevicePortID>
            )
        ELSE 
            UPDATE [dbo].[DevicePortActivities]
            SET EndTime = SYSDATETIMEOFFSET()
            WHERE FK_DevicePortID = <DevicePortID> AND EndTime is null
        END
    END 
END
GO

我想要做的是当“IsInUse”被修改时,它应该在“DevicePortActivities”或更新中插入一行。

条件是,如果 'IsInUse' 为真,则应插入一条记录,如果为假,则应更新最后一条记录,其中 'EndTime' 为空。

Damien_The_Unbeliever

你需要把它inserted当作一张桌子我建议寻找MERGE这个(因为不同的行可能有不同的更改应用UPDATE)。

就像是:

CREATE TRIGGER PortInUse
   ON  DevicePorts
   AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    MERGE INTO [dbo].[DevicePortActivities] t
    USING (select i.ID,i.IsInUse as NewUse,d.IsInUse as OldUse
        from inserted i inner join deleted d on i.ID = d.ID) s
    ON
        t.FK_DevicePortID = s.ID
    WHEN MATCHED AND t.EndTime is null AND NewUse = 0 and OldUse = 1
    THEN UPDATE SET EndTime = SYSDATETIMEOFFSET()
    WHEN NOT MATCHED AND NewUse = 1 and OldUse = 0
    THEN INSERT ([ID]
                ,[StartTime]
                ,[EndTime]
                ,[FK_DevicePortID])
         VALUES (NEWID(),
                SYSDATETIMEOFFSET(),
                null,
                s.ID);
END

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章