2016-08-09 15 views
1

テーブルにトリガーがあります。これは非常に簡単なトリガーで、挿入後に設定すると、私に電子メールを送信します。私はそのトリガーをオンにして以来、5〜6分ごとにシステムから電子メールが送られてきました。ただ1つの問題があります。私は電子メールを受信するたびに は、テーブルには、ここで SQL Serverのトリガーが原因不明です。

はちょうどチェックし、私の私は手動で行を挿入しようとした

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 = '[email protected]', 
           @subject = 'CASEID SAT TIL NULL!!!', 
           @body = @tekst 

    SET NOCOUNT OFF 
GO 

トリガー、またはテーブル内の行のカップルでEMPTYですまた、適切な挿入物がある場合は、トリガーも発火します。しかし、なぜ私は電子メールを受け続けているのか説明できません!テーブルそのものは、何も気にしない。

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

が他ののSPで処理され、このテーブルのですか?他の機能がこのテーブルの行をチェックして処理し、最終的にそれらを削除する可能性はありますか? –

+0

完全に新しいテーブルです。特定の基準が満たされるたびに、「復元」テーブルに行を挿入する「CasePlayers」と呼ばれる別のテーブルでトリガーが発生していることを除いて、何もそれと対話しません。これは私がテストし、期待どおりに実行します。この全部のことは、私たちが持っているレガシーシステムのせいで、たまに自殺しようとしていて、毎回caseplayersテーブルの特定のフィールドをリセットしています。ケースプレイヤーの私のトリガーは、私の復元テーブルに復元を実行するために必要なものを挿入するだけなので、バックアップに頼る必要はありませんが、代わりに簡単なステートメントを作成することができます。 –

答えて

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 = '[email protected]', 
           @subject = 'CASEID SAT TIL NULL!!!', 
           @body = @tekst 

    END 
+0

私は多くのことを理解しており、それぞれの声明について電子メールを受け取っても構いません。私が経験していることは、私の心の中で「魔法」にかなり近いです。私の質問を更新する –

+1

@ KasparKjeldsen - しかし、私が作っているのは、誰かが 'INSERT ... SELECT ... WHERE 0 = 1'(または行を返さないselect文)を書いていると、 INSERT'トリガが発生しますが、行は追加されません。 –

+0

私は今あなたの意見を理解していると思います。最初はそれを手に入れなかったのは残念です。私はあなたのソリューションを試してみましょう。 –

関連する問題