среда, 4 сентября 2019 г.

Запуск SQL триггера ежечасно

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

ALTER TRIGGER [dbo].[NewRawTrigger] ON [dbo].[Source_table]
   AFTER INSERT
AS

По-идее можно вызывать триггер и после обновления таблицы, но  опять же обновление должно происходить довольно часто чтобы не прозевать момент.

Далее объявляем и задаем переменные. Здесь mytable - это та таблица, куда нужно ежечасно добавлять данные в данном случае будет просто добавляться время добавления новой строки (time_start)

DECLARE @maxid AS INT
DECLARE @nexttime AS INT

SET @maxid = (SELECT MAX(id) FROM mytable)
SET @nexttime = (SELECT DATEDIFF(HOUR,time_start,GETDATE())  FROM [mydb].[dbo].[mytable] where id=@maxid)
ну и потом идет тело триггера

IF @nexttime>=1
BEGIN
INSERT INTO mytable (time_start,time_now) VALUES (GETDATE(),GETDATE())
END
Update mytable SET
time_now = GETDATE()
  where id=@maxid 

короче вся фишка в переменной nexttime - это разница между текущим временем и временем записанным в нашу таблицу tima_start как только это время превысит один час в таблицу добаляется новая строка со значением текущего времени в каждом столбце. на самом деле time_now даже и не нужен, он использовался в моем триггере для расчета скоростей. ну в общем как-то так. Я думаю если кто-то реально натолкнется на это описание из гугла, он сможет понять что имелось ввиду

Комментариев нет:

Отправить комментарий