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

Откуда:
Сообщений: 291
Уважаемые спецы! Подскажите по такому вопросу:
у меня есть таблицы, к которым применяются достаточно сложные бизнес-правила, которые обычными ограничениями (ссылочными и на значения столбцов) не реализуются. Таким образом я это делаю с помощью триггеров. Я вот подумал, что с помощью тригеров "instead of update" все будет работать быстрее, чем с помощью триггеров "after update", т.к. серваку не придется изменять саму таблицу, прежде чем сработают мои бизнес-правила, которые могут и не пропустить это изменение. (Так ли это???)
Тогда тут у меня возникла трудность с применением изменений в случае успешного выполнения бизнес-правил. Для триггеров "instead of insert" и "instead of delete" - просто в первом случае вставляем все строки из таблицы Inserted, а во втором удаляем все строки, указанные в таблице Deleted.
А вот в случае с триггером "instead of update" не все так гладко - как можно модифицировать записи таблицы, когда новые значения находятся в таблице Inserted, а старые (по которым нужно осуществлять поиск в операторе where) в таблице Deleted?!
Можно, конечно создать в таблице уникальные поля, по которым запретить изменять значения и тогда можно осуществлять поиск, используя значения только в таблице Inserted, но это ведь не изящное решение.
Так что здесь у меня возникла проблема!
8 сен 04, 00:35    [941671]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можно, конечно создать в таблице уникальные поля, по которым запретить изменять значения и тогда можно осуществлять поиск, используя значения только в таблице Inserted, но это ведь не изящное решение.
Это "неизящное решение" называется ПервичнымКлючом и вообще-то требуется у любой таблицы согласно реляционной теории.
8 сен 04, 00:56    [941673]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Mikhalich
Member

Откуда:
Сообщений: 291
Это "неизящное решение".....
Уважаемые, я знаю что такое первичный ключ, нормализация таблиц и т.п. Короче, с реляционной теорией я очень хорошо знаком.
Вы ведь не будете отрицать, что и первичный ключ может изменяться? Как мне тогда в этом случае найти измененную запись в по таблице Inserted????
Господа, мне нужны реальные советы, а не простые тыканья RTFM.
8 сен 04, 22:33    [945269]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Согласен
Guest
Mikhalich
Это "неизящное решение".....
Уважаемые, я знаю что такое первичный ключ, нормализация таблиц и т.п. Короче, с реляционной теорией я очень хорошо знаком.
Вы ведь не будете отрицать, что и первичный ключ может изменяться? Как мне тогда в этом случае найти измененную запись в по таблице Inserted????
Господа, мне нужны реальные советы, а не простые тыканья RTFM.

Первичный ключ может изменяться, а может и не изменяться, смотря как организуете.
Можете использовать искуственный ключ, неизменяемый, и связывать таблицы inserted/deleted по нему.
8 сен 04, 23:06    [945283]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
_bob
Member

Откуда: Москва
Сообщений: 1654
ну есть у Вас constraint уникальности набора полей, а зачем его использовать как первичный ключ(тем более эти поля меняться могут)?
сделайте себе автоинкрементное поле и сделайте его первичным ключом
instead вряд ли работает быстрее after триггера
9 сен 04, 09:39    [945573]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вы ведь не будете отрицать, что и первичный ключ может изменяться? Как мне тогда в этом случае найти измененную запись в по таблице Inserted????
Если естественные ПК - не буду отрицать. Суррогатные - я лично не вижу смысла в реализации такой возможности

Но если вам все таки очень нужно менять ПК, то
Варианты
- разрешить изменение ПК только по одной записи
- иметь в таблицы ПК и альтернативный ПК. И соответсвенно запрещать одновременное их изменение.

Господа, мне нужны реальные советы, а не простые тыканья RTFM.
Чтобы это не делали задавайте вопрос так, чтобы из него было видно что вы знаете. А то как еще оценить ваше "Короче, с реляционной теорией я очень хорошо знаком" ?
9 сен 04, 10:13    [945711]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Денис Авилов
Member

Откуда: Украина, Днепропетровск
Сообщений: 185
Закомая проблема, тысяча чертей!

Есть два варианта:
- не позволять множественный update (тогда в трггере таблицы Inserted и Deleted можно не связывать)
- ввести суррогатный ключ, который никогда не меняется и мо нему вязать inserted и deleted

Я предпочитаю второй вариант

Пользуясь случаем, хотелось бы выругаться на MS SQL - ну что стоило его создателям в эти таблицы добавить какое-нить поле, по которому их можно было бы объединить! Но нет, надо, чтоб все трахались! ;-)
9 сен 04, 12:24    [946528]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Пользуясь случаем, хотелось бы выругаться на MS SQL - ну что стоило его создателям в эти таблицы добавить какое-нить поле, по которому их можно было бы объединить!
А что есть СУБД в которых такая возможность реализована ?
9 сен 04, 12:28    [946554]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Денис Авилов
Member

Откуда: Украина, Днепропетровск
Сообщений: 185
А вопрос начет большей скорости Instead Of триггеров по сравнению с AFTER очччень даже интересный! (я имею в виду, конечно, не скорость выполнения запросов в триггерах, а тот факт, что в INSTEAD OF триггере сервак еще не изменил таблицу) Ты это тестил? Если это окажется верно, то было бы весьма, весьма неплохой новостью!
9 сен 04, 12:29    [946557]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
а тот факт, что в INSTEAD OF триггере сервак еще не изменил таблицу) Ты это тестил? Если это окажется верно, то было бы весьма, весьма неплохой новостью!
Если это было по другому то тогда невозможно было бы создать INSTEAD OF триггер для представлений.
9 сен 04, 12:42    [946630]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Денис Авилов
Member

Откуда: Украина, Днепропетровск
Сообщений: 185
Glory
Если это было по другому то тогда невозможно было бы создать INSTEAD OF триггер для представлений.


Я имел в виду не то, что в INSTEAD OF триггере данные еще не изменены (это и так понятно), а целесообразно ли (с точки зрения производительности) туда перемещать бизнес-логику из AFTER-триггеров.

2 Mikhalich :
А ты пробовал помещать бизнес-правила и в INSTEAD OF триггеры, и в AFTER, и потом сравнивать производительность?
9 сен 04, 12:52    [946673]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
автор
Первичный ключ может изменяться


Неа. Читаем определение ПК
9 сен 04, 14:52    [947381]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Xaarquath
Member

Откуда:
Сообщений: 82
А можно сделать AutoIncrement и без первичного ключа. То есть, необязательно делать IDENTITY PRIMARY KEY. Только что были подобные проблемы - решил автоинкрементным полем с некластерным индексом. Работает.
9 сен 04, 15:10    [947495]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
IDENTITY - это IDENTITY
PRIMARY KEY - это PRIMARY KEY
кластерный/некластреный индекс - это кластерный/некластреный индекс

Все три понятия совершенно разные и могут быть использованы в любой комбинации.
9 сен 04, 15:14    [947526]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Mikhalich
Member

Откуда:
Сообщений: 291
All
Огромное спасибо за многочисленные ответы!

Glory
извиняюсь, если не совсем корректно выразился

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

Crimean
Неа. Читаем определение ПК
Если по определению, то ПК - это поле или набор полей однозначно идентифицирующие запись. Об невозможности изменения ничего не сказано.

All
пока я склоняюсь к тому, чтобы ввести уникльное поле и по нему осуществлять поиск (если вообще производительность триггеров instead of будет выше, чем after)
Кстати, а никто не в курсе как работает процесс модификации записи? Сервак на момент исполнения after-триггера уже физически сделал изменения в таблице или он может просто каким-либо образом подсовыват измененные данные триггеру, которые находятся где-нить в ОЗУ?? тогда instead of триггеры не будут быстрее.
10 сен 04, 00:36    [949214]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Сервак на момент исполнения after-триггера уже физически сделал изменения в таблице или он может просто каким-либо образом подсовыват измененные данные триггеру, которые находятся где-нить в ОЗУ??
В таблице уже находятся измененные данные.
10 сен 04, 09:55    [949580]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
Я думаю, что у автора вопроса (да и других разработчиков) было бы меньше проблем, будь у SQL Server обычные нормальные BEFORE триггеры, где бы и проверялись предварительно бизнес-правила и где по определению НЕ НУЖНО КОДИРОВАТЬ команды insert, delete, update
10 сен 04, 10:45    [949868]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Денис Авилов
Member

Откуда: Украина, Днепропетровск
Сообщений: 185
Mikhalich
Кстати, а никто не в курсе как работает процесс модификации записи? Сервак на момент исполнения after-триггера уже физически сделал изменения в таблице или он может просто каким-либо образом подсовыват измененные данные триггеру, которые находятся где-нить в ОЗУ?? тогда instead of триггеры не будут быстрее.


По логике там должны находится уже измененные данные. Однако никто не знает (ну или, по крайней мере, я не знаю) , как этот процесс перекликается со свякими кам буферами, кэшированием и прочей байдой, введенной для ускорения работы сиквелла. Поэтому единственный способ проверить это - протестить.
10 сен 04, 10:51    [949901]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Денис Авилов
Member

Откуда: Украина, Днепропетровск
Сообщений: 185
Даутов
Я думаю, что у автора вопроса (да и других разработчиков) было бы меньше проблем, будь у SQL Server обычные нормальные BEFORE триггеры, где бы и проверялись предварительно бизнес-правила и где по определению НЕ НУЖНО КОДИРОВАТЬ команды insert, delete, update


Ессно. Вообще, у сиквелла, при всей его мощности, гибкости и функциональности, зачастую наблюдаются просто поразительные по своей тупости недоделки. Отсутствие BEFORE триггеров - одна из них. Хоть и оффтопик, но накипело! ;-)
10 сен 04, 10:55    [949929]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
Glory
Сервак на момент исполнения after-триггера уже физически сделал изменения в таблице или он может просто каким-либо образом подсовыват измененные данные триггеру, которые находятся где-нить в ОЗУ??
В таблице уже находятся измененные данные.

Измененные данные в этот момент физически записаны в transaction log и изменены в буферном кэше, физически на диск в файл данных изменения еще не перенесены
10 сен 04, 10:56    [949931]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
2Даутов
А я говорил что-то про физический диск ?
Я сказал "в таблице уже находятся измененные данные". А откуда сервер возьмет эти данные когда я обращусь к таблице - это уже внутренне дело сервера.
10 сен 04, 10:59    [949947]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Даутов
Member

Откуда: Казань
Сообщений: 502
Денис Авилов

Ессно. Вообще, у сиквелла, при всей его мощности, гибкости и функциональности, зачастую наблюдаются просто поразительные по своей тупости недоделки. Отсутствие BEFORE триггеров - одна из них. Хоть и оффтопик, но накипело! ;-)

На мой взгляд,
в последние годы развитие SQL Server идет вширь, но не в глубину.
Потребности разработчиков и их пожелания в развитии продукта мало учитываются - главное захватить очередные продуктовые ниши
10 сен 04, 11:10    [949998]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Денис Авилов
Member

Откуда: Украина, Днепропетровск
Сообщений: 185
Даутов
На мой взгляд,
в последние годы развитие SQL Server идет вширь, но не в глубину.
Потребности разработчиков и их пожелания в развитии продукта мало учитываются - главное захватить очередные продуктовые ниши


Аминь!
10 сен 04, 11:12    [950001]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Потребности разработчиков и их пожелания в развитии продукта мало учитываются - главное захватить очередные продуктовые ниши
Это вы зря так.
10 сен 04, 11:13    [950007]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по триггерам "instead of update"  [new]
Mikhalich
Member

Откуда:
Сообщений: 291
Ув. господа! провел тесты и получил следующие результаты. убедительная просьба покритиковать меня, а то что-то подозрительными мне показались результаты.


для after-триггера

1. создал таблицу:
CREATE TABLE [dbo]. (
[UnitID] [int] NOT NULL PRIMARY KEY CLUSTERED,
[ModificationNo] [smallint] NOT NULL ,
[InsertChangeNo] [int] NOT NULL ,
[MaterialID] [int] NULL ,
[Txt] [char] (100) COLLATE Cyrillic_General_CI_AS NULL)

2. заполнил данными:
set nocount on

declare @i int, @j int
set @i=0
set @j=1

delete from B

while @i < 500000
begin
insert into B (UnitID, ModificationNo, InsertChangeNo, MaterialID, Txt)
values (@i, 1, 1, 1, '111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111')
set @i = @i + 1
end

3. добавил к таблице after-триггер:
CREATE trigger B_AfterUpdate on [dbo]. 
after update
as
begin
declare @a int

if update(UnitID)
begin
raiserror('!!!!!!!!!', 16, 1)
rollback transaction
end
else
begin
if not Update(InsertChangeNo)
begin
set @a = 1
end
end
end

4. запустил тест:
set nocount on

declare @i int, @b bit, @ModificationNo smallint
set @i=3
set @b=1

while @i < 300000
begin
if @b = 1
begin
set @b = 0
update B set ModificationNo = 2,
InsertChangeNo = @i,
MaterialID = 2,
Txt = 'InsertChangeNo modified'
where UnitID = @i
end
else
begin
set @b = 1
update B set ModificationNo = 2,
-- а здесь InsertChangeNo не изменяем
MaterialID = 2,
Txt = '222222222222222222222222222222222'
where UnitID = @i
end

set @i = @i + 1
end




для instead of-триггера

1. создал таблицу ......
2. заполнил данными .......
3. добавил к таблице instead of-триггер:

CREATE trigger B_InsteadOfUpdate on [dbo]. 
instead of update
as
begin
declare @a int

if update(UnitID)
begin
raiserror('!!!!!!!!!', 16, 1)
rollback transaction
end
else
begin
if Update(InsertChangeNo)
begin
update B
set ModificationNo = Inserted.ModificationNo,
InsertChangeNo = Inserted.InsertChangeNo,
MaterialID = Inserted.MaterialID,
Txt = Inserted.Txt
from Inserted
where B.UnitID = Inserted.UnitID
end
else
begin
set @a = 1
end
end
end

4. запустил тест ........


Получил следующее:

after trigger

Execution time 2:29
Duration 149 496
CPU 44 407
Reads 901 620
Writes 4 627



instead of trigger

Execution time 3:21
Duration 200 936
CPU 119 438
Reads 4 054 007
Writes 4 627

Господа, не могли бы Вы мне объяснить полученные результаты????????
14 сен 04, 01:02    [956472]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить