我创建了一个触发器,该触发器是“键入后更新”,并且此更新命令(在其内部)可以再次调用主触发器。如何对SQL Server说如果在更新触发器被调用之后又没有再次调用主触发器。
答案 0 :(得分:2)
* * * * * cd /path-to-your-project && php artisan schedule:run --env=scheduler >> /dev/null 2>&1
要防止从触发器内部更新表时触发器无限期地递归,您可以使用COLUMNS_UPDATED()
测试哪些列已更新,然后在更新模式只能来自触发器内部时返回。例如
COLUMNS_UPDATED()
ALTER trigger [dbo].[MyTable_Trigger]
on [dbo].[MyTable]
for insert, update, delete
as
begin
set nocount on;
declare @ColumnsUpdated varbinary(10) = COLUMNS_UPDATED();
-- Ignore trigger updates
-- Identify specific pattern for trigger update, knowing it may change if the table structure changes
if @ColumnsUpdated = 0x00000000000000008000 return;
-- rest of trigger
end
您可以使用@@NESTLEVEL
来检测您是在第一个触发呼叫中还是在以后的触发呼叫中。对于直接更新,@@NESTLEVEL
在第一个调用中将为1,在第二个调用中为2。如果您从存储过程中执行更新-对于每个嵌套存储过程一次,则会增加这种情况。
答案 1 :(得分:1)
递归触发器
AFTER触发器不会递归调用自身,除非 设置了RECURSIVE_TRIGGERS数据库选项。
来自文档:Recursive Triggers