延迟执行UPDATE后直到其他更新过程完成

时间:2018-01-11 02:57:29

标签: sql sql-server triggers sql-scripts

请原谅我,我对制作SQL Server触发器的技术还不熟悉。

我已经制作了一个SQL Server触发器,它将在更新特定表后执行PowerShell脚本(向实体X发送JSON消息)。该脚本在DEV中单独成功运行。但是,当实例化为触发器时,在用户提交更新后,它会在前端UI上导致错误。用户更新没有发布,显然没有实例化触发器。

我猜测它在通过Web UI发布用户输入期间与表锁有关,但这只是一个猜测。我是否应该在触发器中考虑一些不会干扰前端UI控制在触发器运行之前更新表的过程?

这是我(非常原始)触发每个人的细读

USE [Hamburger_Chefs32];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO

CREATE TRIGGER [dbo].[WD_SendIngredientsMessageOnScoreOverrideUPD] 
ON dbo.DeliciousBurgers
AFTER UPDATE
AS
BEGIN
    DECLARE @cmd sysname

    SET @cmd = 'powershell -File "E:\Program Files (x86)\TheWhopperCorporation\Burgers\v1.0.0\service\SendIngredients.ps1"'

    EXEC xp_cmdshell @cmd
END
GO   

我提前感谢你提供的任何帮助。

更新:有建议不要在TRIGGER中运行脚本,因为它必须等待它完成。好点子。有没有办法简单地执行脚本而不必等待脚本成功(1)或失败(0)?它在100%的时间内完美运行,但由于时间和/或对脚本的依赖性,我不想遭受UPDATE的回滚。

1 个答案:

答案 0 :(得分:0)

以这种方式改变你的触发器:

CREATE TRIGGER [dbo].[WD_SendIngredientsMessageOnScoreOverrideUPD] 
ON dbo.DeliciousBurgers
AFTER UPDATE
AS
BEGIN
    set xact_abort off; 
    begin try
       DECLARE @cmd sysname

       SET @cmd = 'powershell -File "E:\Program Files (x86)\TheWhopperCorporation\Burgers\v1.0.0\service\SendIngredients.ps1"'

       EXEC xp_cmdshell @cmd
   end try

    begin catch
       print ERROR_MESSAGE()
    end catch

END

这样你就可以发现错误。

这里最可能的错误是

  

对象' xp_cmdshell'上的EXECUTE权限被拒绝,   数据库' mssqlsystemresource',schema' sys'。

除非运行您的应用的用户是sysadmin,或者明确授予此权限,否则将发生错误。

整个交易被回滚,这就是为什么"用户更新没有发布"。