我在SQL Server 2014中使用FileTable,需要运行一个可执行文件来分析任何插入/更新/删除文件的文件名,然后执行可执行文件在数据库的其他表中插入从名称解析的信息。我不希望.exe长时间运行,但如果遇到问题,我不想长时间锁定它。SQL Server 2014:具有存储过程的FileTable触发器w/xp_cmdshell
例如:
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会优雅地处理任何问题,记录它们(这样你可以分析,稍后调试),然后快速退出。 – tgolisch
确实,我有尝试/捕获。它的记录速度足够我假设。我开始为数据库添加许多触发器,因为它们对于我从旧系统升级到新系统是必要的,而旧系统数据仍在创建,而较新的系统需要这些数据。虽然我看到你的观点,但我更关注所有需要完成的事情,关于我的情况的核心问题就越多,也就是说,在存储过程完成之前,触发器是否锁定表。 – GibralterTop
Microsoft文档说xp_cmdshell将同步运行。触发器也同步运行。所以,如果你的exe被卡住了,它会挂起触发器,这将挂起插入和其他东西。 https://msdn.microsoft.com/en-us/library/ms175046.aspx#remarks – tgolisch