Триггер SQL Server зависает при выполнении

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

Я протестировал запрос и вызов пакетного файла в Microsoft SQL Server Management Studio, и оба они работают, но когда я вызываю пакетный файл в триггере, он застревает при выполнении.

Вот мой код. Сначала командный файл, затем триггер, запрос вызывающего командного файла и мой запрос для проверки триггера

@echo off
echo start
sqlcmd -S AZ7GH2\SQLEXPRESS -h -1 -i C:\Users\user1\Documents\test3.sql -o C:\Users\user1\Documents\test.txt
echo end
exit

Триггер SQL Server

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[ffupdate] 
ON [dbo].[feat] 
AFTER UPDATE
AS
BEGIN
    IF UPDATE (act)
    BEGIN
        EXEC xp_CMDShell 'C:\Users\user1\Documents\ffscript.bat'
    END
END

test3.sql (запрос вызывается пакетным файлом)

:setvar SQLCMDERRORLEVEL 1
SET NOCOUNT ON

USE [dev]

DECLARE @ver INT
SET @ver = CHANGE_TRACKING_CURRENT_VERSION() - 1

CREATE TABLE #ctb(fuid INT)  

INSERT INTO #ctb
    SELECT featid
    FROM CHANGETABLE(CHANGES feat, @ver) AS tb

SELECT fl.flg
FROM fl, #ctb
WHERE fl.fid = #ctb.fuid
GO

:setvar SQLCMDERRORLEVEL 0
SET NOCOUNT OFF

Запрос на проверку триггера

USE [dev]

UPDATE feat
SET act = 0
WHERE featid = 1;

Я не знаю, что не так. Я искал ответ и не могу его найти. Как я уже сказал, все работает отлично само по себе, но когда все вместе, оно остается в процессе выполнения. Любая помощь будет принята с благодарностью.

Честно говоря, это выглядит плохой идеей для начала. Вызов xp_cmdshell из триггера означает, что только системный администратор может UPDATE вашей таблицы. Я думаю, нам нужно понять, какова ваша настоящая цель, и найти (совсем) другое решение. Также отмечу, что вы используете DECLARE @CMDSQL VARCHAR(100) в своем триггере, однако вы больше никогда не ссылаетесь на переменную @CMDSQL. Зачем вам поэтому DECLARE это?

Larnu 28.06.2018 17:31

@Larnu CMDSQL остался, я его отредактирую. Какое другое решение вы бы предложили?

user4356 28.06.2018 17:35

Никто не может предложить здесь альтернативного решения, пока мы не поймем, что вы пытаетесь сделать. Я полностью согласен с тем, что запуск командного файла в триггере - не лучший подход. Это кричит, что это проблема xy. xyproblem.info

Sean Lange 28.06.2018 17:45

Когда таблица возможностей обновляется, я хочу запустить сценарий, чтобы получить последнее изменение и вывести его в текстовый файл.

user4356 28.06.2018 17:49

Это приложение делает UPDATE? Я бы посоветовал сделать это в приложении, поскольку у вас нет доступа к SSIS или агенту SQL Server.

Larnu 28.06.2018 17:51

Ваше последнее объяснение доказывает мне, что это проблема xy. Вывод данных в текстовый файл - это огромный красный флаг, указывающий на то, что что-то пошло не так в структуре процесса. Чего вы ДЕЙСТВИТЕЛЬНО пытаетесь достичь? Какая здесь конечная цель? Я предполагаю, что есть гораздо лучший способ решить эту проблему.

Sean Lange 28.06.2018 17:55

Нет, обновление будет производиться по запросу.

user4356 28.06.2018 17:56

@SeanLange, моя конечная цель - получить измененную информацию и использовать ее где-нибудь еще.

user4356 28.06.2018 17:57

Вместо этого используйте таблицу истории и проанализируйте ее.

Larnu 28.06.2018 18:02

Я согласен с @Larnu. Поместите данные в таблицу и попросите логику где-нибудь еще запросить эту таблицу. Вы же не хотите, чтобы ваш триггер ждал выполнения таких действий, как запись данных во внешние файлы.

Sean Lange 28.06.2018 18:09

Так что было бы лучше сделать это запланированное пакетное задание вместо того, чтобы вызывать пакетный файл каждый раз при обновлении?

user4356 28.06.2018 18:14

Вам не нужно создавать пакетный файл, если он просто используется для создания истории ваших данных.

Larnu 28.06.2018 18:15

Я хочу потом что-то сделать с этими данными в пакетном файле

user4356 28.06.2018 18:19

Дайте определение «сделать что-нибудь». Лично я считаю, что вам нужно задать новый вопрос, объясняющий, что вы делаете в своем командном файле, наряду с вашими целями и как вести журнал ваших данных (возможно, отдельные вопросы, первый за вторым).

Larnu 28.06.2018 19:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
14
484
1

Ответы 1

Вы запираетесь!

У вас есть триггер для таблицы ПОДВИГ, и когда вы обновляете одну строку (сеанс A), вы создаете новый сеанс (сеанс B через пакет), который пытается прочитать некоторую информацию о захвате в таблице ПОДВИГ.

Другие вопросы по теме