Sql server SQL Server触发器无法解释地触发

Sql server SQL Server触发器无法解释地触发,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我的桌子上有一个扳机。这是一个非常简单的触发器,设置为插入后向我发送电子邮件。自从我扣动扳机后,系统每隔5到6分钟左右就会向我发送一次电子邮件。只有一个问题。 每当我收到一封电子邮件,表格都是空的 这是我的扳机 USE [didaprod] GO /****** Object: Trigger [dbo].[Caseplayer_CaseId_Restore_insert_mail] Script Date: 09-08-2016 11:59:41 ******/ SET ANSI_NU

我的桌子上有一个扳机。这是一个非常简单的触发器,设置为插入后向我发送电子邮件。自从我扣动扳机后,系统每隔5到6分钟左右就会向我发送一次电子邮件。只有一个问题。 每当我收到一封电子邮件,表格都是空的

这是我的扳机

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]

表为空

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

此表是否由其他SP处理?是否可能有其他功能检查此表中的任何行、处理并最终删除它们?这是一个全新的表。除了我在另一个名为“CasePlayers”的表上有一个触发器外,没有任何东西与它交互,只要满足某个条件,它就会将行插入到我的“restore”表中。这是我已经测试过的,并按预期执行。这一切都是因为我们有一个遗留系统,它时不时地试图自杀,时不时地重置caseplayers表中的某个字段。我在Caseplayer上的触发器,只需在我的还原表中插入执行还原所需的内容,这样我就不必求助于备份,而是可以快速声明。我也很理解,并且不介意为每个声明都发送一封电子邮件。我所经历的,与我心中的“魔法”更为接近。更新我的question@KasparKjeldsen-但我想说的是,如果有人写了
INSERT。。。选择。。。如果0=1(或者只是任何恰好没有返回任何行的select语句),则会触发
INSERT
触发器,但没有添加任何行。我想我现在明白你的意思了。很抱歉一开始我没有收到。我会尝试一下你的解决方案。效果很好,再一次抱歉,我不得不把注意力集中在它上面。我接受了你的回答。