【发布时间】:2016-06-07 14:05:46
【问题描述】:
我在 SQL Server 2014 中使用 FileTable,需要运行一个可执行文件来解析任何插入/更新/删除文件的文件名,然后可执行文件将解析的信息插入到数据库的其他表中名字。我不希望 .exe 运行很长时间,但如果遇到问题,我不想长时间锁定它。
例如:
CREATE PROCEDURE filename_parser
@name nvarchar(255)
AS
BEGIN
DECLARE @exe nvarchar(255)
SET @exe = 'c:\test\my.exe "' + @name + '"'
EXEC master..xp_cmdshell @exe
END
GO
如果我从INSERT 或UPDATE 触发器运行存储过程,例如:
USE [db_1]
GO
CREATE TRIGGER [dbo].[i_table_a]
ON
[dbo].[table_a]
AFTER
INSERT
AS
DECLARE @file nvarchar(255)
SELECT TOP 1
@file = name
FROM
inserted
EXEC filename_parser @name = @file
我最终会锁定table_a 直到可执行文件完成吗?对不起,如果答案很明显。我还没有找到一个直截了当的答案。任何帮助/指向适当的方向表示赞赏。
相关链接:
Do stored procedures lock tables/rows?
SQL Server - How to lock a table until a stored procedure finishes
【问题讨论】:
-
您有 .exe 的源代码吗?也许 try/catch 可以优雅地处理任何问题,记录它们(以便您稍后分析、调试),然后快速退出。
-
确实,我有尝试/捕获。我认为它的记录速度足够快。我开始向数据库添加许多触发器,因为它们是我从旧系统升级到新系统所必需的,而旧系统数据仍在创建中,而新系统需要数据。虽然我明白你的意思,但我对所有需要做的事情思考得越多,核心问题就越与我的情况有关,即触发器是否会在存储过程完成之前锁定表。
-
微软文档说 xp_cmdshell 将同步运行。触发器也同步运行。所以,如果你的 exe 卡住了,它会挂起触发器,这将挂起插入和其他东西。 msdn.microsoft.com/en-us/library/ms175046.aspx#remarks
-
发布为答案,我会接受
标签: sql-server stored-procedures triggers