Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 порядок исполнения триггеров  [new]
салта
Guest
цель задачи: если выполняется некоторое условие, то разрешать исполнение пользовательской транзакции, но с ведением аудита действий, а если условие не выполняется, то транзакцию не выполнять.
вариант решения:
через sp_settriggerorder триггер t1 (который instead of) делаю первым, а t2 (который after) вторым
в t1 проверяю условие и если оно не выполняется, то триггер t2 делаю disable (он же в таком случае не выполнится?), иначе enable
а в t2 делаю уже весь аудит
правильное это решение? будет работать? или как сделать нормально?
27 авг 11, 10:33    [11188893]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
Glory
Member

Откуда:
Сообщений: 104751
салта
через sp_settriggerorder триггер t1 (который instead of) делаю первым, а t2 (который after) вторым

- instead of триггер и так всегда выполняется первым
- after триггер не сработает, если вы ничего не будете изменять
27 авг 11, 10:50    [11188915]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
а не разве проще способа нет? как-то вы сложно все делаете
27 авг 11, 11:13    [11188956]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
салта
Guest
Glory, большое спасибо!
мне и заморачиваться значит не нужно :)

Knyazev Alexey, собственно вроде у меня и так не все сложно

т.е. в t1 я проверяю свое условие, и либо дисеблю t2 либо энеблю его

вообще задача состоит в следующем: пользователь имеет права изменять внесенные им данные только в свою смену. если он попытается изменить не в свою смену, то t1 (instead of), как я понимаю просто ничего не выполнит, и за одно задисаблит t2, а если же в свою смену, то t2 запишет аудит изменений.
я же правильно понимаю, что если будет триггер instead of delete, update, то действий update/delete не произойдет в таблице?

вроде все просто. если можете, то предложите другое решение... please!
27 авг 11, 12:05    [11189073]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
а не проще все сделать в одном триггере, проверять вашего юзера и либо отрабатываем\либо откатываем...
зачем вам лишние действия и лишняя блокировка sh-m на таблице!?
27 авг 11, 12:39    [11189166]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
салта
Guest
вот прочла доку и вроде немного яснее стало (ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ru/s10de_1devconc/html/1050a88e-d15f-4f0e-baee-a63f379f6529.htm)
т.е. теперь я понимаю так, что триггер один (instead of) и в нем я все проверяю и если надо, сама все выполняю, т.е. если можно сама то удаляю, согласно тому, что находится в таблице deleted. если нужно, то изменяю согласно тому, что находится в таблице inserted.
я все правильно поняла?

а вот теперь вопрос: если изменено много записей, то мне как делать?
update dbo.table1 t
set t.field1 = i.field1, t.field2 = i.field2...
from inserted i
where t.id = i.id
27 авг 11, 12:57    [11189201]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
салта
Guest
или будет лучший вариант?

if ... не в свою смену
begin
rollback transaction;
return
end
27 авг 11, 12:59    [11189207]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
салта
Guest
уважаемые, гуру!
ответьте, пожалуйста, на мои вопросы...
11189207
11189201
:)
31 авг 11, 08:15    [11204084]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
f070214
Member

Откуда:
Сообщений: 35
салта
или будет лучший вариант?

if ... не в свою смену
begin
rollback transaction;
return
end


лично мне этот вариант больше нравится
31 авг 11, 08:58    [11204166]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
iljy
Member

Откуда:
Сообщений: 8711
салта
или будет лучший вариант?

if ... не в свою смену
begin
rollback transaction;
return
end

Этот вариант заведомо проигрывает: зачем вносить изменения, а потом откатывать? Не проще сначала проверить выполнение условий?
Ну и использование ROLLBACK в триггере дает массу побочных эффектов, так что лучше использовать RAISERROR.
31 авг 11, 09:29    [11204238]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
iap
Member

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

так ведь результат этих вариантов разный:
в одном при малейшей ошибке отменяются все, даже правильные изменения,
а в другом апдейтятся хорошие записи и игнорируются плохие.
Разве не Вы сами должны решить, что же Вы хотите?
31 авг 11, 09:31    [11204243]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
салта
Guest
т.е.:
1) лучше делать один триггер instead of
2) групповые изменения нужно делать так:
update dbo.table1 t
set t.field1 = i.field1, t.field2 = i.field2...
from inserted i
where t.id = i.id
ну и удаления на подобие

так будет правильно?

и не самый важный вопрос
3) вот сейчас попробовала сделать два триггера instead of и after, почему-то отрабатывает только instead of?
триггера самые простые, типа
insert into t_audit (f1) values (N'это триггер #1')
почему так?

ver: Microsoft SQL Server 2005
31 авг 11, 10:24    [11204449]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
салта
т.е.:
1) лучше делать один триггер instead of
2) групповые изменения нужно делать так:
update dbo.table1 t
set t.field1 = i.field1, t.field2 = i.field2...
from inserted i
where t.id = i.id
ну и удаления на подобие

так будет правильно?

и не самый важный вопрос
3) вот сейчас попробовала сделать два триггера instead of и after, почему-то отрабатывает только instead of?
триггера самые простые, типа
insert into t_audit (f1) values (N'это триггер #1')
почему так?

ver: Microsoft SQL Server 2005
instead of - вместо (англ.)
Это означает, что сам UPDATE заменяется триггером.
А раз ничего не происходит, то почему должен вызываться триггер AFTER UPDATE?
Однако, он сработает, если Вы в триггере INSTEAD OF UPDATE напишите какой-нибудь UPDATE этой же таблицы.
При этом триггер INSTEAD OF UPDATE при UPDATE изнутри триггера INSTEAD OF UPDATE не вызывается!
31 авг 11, 10:40    [11204509]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
iap
Member

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

но в триггере INSTEAD OF UPDATE правильнее опираться на id из deleted - ведь UPDATE ещё не произошло,
поэтому часть таблицы совпадает с deleted (а не с inserted, как в триггере AFTER),
и теоретически ведь допускается менять поля из PRIMARY KEY!
Конечно, это не касается поля со свойством IDENTITY, но это лишь частный случай.
31 авг 11, 10:47    [11204543]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
numbers
Guest
iap
поэтому часть таблицы совпадает с deleted (а не с inserted, как в триггере AFTER),

а вторая часть?
31 авг 11, 11:27    [11204772]     Ответить | Цитировать Сообщить модератору
 Re: порядок исполнения триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
numbers
iap
поэтому часть таблицы совпадает с deleted (а не с inserted, как в триггере AFTER),

а вторая часть?
А вторая часть не затрагивается UPDATEом и поэтому с deleted никак не пересекается.
31 авг 11, 11:38    [11204855]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить