2016-05-11 2 views
0

Я написал триггер, который при обновлении или вставке запускает скрипт. Однако, когда запускается триггер, он заканчивает блокировку моей базы данных, и я должен сделать перезапуск, чтобы снова выполнять запросы. Я не вижу ничего в триггере, который мог бы вызвать это.Триггер SQL Server, запускающий внешний файл сценария

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[CALCULATEDFIELDS] 
ON [dbo].[custom_values] 
AFTER INSERT, UPDATE 
AS 
    SET NOCOUNT ON; 

    DECLARE @CUSTOMIZED_ID VARCHAR(15) 

    SELECT @CUSTOMIZED_ID = (SELECT customized_id FROM inserted) 

    BEGIN 
     DECLARE @OUTSTRING varchar(300) 

     BEGIN 
      IF NOT @CUSTOMIZED_ID IS NULL 
       SELECT @OUTSTRING = '\\DRIVE\Folder\Script.vbs '+ @CUSTOMIZED_ID 
      ELSE 
       SELECT @OUTSTRING = '\\DRIVE\Folder\Script.vbs '+ @CUSTOMIZED_ID 

      EXEC master..xp_cmdshell @OUTSTRING, NO_OUTPUT 
     END 
    END 
+1

У вашего триггера есть ** ОСНОВНАЯ ** ошибка в том, что вы, кажется, считаете, что она будет называться ** один раз в строке ** - это ** не ** случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваш оператор 'INSERT', который вызывает этот триггер для запуска вставки 25 строк, вы получите триггер, запущенный ** один раз **, но тогда псевдо-таблица' Inserted' будет содержат 25 строк. Какой из этих 25 строк будет выбран ваш код? 'SELECT customized_id FROM вставлен' - он не детерминирован, вы получите ** одну произвольную строку **, и вы будете ** игнорируете все остальные строки **. Для этого нужно переписать триггер! –

+0

Будет ли это иметь значение в том случае, если строка «customized_id» будет одинаковой для каждой вставленной строки? Мне просто нужно получить эту ценность, когда будет сделано обновление или вставка. – AlexF11

ответ

0

следующее утверждение не имеет никакого смысла:

SELECT @CUSTOMIZED_ID = (SELECT customized_id FROM inserted) 

И если на самом деле в конечном итоге к ошибке, как это:

Msg 512, Level 16, State 1, Line 6 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

Таким образом, он должен иметь больше смысла (как ваш customized_id всегда один и тот же):

SELECT TOP 1 @CUSTOMIZED_ID = customized_id FROM inserted 

К вашей проблеме «блокировки»:

Вы пытались запустить свое обновление (и триггер) без запуска сценария?

-- EXEC master..xp_cmdshell @OUTSTRING, NO_OUTPUT 

Работает ли ваше обновление? Если да, похоже, что ваш скрипт слишком длинный или у вас есть какая-то другая проблема. Выполняется ли ваш скрипт после обновления? Вы это проверили?

Кроме того, почему вы делаете следующее? Вы в любом случае называете сценарий, или я ошибаюсь?

IF NOT @CUSTOMIZED_ID IS NULL 
+0

Итак, я сделал свое первое изменение раньше. Я также понял, что я глупо покинул msgbox в своем скрипте, который, вероятно, заставлял его никогда не завершать – AlexF11

+0

, по-видимому, он все еще не работает, должны быть некоторые дополнительные проблемы. Чтобы проверить скрипт, я запустил его через окно запроса, он завершил и вернул NULL, как и следовало ожидать. Затем я удалил else, так как он был избыточным и закомментировал выполнение скрипта, обновление прошло успешно. Теперь, чтобы понять, почему линия EXEC не работает внутри триггера, но отлично работает за ее пределами. – AlexF11

+0

Можете ли вы опубликовать сценарий обновления, с которым запускается триггер? Можете ли вы также изменить свой скрипт vbs на ничего, чтобы увидеть, правильно ли вызван сценарий триггером (и ничего не делает). В этом случае вы будете уверены, что триггер работает нормально, и скрипт правильно вызывается, но тогда вы знаете, что внутри скрипта есть проблема. – Reboon

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