首页 > 解决方案 > SQL Server 触发器的问题

问题描述

我创建了一个 SQL Server 触发器,如下所示。

create trigger testtrigger on testdb
for insert
as
declare @sql varchar(8000)

SELECT @sql = 'bcp "select * from testdb" queryout c:/test.txt -c -t -T -S localhost'

exec xp_cmdshell @sql

go

但是当在testdb中插入一行时,创建了文本文件,但是没有内容。有人可以帮我解决这个问题。

标签: sql-servertsqltriggers

解决方案


除了关于不使用该方法的建议之外,我会问您是否确定插入已完成。

最可能的情况是您面临死锁,以及一种 SQL 无法处理的死锁,因为涉及的资源之一超出了 SQL 范围(命令行)。

问题是,当您完成插入时,触发器会被激活,而不会释放被占用的独占锁testtrigger。然后testtrigger尝试选择结束,但由于仍然存在锁定,因此选择需要等待这些锁定被释放,这是永远不会发生的事情,因为您在等待选择时没有关闭事务。

因此创建了文件,但由于死锁,插入和选择从未完成。你会看到它通过添加更新命令来工作:

'bcp "select * from inserted with(nolock)" queryout c:/test.txt -c -t -T -S localhost'

当然,不建议使用整个方法,但我希望它可以帮助您了解情况。


推荐阅读