繁体   English   中英

SQL Server 触发器的问题

[英]Issues with SQL Server trigger

我创建了一个 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'

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

尝试在 INSERT 之后制作触发器,然后从“插入的”伪表而不是实际的表“testdb”导出。 新插入的行将被导出。

create trigger testtrigger on testdb
after insert
as
if exists (select * from inserted)
    begin
        declare @sql        varchar(8000),
                @guidName   char(36)=newid();
        
        SELECT @sql = concat('bcp "select * from inserted" queryout c:/',
                             @guidName, '.txt -c -t -T -S localhost');

        exec xp_cmdshell @sql
    end
go

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM