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

Откуда:
Сообщений: 56
Про триггеры много написано и мною перечитано, но разобраться с ними не получается.
Помогите, кто может.

Задача простая
существует таблица table с полями
id
car
rec
dateen
timeen
и еще десятком, которые меня не интересуют

Я хочу следить за этой таблицей (а также в дальнейшем еще за несколькими) и записывать данные в одну табличку trigger_result для оптимизации кода. Сейчас я при каждом запросе удаляю и создаю новую таблицу и наполняю ее данными через Php код, что создает массу проблем.
CREATE TABLE dbo.trigger_result (
	id  char(15) NULL,
	car  char(50) NULL,
	rec  char(50) NULL,
	datetimein  DATETIME NULL
) 


Для этого создаю первый триггер следящий за Insert
CREATE TRIGGER dbo.insert_trigger ON dbo.table
FOR INSERT
AS
 INSERT INTO dbo.trigger_result (id, car, rec, datetimein) 
 SELECT id, car, rec, dateen+timeen from inserted

Этот триггер срабатывает и строка в trigger_result появляется. Но строка в table изначально пуста и заполняется постепенно, поэтому и в таблице trigger_result тоже пустая строка за исключением id

Теперь мне нужно следить за изменением существующих записей в таблице table, поэтому по аналогии пишу триггер на update
CREATE TRIGGER dbo.update_trigger ON dbo.table
FOR UPDATE
AS
UPDATE dbo.trigger_result 
SET
car = (SELECT car from inserted), 
rec = (SELECT rec from inserted), 
datetimein = (SELECT dateen+timeen from inserted)
WHERE id = (SELECT id from inserted)


И вроде бы этот триггер создался, каким-то образом работает, но его наличие вызывает ошибку в БД. База данных очень большая - табличка table всего лишь ее часть. Что здесь не правильно, или не правильна вся логика создания таких триггеров? Подскажите кто и как решил бы такую задачу.

Спасибо за внимание и желание помочь.
8 ноя 13, 17:45    [15099158]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WHERE id = (SELECT id from inserted)
Если в inserted миллион записей, то как с этим миллионом id
сервер будет сравнивать id из каждой строки dbo.trigger_result?
8 ноя 13, 17:56    [15099210]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
WHERE id = (SELECT id from inserted)
Если в inserted миллион записей, то как с этим миллионом id
сервер будет сравнивать id из каждой строки dbo.trigger_result?
Кроме этого, у Вас ещё много ошибок в проектировании и логике.
Например, если подзапросы в SET вернут более одной записи, что будет?
8 ноя 13, 17:59    [15099217]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
iap, я пока с большим трудом представляю работу триггеров на уроне кода, но кажется начинаю понимать, то есть, такая конструкция может сработать только с одной записью?
Тогда как построить триггер, чтобы было неважно сколько записей обновилось? И вообще не понятно, ведь update в любом случае происходит с одной записью в одно мгновение, в которое триггер и должен сработать. Или не так?
8 ноя 13, 18:09    [15099260]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ELEKTpoHuK
iap, я пока с большим трудом представляю работу триггеров на уроне кода, но кажется начинаю понимать, то есть, такая конструкция может сработать только с одной записью?
Тогда как построить триггер, чтобы было неважно сколько записей обновилось? И вообще не понятно, ведь update в любом случае происходит с одной записью в одно мгновение, в которое триггер и должен сработать. Или не так?
Не так.Надо всегда помнить, что в таблицах inserted и deleted может быть сколько угодно записей.
И использовать с ними JOINы и коррелированные подзапросы, как с любыми другими таблицами.
8 ноя 13, 18:38    [15099400]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
iap,
Прошу прощения - пока не понимаю.
Если на пхп, то я перебираю результат в цикле (1000 строк) и делаю update where id =
А как быть здесь? Тоже запустить перебор в цикле?

Если не сложно, то можете простой триггер на подобный Update показать?
8 ноя 13, 18:47    [15099441]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
ELEKTpoHuK
Прошу прощения - пока не понимаю.
Триггер - это просто хранимая процедура, которая вызывается после успешной попытки изменения таблицы.
В этой процедуре можно сделать что угодно, хоть запросы, хоть циклы.

ELEKTpoHuK
Если не сложно, то можете простой триггер на подобный Update показать?

CREATE TRIGGER dbo.update_trigger ON dbo.table
FOR UPDATE
AS
UPDATE r 
SET	car = i.car,
	rec = i.rec,
	datetimein = i.dateen + i.timeen	-- Это что за сложение времени???
FROM dbo.trigger_result r
	INNER JOIN inserted i
		ON i.id = r.id
9 ноя 13, 01:28    [15101308]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Grammar nazi
AFTER UPDATE AS
И понятнее и по стандарту.
:-P

автор
перебираю результат в цикле (1000 строк)
Матерь божья.

Хотя, чё греха таить, стандартный APPLY в .Net адаптере (ADO?) тоже кое что делает построчно.
Что при наличии MERGE и OUTPUT уже напрягает.

ELEKTpoHuK, мне на вашем месте было бы банально любопытно реализовать не построчно, а одной командой, скопом.
Хотя лучше спросить alexeyvg о более пеформансном API варианте.
9 ноя 13, 07:32    [15101910]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
alexeyvg
Триггер - это просто хранимая процедура, которая вызывается после успешной попытки изменения таблицы.
В этой процедуре можно сделать что угодно, хоть запросы, хоть циклы.

Суть я примерно понимаю, и даже пытаюсь сделать их сам. И даже сделал простой на insert ))) Но вот дальше - тормзнул.

alexeyvg
CREATE TRIGGER dbo.update_trigger ON dbo.table
FOR UPDATE
AS
UPDATE r 
SET	car = i.car,
	rec = i.rec,
	datetimein = i.dateen + i.timeen	-- Это что за сложение времени???
FROM dbo.trigger_result r
	INNER JOIN inserted i
		ON i.id = r.id


Спасибо, завтра смогу проверить его в работе.
Сложение времени - дата хранится в одной ячейки время - в другой, я их объединяю для дальнейшего использования совместно.
10 ноя 13, 17:15    [15104987]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Mnior
Grammar nazi
AFTER UPDATE AS
И понятнее и по стандарту.
:-P

Я попробую такой вариант - спасибо.

Mnior
автор
перебираю результат в цикле (1000 строк)
Матерь божья.

ELEKTpoHuK, мне на вашем месте было бы банально любопытно реализовать не построчно, а одной командой, скопом.
Хотя лучше спросить alexeyvg о более пеформансном API варианте.


))) дело в том, что без триггеров мне приходится делать выборку, заносить все это дело в новую таблицу Insert (здесь может быть и 1000 строк), а после этого делать финальную выборку из этой таблицы - и это ужасно! Поэтому я сейчас и вникаю в триггеры. Которые позволят отслеживать изменения и держать в одной табличке нужные и актуальные данные. Одновременных Update на 1000 строк не предвидится ))
А до API варианта мне еще, видимо, далеко )
10 ноя 13, 17:21    [15105010]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
alexeyvg Спасибо - все работает.
11 ноя 13, 10:45    [15107264]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить