插入触发器阻止整个表并处理

时间:2016-05-21 16:20:32

标签: sql-server loops block

我试图在其他程序将值插入表中时执行程序。我在表上应用了After触发器,当程序A将值插入table1时,它必须说“table1”它必须执行程序B,该程序从同一个table1获取输入。

USE [capstone]
GO
SET ANSI_NULLS ON
GO
CREATE trigger [dbo].[api_trig] on [dbo].[search]
after insert
AS
EXEC master..xp_CMDShell 'c:\Python34\python.exe c:\Python34\search_test.py'

这个search_test程序从同一个表中获取输入,即;搜索。但是,一旦我们在该表上插入或执行任何操作,它将执行很长时间,因为它进入某种循环并给出超时错误。

要停止此操作并再次访问该表,我必须通过此方法终止该进程 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/77fc7e09-ed14-481f-89d5-d5e143dab7bd/trying-to-delete-a-table-in-sql-server-management-studio-and-getting-a-strange-error?forum=sqldatabaseengine  并且错误显示程序search_test阻止了查询执行过程。 请帮助我这个我很累,找到错误的原因/解决方案 TIA

2 个答案:

答案 0 :(得分:0)

documentation says xp_cmdshell waits for the command to complete,意味着在程序运行之后,导致触发器的进程将无法释放和锁定或提交任何事务。

快速破解就是让xp_cmdshell运行一个程序,然后启动你的目标程序作为一个单独的进程然后退出。这将允许xp_cmdshell返回,触发器完成,调用者释放锁定/提交事务。

但问题是,如果在事务中运行触发器,则第二个程序可能会看到陈旧/缺失的数据。您的程序可能会在成功提交事务之前尝试访问数据,或者父项可能已回滚事务。

您应该重新设计逻辑,以便执行插入的程序在成功完成插入事务后启动第二个程序。

答案 1 :(得分:0)

从触发器内部调用外部程序真是个坏主意。

您观察到的行为只是众多潜在陷阱中的一个。

我强烈建议您重新考虑设计,并在AFTER INSERT触发器中仅执行必要的操作,并使用不同的机制来触发外部过程。

作为一个基本示例,让AFTER INSERT触发器在队列表中插入一行。并且有一个单独的外部守护进程轮询队列表中的新行。