1

我是 SQL Server 的新手,我的任务是创建一个触发器,该触发器将在付款逾期时插入/更新客户的状态为“已阻止”。

我如何检查是否在触发器中说出类似以下内容?

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 Sever Agent 安排一个存储过程并让它运行一个简单的更新来设置状态对于到期日期 < 今天的任何记录。你可以每晚运行一次,或者每小时运行一次,或者任何你需要的。

如果您不想运行代理,您可以使用您为其编写代码的 Windows 服务(设置起来更麻烦),甚至是从 Windows 任务运行的批处理文件,但显然代理是最方便的方法。

于 2012-11-12T21:45:06.207 回答