请原谅我,我对制作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的回滚。
答案 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
,或者明确授予此权限,否则将发生错误。
整个交易被回滚,这就是为什么"用户更新没有发布"。