Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server插入触发器_Sql_Sql Server 2008_If Statement_Triggers - Fatal编程技术网

SQL server插入触发器

SQL server插入触发器,sql,sql-server-2008,if-statement,triggers,Sql,Sql Server 2008,If Statement,Triggers,我是SQL server的新手,我的任务是创建一个触发器,该触发器将在逾期付款时插入/更新客户状态为“已阻止” 我怎么能在一个触发器内检查说下面这样的话 if getdate() > dateDue then update status = 'Blocked' end if 非常感谢您提前提供的帮助我没有时间真正测试这一点,因此可能会出现一些问题/语法问题,但这里有一些东西可以让您了解如何进行测试。基本上,只要“dateDue”的值发生更改,您的触发器就会触发。如果更新了多条记录,它应该

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

我怎么能在一个触发器内检查说下面这样的话

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

非常感谢您提前提供的帮助

我没有时间真正测试这一点,因此可能会出现一些问题/语法问题,但这里有一些东西可以让您了解如何进行测试。基本上,只要“dateDue”的值发生更改,您的触发器就会触发。如果更新了多条记录,它应该遍历“inserted”值;对于“inserted”中的每条记录,如果新的“dateDue”值大于当前时间,则更新该记录并将状态设置为“Blocked”

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;
创建触发器myTriggerName
在我的桌子上
插入后,更新
作为
如果更新(截止日期)
开始
声明@currPk INT
声明@currDateDue-DATETIME
声明@today DATETIME
声明插入的\u光标用于
从中选择myTableID、dateDue、GETDATE()
打开插入的光标;
从插入的光标获取下一个到@currPk、@currDateDue、@today
而@@FETCH\u STATUS=0
开始
如果(@currDateDue<@今天)
更新myTable集状态='Blocked',其中myTableID=@currPk
从插入的光标获取下一个到@currPk、@currDateDue、@today
结束;
关闭插入的光标;
释放插入的光标;
结束;

我没有时间真正测试这一点,因此可能会有一些问题/语法问题,但这里有一些东西可以让您了解如何进行测试。基本上,只要“dateDue”的值发生更改,您的触发器就会触发。如果更新了多条记录,它应该遍历“inserted”值;对于“inserted”中的每条记录,如果新的“dateDue”值大于当前时间,则更新该记录并将状态设置为“Blocked”

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;
创建触发器myTriggerName
在我的桌子上
插入后,更新
作为
如果更新(截止日期)
开始
声明@currPk INT
声明@currDateDue-DATETIME
声明@today DATETIME
声明插入的\u光标用于
从中选择myTableID、dateDue、GETDATE()
打开插入的光标;
从插入的光标获取下一个到@currPk、@currDateDue、@today
而@@FETCH\u STATUS=0
开始
如果(@currDateDue<@今天)
更新myTable集状态='Blocked',其中myTableID=@currPk
从插入的光标获取下一个到@currPk、@currDateDue、@today
结束;
关闭插入的光标;
释放插入的光标;
结束;

如果希望在dueDate变为<今天时更新此状态,而不是仅在修改记录的dueDate时更新,则应通过SQL Server Agent计划一个存储过程,并让它运行一个简单的更新来设置dueDate<今天的任何记录的状态。你可以每晚跑步,或者每小时跑步,或者你需要的任何东西


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

如果您想在dueDate变为<今天时更新此状态,与仅在修改记录的dueDate时更新它不同,您应该通过SQL Server代理计划一个存储过程,并让它运行一个简单的更新来设置dueDate<今天的任何记录的状态。你可以每晚跑步,或者每小时跑步,或者你需要的任何东西


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

下面是Martin建议创建的一个实现:

altertable dbo.YourTable
将状态添加为DueDate
以下是Martin关于创建一个

altertable dbo.YourTable
将状态添加为DueDate
你不能这样做,因为触发器不会根据时间触发。最好在
选择时检查
getdate
vs
duedate
。您可以使用此逻辑创建非持久化计算列。说“您不能”不是真的。。。当然,您可以有一个只有在修改dateDue后才会触发的触发器,如果dateDue小于当前时间,则可以在触发器正文中更新该记录的状态。@Jim如果dateDue设置为未来的一周,但后来选择了未来的一个月,该怎么办?如果dueDate在此期间没有更新,那么如果它依赖于触发器的触发,那么状态将不准确。随着时间的推移,问题并不是很清楚-它只是问如何使用触发器进行更新。我提供了第二个答案,基本上就是从代理运行一个存储过程来检查/更新记录的状态。最好在
选择时检查
getdate
vs
duedate
。您可以使用此逻辑创建非持久化计算列。说“您不能”不是真的。。。当然,您可以有一个只有在修改dateDue后才会触发的触发器,如果dateDue小于当前时间,则可以在触发器正文中更新该记录的状态。@Jim如果dateDue设置为未来的一周,但后来选择了未来的一个月,该怎么办?如果dueDate在此期间没有更新,那么如果它依赖于触发器的触发,那么状态将不准确。随着时间的推移,问题并不是很清楚-它只是问如何使用触发器进行更新。我提供了第二个答案,基本上就是从代理运行一个存储过程来检查/更新记录的状态?应该能够在一次更新中实现完全相同的逻辑