2013-02-15 197 views
1

我需要爲我的表創建一個包含數百萬個插入的觸發器。插入SQL Server 2000觸發器

該觸發器會向我發送一封電子郵件(已完成),表示該表正在通電。

該電子郵件只能在插入開始時發送一次(每天一次)。

換句話說,我想這樣做:

Create trigger on table T1 on FIRST INSERT; EXEC my procedure to send email 

不是作爲一個開發者,我真的不知道該怎麼寫......

謝謝你的幫助。

+3

你不能有一個'在第一次INSERT' - 無論它是在** **全部插入,或什麼都沒有。 – 2013-02-15 15:57:34

+0

如果您想使用電子郵件,那麼我認爲您的要求並不是要確切知道第一個「插入」發生的時間,而是要知道您的加載過程已經開始。如果是這樣,您可以創建一個每5分鐘運行一次的SQL作業,並檢查表中是否有新行(取決於數據的方式)。如果有新行,則發送電子郵件,否則什麼也不做。更好的做法是將通知構建到加載過程本身,但我認爲它不在您的控制範圍之內,或者您不需要此解決方案。 – Pondlife 2013-02-15 16:55:28

回答

1

你不能輕易做一個ON FIRST INSERT觸發器。

你可以做的是這樣的:

  • 創建一個普通ON INSERT觸發器,向您發送電子郵件
  • 在那個觸發結束,禁用該觸發器:

    ALTER TABLE dbo.YourTable DISABLE TRIGGER YourTriggerNameHere 
    

這將防止觸發器反覆發射並向您發送大量電子郵件。

然後,您還需要一個SQL代理作業,該作業將在晚上再次啓用該觸發器 - 以便它可以在第二天的第一次插入時再次觸發。

更新: OK,所以你的情況這將是:

CREATE TRIGGER sendMail 
ON MyTable AFTER INSERT 
AS 
    EXEC master.dbo.MyProcedure 

    ALTER TABLE dbo.MyTable DISABLE TRIGGER sendMail 

,並在晚上你的SQL代理作業,你需要:

ALTER TABLE dbo.MyTable ENABLE TRIGGER sendMail 
+0

正是我在想什麼。它每天完成一次,但我不知道是否可以啓用和禁用觸發器... – 2013-02-15 16:08:06

+0

所以我的腳本會是這樣的(如果我錯了,請糾正我): CREATE TRIGGER sendMail ON MyTable AFTER INSERT AS EXEC master.dbo.MyProcedure //如何關閉它? – 2013-02-15 16:14:28

+0

@ user2076126:更新了我的答案,詳細說明了如何禁用和重新啓用觸發器 – 2013-02-15 16:20:58

0

你不能直接觸發第一次更新的觸發器。

但是,您可以有一張表,記錄您何時發送電子郵件以及哪些表格,並且在觸發器中您可以詢問當天是否有記錄,如果不存在,請將其插入該表格中,打電話給你。

你的sp也可以做這個檢查。

0

爲什麼沒有你最近一次發送電子郵件時,是否還在觸發器中更新了表?然後,你可以在觸發查詢此表,並決定是否要發出另一個上

create trigger tr 
on tab after insert 
as 
begin 
    declare @today datetime; 
    set @today = cast(convert(varchar(32), getdate(), 112) as datetime); 

    if not exists(select * from logtab where logdate = @today) 
    begin 
     -- Send the email 
     exec sendMail 

     -- Update Log Table 
     update logtab 
      set logdate = @today 
    end 
end 
GO