0

ログ ファイルからのインポートによって新しいレコードが挿入された DB テーブルがあります。特定の新しいフィールドが入力されたときにアラートを送信するジョブを書きたいと思います。今のところ、そのフィールドの一意のエントリの数を確認しており、設定値が増加するとアラートが表示されます。問題は、毎回戻ってクエリのカウントを更新する必要があることです。だから、これを行う別の方法があるかどうか疑問に思っています。

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 = 'joe@mail.com',
    @copy_recipients = 'pete@mail.com',
    @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 フィールドも更新されます。clientKey フィールドは私に関係するものであり、clientkey には複数の行が存在する可能性がありますが、まだ挿入されていない新しいキーがいつ挿入されるかを知る必要があります。

4

1 に答える 1

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

after トリガーでは、テーブルに挿入したばかりの行と以前に存在した行を区別できる必要があるため、ロジックは少し複雑になります。テーブルに主キーがあると仮定すると、次のように言えます。

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
于 2012-07-05T14:02:24.707 に答える