延迟 AFTER UPDATE 执行,直到其他更新过程完成
Delay AFTER UPDATE execution until other updating processes are completed
请原谅我,我对制作 SQL 服务器触发器的艺术还很陌生。
我制作了一个 SQL 服务器触发器,它将在特定 table 更新后执行 PowerShell 脚本(向实体 X 发送 JSON 消息)。脚本 运行 在 DEV 中如预期的那样成功。但是,当实例化为触发器时,它会在用户提交更新后导致前端 UI 出错。用户更新没有post,显然没有实例化触发器
我猜测它与 post 通过网络 UI 用户输入期间的 table 锁定有关,但这只是一个猜测。我应该在触发器中考虑哪些事情不会干扰前端 UI 在我的触发器 运行 之前首先更新 table 的控制过程?
这是我的(比较原始的)触发器,供大家阅读
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% 的时间里都是完美的,但我不想因为时间 and/or 对脚本的依赖而遭受更新的回滚。
以这种方式更改触发器:
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
这样你就会发现错误。
此处最可能的错误是
The EXECUTE permission was denied on the object 'xp_cmdshell',
database 'mssqlsystemresource', schema 'sys'.
除非运行您的应用程序的用户是 sysadmin
,或者被明确授予此权限,否则会发生错误。
并且回滚了整个事务,这就是 "The users update did not post".
的原因
请原谅我,我对制作 SQL 服务器触发器的艺术还很陌生。
我制作了一个 SQL 服务器触发器,它将在特定 table 更新后执行 PowerShell 脚本(向实体 X 发送 JSON 消息)。脚本 运行 在 DEV 中如预期的那样成功。但是,当实例化为触发器时,它会在用户提交更新后导致前端 UI 出错。用户更新没有post,显然没有实例化触发器
我猜测它与 post 通过网络 UI 用户输入期间的 table 锁定有关,但这只是一个猜测。我应该在触发器中考虑哪些事情不会干扰前端 UI 在我的触发器 运行 之前首先更新 table 的控制过程?
这是我的(比较原始的)触发器,供大家阅读
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% 的时间里都是完美的,但我不想因为时间 and/or 对脚本的依赖而遭受更新的回滚。
以这种方式更改触发器:
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
这样你就会发现错误。
此处最可能的错误是
The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.
除非运行您的应用程序的用户是 sysadmin
,或者被明确授予此权限,否则会发生错误。
并且回滚了整个事务,这就是 "The users update did not post".
的原因