SQL Server触发器无法解释

时间:2016-08-09 10:05:04

标签: sql-server tsql triggers

我在桌子上有一个触发器。它是一个非常简单的触发器,设置为插入后,发送给我一封电子邮件。由于我已经触发了该触发器,我每隔5或6分钟左右就会收到系统发送的电子邮件。只有一个问题。 每当我收到一封电子邮件时,表格都是EMPTY

这是我的触发器

USE [didaprod]
GO
/****** Object:  Trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail]    Script Date: 09-08-2016 11:59:41 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail] on [dbo].[Caseplayer_CaseId_Restore]

AFTER INSERT
as

    SET NOCOUNT ON

    declare @tekst nvarchar(500);

    set @tekst = 'caseid sat til null på caseplayer! Tjek Caseplayer_CaseId_Restore tabel!' + convert(varchar,getdate(),105);

    EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail',
                                @recipients = 'kk@byggeevaluering.dk',
                                @subject = 'CASEID SAT TIL NULL!!!',
                                @body = @tekst

    SET NOCOUNT OFF
GO

我试图在表格中手动插入一行或几行,只是为了检查,是的,当有适当的插入时触发器也会触发。但我无法解释为什么我一直收到电子邮件!至于桌子本身,它没什么特别的。

USE [didaprod]
GO

/****** Object:  Table [dbo].[Caseplayer_CaseId_Restore]    Script Date: 09-08-2016 12:04:46 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Caseplayer_CaseId_Restore](
    [Id] [int] NOT NULL,
    [CaseId] [int] NOT NULL,
    [TimeOfChange] [datetime] NOT NULL
) ON [PRIMARY]

GO

我现在已禁用触发器,并确认电子邮件已停止。但这似乎对我来说几乎是一个神奇的问题,我很乐意得到答案。

假设我

delete from [Caseplayer_CaseId_Restore]

然后单独离开桌子。 我还会收到系统发来的电子邮件,告诉我查看表格。当我然后执行

select * from [Caseplayer_CaseId_Restore]

表格为空

1 个答案:

答案 0 :(得分:3)

SQL Server每语句触发一次,而不是每触发一次。这就是为什么编写适当使用inserted的触发器来处理它可能包含1,多个或行的事实的重要性。

我怀疑这是后一种情况。 (即,一个实际插入零行的定期执行的INSERT语句)

所以,你可能想要这样的东西:

CREATE trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail]
            on [dbo].[Caseplayer_CaseId_Restore]

AFTER INSERT
as

    SET NOCOUNT ON

    IF EXISTS(select * from inserted)
    BEGIN
      declare @tekst nvarchar(500);

      set @tekst = 'caseid sat til null på caseplayer! Tjek Caseplayer_CaseId_Restore tabel!' + convert(varchar,getdate(),105);

      EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail',
                                @recipients = 'kk@byggeevaluering.dk',
                                @subject = 'CASEID SAT TIL NULL!!!',
                                @body = @tekst

    END