1

私は SQL サーバーの初心者であり、支払期限が過ぎている顧客のステータスを「ブロック済み」に挿入/更新するトリガーを作成するタスクがあります。

トリガー内で次のようなことを確認するにはどうすればよいですか?

if getdate() > dateDue
then update status = 'Blocked'
end if

事前にご協力いただきありがとうございます

4

3 に答える 3

1

永続化されていない計算列を作成するというMartinの提案の実装は次のとおりです。

ALTER TABLE dbo.YourTable 
ADD Status AS CASE WHEN DueDate < GETDATE() THEN 'Blocked' ELSE 'Not Blocked' END
于 2012-11-12T22:22:27.070 に答える
0

私はこれを実際にテストする時間がないので、いくつかの問題/構文の問題があるかもしれませんが、これはあなたにそれをどうやって行うかについてのアイデアを与えるはずです。基本的に、「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;
于 2012-11-12T21:17:35.320 に答える
0

レコードの dueDate が変更されたときにのみ更新するのではなく、dueDate が < 今日になったときにこのステータスを更新する場合は、SQL サーバー エージェントを介してストアド プロシージャをスケジュールし、単純な更新を実行してステータスを設定する必要があります。 dueDate < 今日のすべてのレコード。これは、毎晩、または毎時間、または必要に応じて実行できます。

エージェントを実行したくない場合は、コードを記述した Windows サービスを使用して実行することもできますが (セットアップが面倒です)、Windows タスクから実行するバッチ ファイルを使用することもできますが、明らかにエージェントはこれを行う最も便利な方法。

于 2012-11-12T21:45:06.207 に答える