2012-07-05 46 views
0

我有一個數據庫表,它具有通過從日誌文件導入插入的新記錄。我想寫一個作業,當一個特定的新字段被輸入時發送一個警報。到目前爲止,我一直在檢查該字段中唯一條目的數量,當它增加設置值時,我會收到警報。問題是每次我需要返回並更新查詢中的計數。所以只是想知道是否有另一種方式來做到這一點。將新值輸入到特定列時的操作

Declare @count as int 
select @count = count(clientkey) from QueryData group by clientkey 
If @@ROWCOUNT > 18 

EXEC msdb.dbo.sp_send_dbmail @profile_name='DB Admin', 
    @recipients = '[email protected]', 
    @copy_recipients = '[email protected]', 
    @subject = 'GPDB Warning', 
    @body = 'A new clientkey is being used in the QueryData table' 

欣賞任何響應

編輯:

CREATE TABLE [dbo].[QueryData](
[ImportDate] [datetime] NULL, 
[clientKey] [nvarchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[QueryTerms] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[UpdatedDate] [datetime] NULL, 
[LastSearchDate] [datetime] NULL, 
[QueryActivity] AS (datediff(day,[UpdatedDate],[LastSearchDate])) PERSISTED, 
[ImportMethod] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[PowerField] [nvarchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY] 

所以當發生進口importdate被更新,updatedDate場也被更新。客戶端密鑰字段是我關心的一個,客戶端密鑰可以有多行,但我需要知道何時插入了一個尚未插入的新密鑰。

回答

1

你可以用這個來代替觸發器。唯一複雜的是,你必須重複INSERT ...

CREATE TRIGGER dbo.QueryData_NewClientKey 
ON dbo.QueryData 
INSTEAD OF INSERT 
AS 
BEGIN 
    IF EXISTS (SELECT 1 FROM inserted AS i 
    LEFT OUTER JOIN dbo.QueryData AS q 
    ON i.clientkey = q.clientkey 
    WHERE q.clientkey IS NULL 
) 
    BEGIN 
    -- send your e-mail here 
    END 

    INSERT dbo.QueryData(column1, columns2, etc.) 
    SELECT column1, column2, etc. FROM inserted; 
END 
GO 

隨着扳機後,你需要有能力,你只需插入到表之前存在的行和列進行區分,所以邏輯稍微複雜一些。假設你在桌面上有一個主鍵,你可以說:

CREATE TRIGGER dbo.QueryData_NewClientKey 
ON dbo.QueryData 
FOR INSERT 
AS 
BEGIN 
    IF EXISTS (SELECT 1 FROM dbo.QueryData AS new_data 
    INNER JOIN inserted AS i 
    ON new_data.key = i.key 
    LEFT OUTER JOIN dbo.QueryData AS old_data 
    ON i.clientkey = old_data.clientkey 
    AND i.key <> old_data.key 
    WHERE old_data.key IS NULL 
) 
    BEGIN 
    -- send your e-mail 
    END 
END 
GO 
+0

感謝您的迴應非常有幫助。在我實現之前,只是想補充說我有一個日期列,當自動導入發生時更新,所以我可以應用到上面的第二個建議(觸發後) – vbNewbie 2012-07-05 14:07:01

+0

@vbNewbie爲什麼,你自己設置日期值?你知道在觸發器中找到的所有行都會比表中的任何行都大嗎?你的桌子沒有主鍵嗎? – 2012-07-05 14:08:56

+0

我其實不是。其他人處理導入,但日期在文件導入發生時自動更新。該表沒有主鍵。我將添加上面的表格的結構 – vbNewbie 2012-07-05 14:14:20