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