我是 SQL Server 的新手,我的任务是创建一个触发器,该触发器将在付款逾期时插入/更新客户的状态为“已阻止”。
我如何检查是否在触发器中说出类似以下内容?
if getdate() > dateDue
then update status = 'Blocked'
end if
非常感谢您提前提供帮助
我是 SQL Server 的新手,我的任务是创建一个触发器,该触发器将在付款逾期时插入/更新客户的状态为“已阻止”。
我如何检查是否在触发器中说出类似以下内容?
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 Sever Agent 安排一个存储过程并让它运行一个简单的更新来设置状态对于到期日期 < 今天的任何记录。你可以每晚运行一次,或者每小时运行一次,或者任何你需要的。
如果您不想运行代理,您可以使用您为其编写代码的 Windows 服务(设置起来更麻烦),甚至是从 Windows 任务运行的批处理文件,但显然代理是最方便的方法。