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

Откуда:
Сообщений: 81
Есть таблица, на ней триггер типа AFTER. ПРи массовом обновлении таблиц триггер вызывается только к первой записи, но не ко всем. Чего за бред?

В документации такого ограничения я не усмотрел.

Спасибо.
15 сен 05, 16:07    [1881427]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
он вызывается 1 раз для всех ... это же не ИБ
15 сен 05, 16:11    [1881458]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
а почему в help об этом не написано?

и что такое ИБ?
15 сен 05, 16:13    [1881463]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Glory
Member

Откуда:
Сообщений: 104760
Паша Б.
а почему в help об этом не написано?

и что такое ИБ?

-Написано
-ИБ это наверное СУБД по имени Interbase
15 сен 05, 16:19    [1881486]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
Коллеги!
Значит нет никаких способов сделать это в одной транзакции?

Значит нужно курсор и т.д.?...
15 сен 05, 16:25    [1881518]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Glory
Member

Откуда:
Сообщений: 104760
Паша Б.
Коллеги!
Значит нет никаких способов сделать это в одной транзакции?

Значит нужно курсор и т.д.?...

Что "это" ?
15 сен 05, 16:26    [1881523]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Паша Б.
Коллеги!
Значит нет никаких способов сделать это в одной транзакции?

Значит нужно курсор и т.д.?...


Скорее всего не нужно. Точно станет известным, когда Вы приведете текст своего триггера.
15 сен 05, 16:27    [1881527]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
В документации такого ограничения я не усмотрел.


Ну, это не ограничение:

mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\createdb.chm::/cm_8_des_08_3ypf.htm
15 сен 05, 16:28    [1881536]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
2Паша Б.: триггер вызывается ДЛЯ ОПЕРАЦИИ в целом, неважно, происходит ли при этом апдейт одной строки, миллиона или вообще ничего не затрагивается.

Читайте хелп на CREATE TRIGGER, обратив внимание на псевдотаблицы inserted и deleted.
15 сен 05, 16:28    [1881540]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
Так в них-то и должны быть новые значения.
А в deleted старые.

Триггер у меня на update.

Не ясно чем огрничен SQLserver что он не может вызывать триггер для каждой записи?
15 сен 05, 16:36    [1881588]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
Не ясно чем огрничен SQLserver что он не может вызывать триггер для каждой записи?

Зачем вызывать для каждой записи, если можно для всего набора сразу?
15 сен 05, 16:37    [1881592]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Паша Б.
Не ясно чем огрничен SQLserver что он не может вызывать триггер для каждой записи?


Или Вы приводите текст триггера, и мы находим решения, используя "ограничения" сиквела или ...
15 сен 05, 16:38    [1881596]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
CREATE TRIGGER Search_people ON dbo.Person
FOR INSERT, UPDATE
AS
begin
declare @id bigint
select @id=id from inserted
update Person
set F=rtrim(ltrim(lower(Surname))), I=rtrim(ltrim(lower(Firstname))), O=rtrim(ltrim(lower(Secondname)))
where id=@id
end
15 сен 05, 16:53    [1881677]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
Для всей таблицы пересчитывать сразу нельзя, так как это затормозит сервак.

Ждать же нельзя до ночи - специфика бизнеса.
15 сен 05, 16:55    [1881687]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
CREATE TRIGGER Search_people ON dbo.Person 
FOR INSERT, UPDATE
AS
begin
set nocount on

update a
set F=rtrim(ltrim(lower(Surname))), I=rtrim(ltrim(lower(Firstname))), O=rtrim(ltrim(lower(Secondname)))
from Persons a
inner join inserted b on a.id = b.id

end
15 сен 05, 16:57    [1881709]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
ChA
Member

Откуда: Москва
Сообщений: 11129
Паша Б.
И что мешает сделать так
CREATE TRIGGER Search_people ON dbo.Person 
FOR INSERT, UPDATE
AS
	update Person
	set F=rtrim(ltrim(lower(Surname))),  I=rtrim(ltrim(lower(Firstname))), O=rtrim(ltrim(lower(Secondname)))
	where id IN (SELECT id from inserted)
end
?
15 сен 05, 16:57    [1881711]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Glory
Member

Откуда:
Сообщений: 104760
Паша Б.
Для всей таблицы пересчитывать сразу нельзя, так как это затормозит сервак.

Ждать же нельзя до ночи - специфика бизнеса.

А держать транзакцию и вместе с ней блокировку - это ничего для специфики бизнеса ?
15 сен 05, 16:58    [1881720]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
ChA
Member

Откуда: Москва
Сообщений: 11129
ChA
sorry, забыл выбросить end
CREATE TRIGGER Search_people ON dbo.Person 
FOR INSERT, UPDATE
AS
	update Person
	set F=rtrim(ltrim(lower(Surname))),  I=rtrim(ltrim(lower(Firstname))), O=rtrim(ltrim(lower(Secondname)))
	where id IN (SELECT id from inserted)
15 сен 05, 17:02    [1881743]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
И SET NOCOUNT ON я б в начало добавил.
15 сен 05, 17:03    [1881750]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
pkarklin
И SET NOCOUNT ON я б в начало добавил.

И запрос я б написал через join. На всякий случай.
15 сен 05, 17:04    [1881756]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
ChA
Member

Откуда: Москва
Сообщений: 11129
pkarklin
SET NOCOUNT ON
Предпочитаю делать установку на сессию, а не плодить SET NOCOUNT ON в обязательном порядке практически в любой "чих". Впрочем, дело вкуса...
15 сен 05, 17:05    [1881764]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
понял,
попробую,
но я был уверен, что триггер вызывается для каждой записи,
а не для всего процесса в целом
15 сен 05, 17:07    [1881770]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
ChA
Member

Откуда: Москва
Сообщений: 11129
Гавриленко Сергей Алексеевич
На всякий случай.
Предпочитаю ANSI-шный, по возможности, вариант из множества. IMHO, IN выглядит более понятно и естественно. Опять же дело вкуса... :)
15 сен 05, 17:08    [1881775]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Паша Б.
Member

Откуда:
Сообщений: 81
Glory
Паша Б.
Для всей таблицы пересчитывать сразу нельзя, так как это затормозит сервак.

Ждать же нельзя до ночи - специфика бизнеса.

А держать транзакцию и вместе с ней блокировку - это ничего для специфики бизнеса ?


А что возможно провести апдейт без проведения транзакции вообще?

Предложи лучший вариант.

Можно обосновать всё что угодно. Например, что питаться вредно и ходить тоже. И жить тоже вредно!
15 сен 05, 17:11    [1881795]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггеру типа After  [new]
Glory
Member

Откуда:
Сообщений: 104760
Паша Б.
Glory

А держать транзакцию и вместе с ней блокировку - это ничего для специфики бизнеса ?


А что возможно провести апдейт без проведения транзакции вообще?

Предложи лучший вариант.

Можно обосновать всё что угодно. Например, что питаться вредно и ходить тоже. И жить тоже вредно!


- Без транзкций нельзя. Можно в длинной транзакции, а можно в короткой. Разницу, я думаю, вы понимаете

- Я бы предложил вариант, только я не хочу по словам "Для всей таблицы пересчитывать" и " ПРи массовом обновлении таблиц" за вас придумывать ни структуры таблиц, ни реализуемую на этих таблицах задачу.

- Вот вы по-моему как раз этим и занимаетесь "Для всей таблицы пересчитывать сразу нельзя, так как это затормозит сервак"
15 сен 05, 17:18    [1881836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить