如果我在尝试禁用 SQL 服务器触发器之前检查它是否已启用,会有帮助吗?
Will it help if I check if a SQL Server trigger is enabled before I try to disable it?
我正在解决 SQL 服务器数据库中的一些性能问题,我发现的其中一件事是存储过程经常禁用和重新启用触发器。我很想有权力和时间重新设计这个东西,这样它就不会这样做,但我没有。
就目前情况而言,一个存储过程禁用触发器,然后另一个存储过程执行并想要禁用同一触发器是完全可能的。我的想法是否正确,当这种情况发生时,第二个存储过程将不得不等待第一个存储过程重新启用触发器并释放它在 table 上的 Sch-M 锁,以便第二个存储过程可以获取它自己的锁并禁用刚刚重新启用的第一个存储过程的触发器吗?如果是这样,如果我修改存储过程以在尝试禁用触发器之前检查触发器是否已被禁用,是否会有帮助?
Am I right in thinking that when this happens, the second stored procedure will have to wait for the first stored procedure to re-enable the trigger and release
是的,只要第一个过程保持交易打开。
If so, would it help at all if I modified the stored procedures to check if the trigger is already disabled before attempting to disable it?
您可以通过检查 sys.triggers
上的 is_disabled 来执行此操作,但是这样做时您必须读取 with (nolock)
(读取未提交的隔离级别)。
Nick说的很对,你误入雷区了。请注意,当第一个过程运行时,您将无法修改 table 中的数据
我正在解决 SQL 服务器数据库中的一些性能问题,我发现的其中一件事是存储过程经常禁用和重新启用触发器。我很想有权力和时间重新设计这个东西,这样它就不会这样做,但我没有。
就目前情况而言,一个存储过程禁用触发器,然后另一个存储过程执行并想要禁用同一触发器是完全可能的。我的想法是否正确,当这种情况发生时,第二个存储过程将不得不等待第一个存储过程重新启用触发器并释放它在 table 上的 Sch-M 锁,以便第二个存储过程可以获取它自己的锁并禁用刚刚重新启用的第一个存储过程的触发器吗?如果是这样,如果我修改存储过程以在尝试禁用触发器之前检查触发器是否已被禁用,是否会有帮助?
Am I right in thinking that when this happens, the second stored procedure will have to wait for the first stored procedure to re-enable the trigger and release
是的,只要第一个过程保持交易打开。
If so, would it help at all if I modified the stored procedures to check if the trigger is already disabled before attempting to disable it?
您可以通过检查 sys.triggers
上的 is_disabled 来执行此操作,但是这样做时您必须读取 with (nolock)
(读取未提交的隔离级别)。
Nick说的很对,你误入雷区了。请注意,当第一个过程运行时,您将无法修改 table 中的数据