Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запуск процедуры по триггеру.  [new]
dermama
Member

Откуда:
Сообщений: 222
Коллеги, добрый день.

Уже были темы от меня похожие, но реализовал я процесс через триггер.
1) джоб проверяет, появилась ли новая дата в VIEW vTable_source и если появилась, то вторым шагом должен записывать эту новую дату в таблицу Table_Source, а уже триггер реагирует на новую запись и запускает основную процедуру. Однако, при включенном тригере запись в таблицу table_source новой даты из VIEW vTable_source не происходит и второй шаг джоба падает с ошибкой:Logging Error: The current transaction cannot be committed and cannot support operations that write to the lof file. Roll back the transaction. А при выключенном триггере запись в таблицу table_source из VIEW vTable_source проходит хорошо и джоб отрабатывает нормально. Без ошибок. Возможно вы сможете подсказать, что не верно, и почему при включенному тригере не отрабатывает, а при выключенном отрабатывает.?

ALTER TRIGGER start_restart_process
ON table_source
AFTER INSERT
AS
BEGIN
DECLARE @InDateTime datetime --новая дата в table_source
DECLARE @DateInitial datetime --старая дата в table_target
DECLARE @Datemodify datetime --старая дата в table_target
DECLARE @Enabled int --статус процедуры (работает, не работает)
DECLARE @FindSpid int --поиск Spid процедуры

SELECT @InDateTime = (SELECT MAX(InDateTime) FROM table_target) --находим макс дату в таблице
SELECT @DateInitial = (SELECT MAX(DateInitial) FROM table_destination) -- находим последнюю дату таблице целевой
SELECT @Datemodify = (SELECT MAX(DateModify) FROM table_destination) --находим другую максимальную дату, которая логируется другой столбец и необходима для сравнения.

SELECT @Enabled = (SELECT TOP (1) work_status_id FROM status_table WHERE source_proc = основная_процедура ORDER BY time_log desc) -- Находим статус работы процедуры
SELECT @findspid = (SELECT TOP (1) spid FROM status_table WHERE source_proc = основная_процедура ORDER BY time_log desc)
--находим Spid процедуры.

IF (@Indatetime > @DateInitial AND @Indatetime > @DateModify AND @Enabled = 5) --если в источнике дата больше чем в той таблице с которой я провожу сравнение и процеура работает - то останавливаем процедуру)

BEGIN
EXEC ('KILL '+@find_spid) --останавливаю
EXEC основная_процедура --и запускаю
END

ELSE

IF (@Indatetime > @DateInitial AND @Indatetime > @DateModify AND @Enabled != 5) --а если процедура не работала

EXEC основная_процедура

END
GO
18 сен 19, 18:09    [21973503]     Ответить | Цитировать Сообщить модератору
 Re: Запуск процедуры по триггеру.  [new]
aleks222
Member

Откуда:
Сообщений: 855
Осподи! Спаси и сохрани!!!
Откуда этот бред?

ЗЫ. Пора переквалифицироваться в управдомы.
18 сен 19, 18:14    [21973510]     Ответить | Цитировать Сообщить модератору
 Re: Запуск процедуры по триггеру.  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 501
dermama,

какое значение джоб вставляет в поле table_source.spid?
не может так быть, что триггер киляет сессию джоба?
18 сен 19, 20:16    [21973612]     Ответить | Цитировать Сообщить модератору
 Re: Запуск процедуры по триггеру.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
dermama
Возможно вы сможете подсказать, что не верно, и почему при включенному тригере не отрабатывает, а при выключенном отрабатывает.?
Это не связано.
"Не отрабатывает" - потому что вами запрограммирована такая логика в "шаге 2". Как то этот шаг зависит от наличия записей в table_source.

А запись не вставляется, потому что у вас ошибка в "основная_процедура", и она откатывает вставку.

Впрочем, вы используете какие то свои термины, может, всё совсем не так, джобов нет, или есть, но ошибка в первом шаге, ну и т.д.

PS Килять процедуру - это жесть, конечно. У вас там что, программистов нет, что ли?
18 сен 19, 20:49    [21973633]     Ответить | Цитировать Сообщить модератору
 Re: Запуск процедуры по триггеру.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
Gerros
не может так быть, что триггер киляет сессию джоба?
Легко. Он даже обращается к status_table, пытаясь что то там найти, вместо использования inserted
18 сен 19, 20:51    [21973634]     Ответить | Цитировать Сообщить модератору
 Re: Запуск процедуры по триггеру.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Это все ужасно. Особенно асинхронный kill без ожидания его завершения. В триггере. И все это без синхронизации.

Да Господи, что я только что прочитал?...

Сообщение было отредактировано: 19 сен 19, 03:01
19 сен 19, 02:14    [21973775]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить