私は SQL サーバーの初心者であり、支払期限が過ぎている顧客のステータスを「ブロック済み」に挿入/更新するトリガーを作成するタスクがあります。
トリガー内で次のようなことを確認するにはどうすればよいですか?
if getdate() > dateDue
then update status = 'Blocked'
end if
事前にご協力いただきありがとうございます
私は SQL サーバーの初心者であり、支払期限が過ぎている顧客のステータスを「ブロック済み」に挿入/更新するトリガーを作成するタスクがあります。
トリガー内で次のようなことを確認するにはどうすればよいですか?
if getdate() > dateDue
then update status = 'Blocked'
end if
事前にご協力いただきありがとうございます
永続化されていない計算列を作成するというMartinの提案の実装は次のとおりです。
ALTER TABLE dbo.YourTable
ADD Status AS CASE WHEN DueDate < GETDATE() THEN 'Blocked' ELSE 'Not Blocked' END
私はこれを実際にテストする時間がないので、いくつかの問題/構文の問題があるかもしれませんが、これはあなたにそれをどうやって行うかについてのアイデアを与えるはずです。基本的に、「dateDue」の値が変更されるたびにトリガーが起動する必要があります。複数のレコードが更新された場合は「挿入された」値を反復処理する必要があります。「挿入された」の各レコードについて、新しい「dateDue」値が現在の時刻よりも大きい場合は、そのレコードを更新してステータスを「」に設定します。ブロックされました」。
CREATE TRIGGER myTriggerName
ON myTable
AFTER INSERT, UPDATE
AS
IF UPDATE(dateDue)
BEGIN
DECLARE @currPk INT
DECLARE @currDateDue DATETIME
DECLARE @today DATETIME
DECLARE inserted_Cursor CURSOR FOR
SELECT myTableID, dateDue, GETDATE() FROM Inserted
OPEN inserted_Cursor;
FETCH NEXT FROM inserted_Cursor INTO @currPk, @currDateDue, @today
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@currDateDue < @today)
UPDATE myTable SET status = 'Blocked' WHERE myTableID = @currPk
FETCH NEXT FROM inserted_Cursor INTO @currPk, @currDateDue, @today
END;
CLOSE inserted_Cursor;
DEALLOCATE inserted_Cursor;
END;
レコードの dueDate が変更されたときにのみ更新するのではなく、dueDate が < 今日になったときにこのステータスを更新する場合は、SQL サーバー エージェントを介してストアド プロシージャをスケジュールし、単純な更新を実行してステータスを設定する必要があります。 dueDate < 今日のすべてのレコード。これは、毎晩、または毎時間、または必要に応じて実行できます。
エージェントを実行したくない場合は、コードを記述した Windows サービスを使用して実行することもできますが (セットアップが面倒です)、Windows タスクから実行するバッチ ファイルを使用することもできますが、明らかにエージェントはこれを行う最も便利な方法。