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

Откуда:
Сообщений: 6
Добрый день, уважаемые форумчане!

Столкнулся со следующей задачей:
имеется триггер, который после добавления в таблицу N записи отправляет на e-mail результаты по определенному запросу.
Часто случается, что данные, по которым формируется запрос еще не успели обновиться (обновление происходит одновременно с добавлением новой записи в таблицу N и может занимать некоторое время). Если ли возможность в MS SQL сервере запустить триггер через некоторое время.


Попробовал использовать WAITFOR DELAY '00:05', но при использовании данной команды, программное обеспечение, с помощью которого добавляется запись в таблицу N так же зависает на 5 минут.

В общем виде триггер выглядит следующим образом:

ALTER TRIGGER [dbo].[] ON [dbo].[N]
AFTER INSERT
AS
BEGIN
WAITFOR DELAY '00:05';

declare @recipients varchar(255)
set @recipients='123@123.ru';

/* текст сообщения  */
declare @text as varchar(2000)
SET @text = '1233'

 /* отправка письма */
EXEC msdb.dbo.sp_send_dbmail
			@recipients = @recipients,
			@subject = '123',
			@body = @text,
			@body_format= 'HTML',
			@profile_name= '123';
END;


Прошу прощения, если описал что-то неграмотно, имею только базовые знаю по T-SQL.
8 окт 15, 09:09    [18250576]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2385
Блог
Andrey_51rus,

Пусть триггер готовит сообщение, а отправляет его фоновый процесс. Как передать фоновому процессу - решайте сами. Очередь, промежуточная табличка.
8 окт 15, 09:14    [18250598]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Andrey_51rus
Member

Откуда:
Сообщений: 6
Павел Воронцов,
сообщение, которое готовит триггер, это как раз результат запроса по другим таблицам, которые к моменту запуска триггера не всегда успевают обновиться. Нужно именно отложить запуск результатирующего запроса по таблицам.
8 окт 15, 09:52    [18250799]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
Andrey_51rus
Павел Воронцов,
сообщение, которое готовит триггер, это как раз результат запроса по другим таблицам, которые к моменту запуска триггера не всегда успевают обновиться. Нужно именно отложить запуск результатирующего запроса по таблицам.

Как вариант -
1. При срабатывании триггера в некую таблицу пишется результирующий запрос, возвращающий данные для отправки.
2. На эту некую таблицу тоже ставится триггер, срабатывающий на INSERT, который и отправляет письмо. Пока данные не сформируются и не вставятся - он не сработает.
8 окт 15, 10:04    [18250869]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey_51rus
имеется триггер, который после добавления в таблицу N записи отправляет на e-mail результаты по определенному запросу.
Часто случается, что данные, по которым формируется запрос еще не успели обновиться (обновление происходит одновременно с добавлением новой записи в таблицу N и может занимать некоторое время). Если ли возможность в MS SQL сервере запустить триггер через некоторое время.

Что-то у вас в консерватории не так
Если данные не готовы, то почему происходит добавление куда-то ?
И как может иметь место "обновление происходит одновременно с добавлением новой записи в таблицу" в одном соединении, где все команды выполняются последовательно ?
8 окт 15, 10:04    [18250872]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Andrey_51rus
Member

Откуда:
Сообщений: 6
Glory,
Спорить не буду, как я уже писал ранее, мои познания в MS SQL невысоки.

Обновление, возможно, и не происходит одновременно, а выполняется после добавления записи в таблицу N.
Мне необходимо отложить на 5 минут действия выполняемые триггером, возможно ли это? +)
8 окт 15, 10:25    [18251050]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey_51rus
Спорить не буду, как я уже писал ранее, мои познания в MS SQL невысоки.

Тут не в знаниях MSSQL дело, а в элементарной логике

Andrey_51rus
Обновление, возможно, и не происходит одновременно, а выполняется после добавления записи в таблицу N.

И почему обновления не происходят ДО добавления ?
8 окт 15, 10:26    [18251065]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Andrey_51rus
Member

Откуда:
Сообщений: 6
Glory,

Потому что добавление записи в таблицу N и обновление таблиц, по которым формируется результатирующий запрос происходит разными модулями ПО, хотя приблизительно в одно и то же время.
8 окт 15, 10:35    [18251133]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey_51rus
Потому что добавление записи в таблицу N и обновление таблиц, по которым формируется результатирующий запрос происходит разными модулями ПО, хотя приблизительно в одно и то же время.

У вас "модуль ПО" означает отдельное соединение с сервером ?
Т.е. вы хотите, чтобы триггер на INSERT на самом деле срабатывал не на INSERT, а на какое то другое событие ?

ЗЫ
Я же говорю - дело в отсутствии элементарной логики.
8 окт 15, 10:38    [18251147]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Andrey_51rus
Member

Откуда:
Сообщений: 6
Glory,

Модуль ПО - отдельное соединение с сервером.
Обдумал твое замечание: нет, я хочу, чтобы триггер срабатывал именно на триггер insert, но спустя 5 минут.
По обновлению данных в других таблицах не возможно определить следует ли отправлять сообщение пользователю или нет.

Опишу пример.

Есть информация о документе в таблице DOC, информация о статусе документа в таблице DOC_ST, информация о содержимом документа в таблице DOC_CONT и таблица с характеристиками содержимого документа CONTENT.

DOC ссылается на DOC_ST, DOC_CONT; DOC_CONT ссылается на CONTENT.

Информация в таблице CONTENT обновляется независимо от обновления других таблиц.
Информация в таблицы DOC, DOC_CONT, DOC_ST добавляется последовательно.

Необходимо отправлять сообщение пользователю после того, как в таблицу DOC_ST добавится строка с определенными данными. При этом желательно дождаться, чтобы данные в таблице CONTENT успели обновиться.

Насколько логична такая модель работы предлагаю не обсуждать, так уже есть.
8 окт 15, 11:45    [18251718]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey_51rus
Обдумал твое замечание: нет, я хочу, чтобы триггер срабатывал именно на триггер insert, но спустя 5 минут.

Логика по прежнему хромает
Триггер срабатывает на событие, а не на время.

Если вам нужен триггер на множество асинхронных событий, то это уже не триггер

Andrey_51rus
Насколько логична такая модель работы предлагаю не обсуждать, так уже есть.

Предлагаю тогда не обсуждать, как мне из триггера сделать какую-то фигню. Так уж есть
8 окт 15, 11:50    [18251752]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Andrey_51rus
Member

Откуда:
Сообщений: 6
Glory,

Я правильно понимаю, что если сделать обращение из триггера к хранимой процедуре, то триггер будет продолжать работу, пока не будет выполнена процедура?
8 окт 15, 11:55    [18251796]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2385
Блог
Andrey_51rus
Glory,

Я правильно понимаю, что если сделать обращение из триггера к хранимой процедуре, то триггер будет продолжать работу, пока не будет выполнена процедура?
Есть синхронные и несинхронные операции. Синхронные выполняются друг за другом, гуськом. Вызов процедуры - синхронная операция. Следовательно - да, так и будет.

Разберитесь когда и кто должен посылать сообщение. Ну или попытайтесь таки описать что ж вам на самом деле нужно.
8 окт 15, 11:59    [18251831]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey_51rus
Я правильно понимаю, что если сделать обращение из триггера к хранимой процедуре, то триггер будет продолжать работу, пока не будет выполнена процедура?

Правильно.
И транзакция со всеми блокировками будет продолжать существовать
8 окт 15, 12:00    [18251837]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Andrey_51rus,

Могу предложить два варианта

1) Отправить сообщение через Service Broker и при его обработке ожидать до указанного времени
2) Запустить JOB синхронно
8 окт 15, 12:51    [18252189]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Andrey_51rus
Павел Воронцов,
сообщение, которое готовит триггер, это как раз результат запроса по другим таблицам, которые к моменту запуска триггера не всегда успевают обновиться. Нужно именно отложить запуск результатирующего запроса по таблицам.


Никогда не программируйте, исходя из допущений. Например, допускаете, что где-то что-то не обновилось или обновилось. Вы должны однозначно и объективно получать информация о состоявшемся обновлении.
8 окт 15, 13:56    [18252785]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Andrey_51rus
Павел Воронцов,
сообщение, которое готовит триггер, это как раз результат запроса по другим таблицам, которые к моменту запуска триггера не всегда успевают обновиться. Нужно именно отложить запуск результатирующего запроса по таблицам.

Не успевают обновиться?
Вы в курсе, что такое таблица inserted ?
8 окт 15, 15:56    [18253832]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли запустить триггер через некоторое время?  [new]
o-o
Guest
и при чем тут inserted от *чужой* таблицы?
у него триггер на инсерт на одной, а обновляется другая.
по окончании обновления той второй надо что-то слать,
но супер-логика не дает навесить триггер на обновляемую таблицу,
только на ту, в к-ую вставка.
----
Andrey_51rus,
ответили вам уже.
в триггере кладите что-то там в очередь,
какой-то флаг к действиям,
выгребайте его асинхронно процедурой (Service Broker --> Activation Procedure),
в ней делайте свои задержки, отправки и все что угодно,
а триггеру дайте спокойно завершиться
8 окт 15, 16:22    [18254053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить