Я пытаюсь запустить пакетный файл в триггере 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;
Я не знаю, что не так. Я искал ответ и не могу его найти. Как я уже сказал, все работает отлично само по себе, но когда все вместе, оно остается в процессе выполнения. Любая помощь будет принята с благодарностью.
@Larnu CMDSQL остался, я его отредактирую. Какое другое решение вы бы предложили?
Никто не может предложить здесь альтернативного решения, пока мы не поймем, что вы пытаетесь сделать. Я полностью согласен с тем, что запуск командного файла в триггере - не лучший подход. Это кричит, что это проблема xy. xyproblem.info
Когда таблица возможностей обновляется, я хочу запустить сценарий, чтобы получить последнее изменение и вывести его в текстовый файл.
Это приложение делает UPDATE? Я бы посоветовал сделать это в приложении, поскольку у вас нет доступа к SSIS или агенту SQL Server.
Ваше последнее объяснение доказывает мне, что это проблема xy. Вывод данных в текстовый файл - это огромный красный флаг, указывающий на то, что что-то пошло не так в структуре процесса. Чего вы ДЕЙСТВИТЕЛЬНО пытаетесь достичь? Какая здесь конечная цель? Я предполагаю, что есть гораздо лучший способ решить эту проблему.
Нет, обновление будет производиться по запросу.
@SeanLange, моя конечная цель - получить измененную информацию и использовать ее где-нибудь еще.
Вместо этого используйте таблицу истории и проанализируйте ее.
Я согласен с @Larnu. Поместите данные в таблицу и попросите логику где-нибудь еще запросить эту таблицу. Вы же не хотите, чтобы ваш триггер ждал выполнения таких действий, как запись данных во внешние файлы.
Так что было бы лучше сделать это запланированное пакетное задание вместо того, чтобы вызывать пакетный файл каждый раз при обновлении?
Вам не нужно создавать пакетный файл, если он просто используется для создания истории ваших данных.
Я хочу потом что-то сделать с этими данными в пакетном файле
Дайте определение «сделать что-нибудь». Лично я считаю, что вам нужно задать новый вопрос, объясняющий, что вы делаете в своем командном файле, наряду с вашими целями и как вести журнал ваших данных (возможно, отдельные вопросы, первый за вторым).


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