sql-server - 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 无法处理的死锁,因为涉及的资源之一超出了 SQL 范围(命令行)。
问题是,当您完成插入时,触发器会被激活,而不会释放被占用的独占锁testtrigger
。然后testtrigger
尝试选择结束,但由于仍然存在锁定,因此选择需要等待这些锁定被释放,这是永远不会发生的事情,因为您在等待选择时没有关闭事务。
因此创建了文件,但由于死锁,插入和选择从未完成。你会看到它通过添加更新命令来工作:
'bcp "select * from inserted with(nolock)" queryout c:/test.txt -c -t -T -S localhost'
当然,不建议使用整个方法,但我希望它可以帮助您了解情况。
推荐阅读
- python - 如何对 csv 文件中包含逗号的数字求和?
- ios - DateFormatter 给出不正确的结果
- elasticsearch - 如何检查弹性搜索无痛参数中是否存在密钥?
- java - 功能 If/else cannot run correct_app android use Accelerometer
- openshift - 通过模板创建 dockercfg secret
- elixir - **所有**测试完成后如何清理测试数据库?
- python - 从html中提取基于字体系列类型的文本
- java - Java:通过 TCP 从 python 脚本接收包含元组的列表列表
- r - R ftpUplad 错误:无法打开连接
- apache-spark - 用于结构化流的 Elasticsearch spark 连接