2016-06-07 4 views
1

Я использую FileTable в SQL Server 2014 и должен запустить исполняемый файл, который анализирует имя файла любого вставленного/обновленного/удаленного файла, а затем, в свою очередь, исполняемый файл вставляет в другие таблицы в базе данных информацию, которая была проанализирована из имени. Я не ожидаю, что .exe будет работать долго, но если он столкнется с проблемами, я не хочу блокировать его в течение длительного периода времени.SQL Server 2014: FileTable Trigger с хранимой процедурой 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

+0

У вас есть исходный код для вашего .exe? Возможно, try/catch будет изящно обрабатывать любые проблемы, регистрировать их (чтобы вы могли анализировать, отлаживать позже) и быстро выйти. – tgolisch

+0

Действительно, я попробовал/поймал. Я предполагаю, что он достаточно быстро регистрируется. Я начинаю добавлять множество триггеров в базы данных, хотя мне необходимо обновить их от старых систем до более новых, тогда как старые системные данные все еще создаются, а новые системы нуждаются в данных. Хотя я вижу вашу точку зрения, чем больше я думаю обо всем, что нужно сделать, тем больше основной вопрос относится к моей ситуации, то есть, является ли триггер блокировкой таблицы до завершения хранимой процедуры. – GibralterTop

+0

Microsoft docs говорит, что xp_cmdshell будет работать синхронно. Триггеры также запускаются синхронно. Итак, если ваш exe застрянет, он повесит триггер, который повесит вставку и другие вещи. https://msdn.microsoft.com/en-us/library/ms175046.aspx#remarks – tgolisch

ответ

1

документы Microsoft говорят xp_cmdshell будет работать синхронно. Триггеры также запускаются синхронно. Итак, если ваш exe застрянет, он повесит триггер, который повесит вставку и другие вещи. msdn.microsoft.com/en-us/library/ms175046.aspx#remarks

Смежные вопросы