繁体   English   中英

SQL Server插入触发器

[英]SQL server insert trigger

我是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代理安排存储过程,并让其运行简单的更新来设置状态对于DueDate <今天的任何记录。 您可以每晚,每小时或任何您需要的速度运行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM