我在桌子上有一个触发器。它是一个非常简单的触发器,设置为插入后,发送给我一封电子邮件。由于我已经触发了该触发器,我每隔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]
表格为空
答案 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