Sql Server 触发器的应用

Sql Server 触发器:指的是 在进行  Insert 、Update、Delete时 所执行的操作

我们可以在进行增删改操作的同时对其他数据进行操作。其实触发器算是一种存储过程,只不过执行的机制 只是在进行增删改操作时执行;

  应用场景:

   需求: 由于业务的需要,需要做一个统计报表,根据角色不同展示相应的四个系统的设备数据;

       如果按照查询各个库中设备的数据汇总到一块,这样查询效率很低;

  解决方案:

  • 创建一个设备统计表;
  • 使用SQL Server触发器,每增加、删除 设备数据时,同时触发一条 新增或者更新该设备数量的操作,往我们创建的设备统计表插入或更新数据即可;这样,我们直接根据统计表的数据去展现就好了。

  具体操作(这只是一个Demo,大家可以根据业务拓展)

  

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER Trigger_Device_Count ON dbo.Device
    FOR INSERT, DELETE
AS
    BEGIN
        DECLARE @UserCode NVARCHAR(50)
        DECLARE @Count INT
        DECLARE @IsHave INT

        --判断该触发操作是Insert 还是Delete ,获取UserCode
        SELECT  @UserCode = UserCode
        FROM    Inserted
        IF @UserCode IS NOT NULL
            BEGIN
                SET @UserCode = @UserCode
            END
        ELSE
            BEGIN
                SELECT  @UserCode = UserCode
                FROM    Deleted
            END
        
        --根据得到的UserCode  获取最新的设备总数
        SELECT  @Count = COUNT(0)
        FROM    dbo.Device
        WHERE   UserCode = @UserCode

        --查询统计表是否存在该设备数据,没有则新增,有则更新
        SELECT  @IsHave = COUNT(0)
        FROM    dbo.[Statistics] 
    
        IF @IsHave <= 0
            BEGIN
                INSERT  INTO dbo.[Statistics]
                        ( Id, DeviceCount, UserCode )
                VALUES  ( NEWID(), -- Id - uniqueidentifier
                          @Count, -- DeviceCount - int
                          @UserCode  -- UserCode - nvarchar(50)
                          )
            END
        ELSE
            BEGIN
                UPDATE  dbo.[Statistics]
                SET     DeviceCount = @Count
                WHERE   UserCode = @UserCode
            END
    END
GO

 设备表Device、统计表 Statistics

CREATE TABLE [dbo].[Device](
    [Id] [UNIQUEIDENTIFIER] NOT NULL,
    [DeviceCode] [NVARCHAR](50) NULL,
    [DeviceType] [NVARCHAR](50) NULL,
    [UserCode] [NVARCHAR](50) NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Statistics](
    [Id] [UNIQUEIDENTIFIER] NOT NULL,
    [DeviceCount] [INT] NULL,
    [UserCode] [NVARCHAR](50) NULL
) ON [PRIMARY]

GO

猜你喜欢

转载自www.cnblogs.com/HubertBiyo/p/9649589.html