Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.03;
Скачать: CL | DM;

Вниз

Транзакции в триггере   Найти похожие ветки 

 
sql   (2008-08-29 11:40) [0]

ALTER TRIGGER [trgSettings] ON [dbo].[tSettings]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
BEGIN TRANSACTION
 DECLARE
   @IdSetting int,
   @Section nvarchar(32),
   @Ident nvarchar(32),
   @Value nvarchar(32),
   @iDate datetime,
   @iUser int,
   @uDate datetime,
   @uUser int,
   @Note nvarchar(255),
   @Now datetime,
   @i int;

 SET @Now = GETDATE();

 SET NOCOUNT ON;

 IF EXISTS(SELECT * FROM Inserted)
   BEGIN
     IF NOT EXISTS(SELECT * FROM Deleted)
       BEGIN
         ROLLBACK TRANSACTION
       END
     ELSE
       BEGIN
         COMMIT TRANSACTION
       END;
   END
 ELSE
   BEGIN
     COMMIT TRANSACTION
   END;
END


В какой части текста триггера лучше всего открывать глобальную, по отношению к триггеру, транзакцию ?


 
Игорь Шевченко ©   (2008-08-29 11:41) [1]

Транзакции в триггере есть безусловное зло :)


 
MsGuns ©   (2008-08-29 11:43) [2]

Как же все-таки гадость, этот ваш... триггер !


 
sql   (2008-08-29 11:53) [3]

Ребят кому не сложно, можно ваши триггеры посмотреть, большей частью интересуют «сложно выпоенные» триггеры. Не беда если я в них не разберусь, просто хотелось посмотреть как их (триггеры) делают если можно так сказать профессионалы.

Спасибо.


 
Polevi ©   (2008-08-29 12:02) [4]

профессионалы стараются избегать триггеров


 
sql   (2008-08-29 12:05) [5]


> Polevi ©   (29.08.08 12:02) [4]

А как же тогда логирование изменений, обеспечение целостности информации и т.д. ? Да, и насколько в среднем триггер замедляет процесс обработки данных ?


 
Игорь Шевченко ©   (2008-08-29 12:08) [6]


> А как же тогда логирование изменений, обеспечение целостности
> информации и т.д.


целостность информации обычно обеспечивается декларативными средствами.

Про транзакции и триггеры рекомендую почитать:
http://sql.ru/forum/actualthread.aspx?tid=588877 все страницы


 
stas ©   (2008-08-29 12:09) [7]

Для чего эта проверка?

>
>  IF EXISTS(SELECT * FROM Inserted)
>    BEGIN
>      IF NOT EXISTS(SELECT * FROM Deleted)


 
Ega23 ©   (2008-08-29 12:09) [8]


> профессионалы стараются избегать триггеров
>


+1.


> А как же тогда логирование изменений, обеспечение целостности
> информации и т.д. ?


целостность данных обеспечивается средствами самой СУБД, такими как PK-FK constraints, нафига для этой цели триггеры - непонятно.

Логгирование отлично обеспечивается из других мест (ХП, например).

За 8+ лет работы с БД триггер понадобился один единственный раз.


 
Ega23 ©   (2008-08-29 12:11) [9]


> Для чего эта проверка?


А как, по-твоему, устроена операция Update? Сначала Delete, потом Insert


 
stas ©   (2008-08-29 12:13) [10]

Ega23 ©   (29.08.08 12:11) [9]
т.е. для определения операции?


 
sql   (2008-08-29 12:13) [11]


> stas ©   (29.08.08 12:09) [7]

В зависимости от события INSERT, UPDATE, DELETE, делать "разные вещи"...


 
stas ©   (2008-08-29 12:17) [12]

не проще 3 триггера сделать?


 
Ega23 ©   (2008-08-29 12:21) [13]


> т.е. для определения операции?


Ну судя по тексту - да.


 
sql   (2008-08-29 12:22) [14]


> stas ©   (29.08.08 12:17) [12]

Мне кажется нет...


 
stas ©   (2008-08-29 12:23) [15]

Ну, или

IF <Условие> --определяем UPDATE
BEGIN
Declare ...
END

IF <Условие> --INSERT
BEGIN
Declare ...
END

IF <Условие> -- DELETE
BEGIN
Declare ...
END
...
Insert into

без всяких транзакций


 
sql   (2008-08-29 12:23) [16]


> Ega23 ©   (29.08.08 12:21) [13]

Не по тексту судить не надо, этот текст к примеру...


 
sql   (2008-08-29 12:25) [17]


> stas ©   (29.08.08 12:23) [15]

А допустим если необходимо при разных событиях иметь общию(ии) переменные...


 
stas ©   (2008-08-29 12:30) [18]

Вверху общие.

Я сразу скажу этот лог (как в примере) работать будет некорректно при пакетной вставке, удалении обновлении.

У нас огранизован лог подобный лог (я не настаиваю на его правильности)
3 триггера на таблицу. Внутри просто
Insert into...
select f1..fn from inserted.
Каждую ночь таблицы LOG списываются в архив и очищаются, т.к. при наполнении таблицы лога вставка происходит все медленее.


 
Игорь Шевченко ©   (2008-08-29 12:49) [19]


> А как, по-твоему, устроена операция Update? Сначала Delete,
>  потом Insert


а почему не наоборот ?


 
Palladin ©   (2008-08-29 12:52) [20]

из-за ключёв я думаю :)


 
MsGuns ©   (2008-08-29 12:54) [21]

Следует триггеры воспринимать лишь как дополнительное средство программирования НА СТОРОН СЕРВЕРА и не более того. Дополнительное.
В клиент-серверных системах существует, грубо говоря, две "крайние" концепции построения логики:
 чисто клиентская, когда сервер занимается только исполнением запросов от клиента с минимумом "самостоятельности", контроль же за целостностью данных, учет реплик, "сервисные" функции и т.д. остаются на "совести" клиента
  и
чисто серверная, когда максимум алгоритмов реализуются самим сервером, клиент же лишь обращается к набору "макро"-функций, зачастую даже не имея представления о физическом представлении данных на сервере и не неся ответственности ни за целостность данных, ни за их полноту и корректность

В каждом конктретном случае применяется собственная "средняя" концепция, заключающаяся в некоей комбинации этих двух концепций. Причем очень часто текущая концепция модели со временем постепенно транформируются от первой крайности ко второй или наоборот. Не зная предметной области и поставленных перед разработчиком СУБД задач, невозможно советовать. Это все равно, что тащить в операционную больного, не удосужившись хотя бы спросить у него, где болит ;)


 
DiamondShark ©   (2008-08-29 13:28) [22]


>  чисто клиентская, когда сервер занимается только исполнением
> запросов от клиента с минимумом "самостоятельности", контроль
> же за целостностью данных, учет реплик, "сервисные" функции
> и т.д. остаются на "совести" клиента

Нет такой "концепции".
Это называется "всю жизнь лабали на фокспро, а потом пацаны сказали, что SQL server типа круто".


 
Игорь Шевченко ©   (2008-08-29 13:32) [23]

Где б программистов взять...


 
DiamondShark ©   (2008-08-29 13:33) [24]


> профессионалы стараются избегать триггеров

Профессионалы в какой области? Профессионалы-гинекологи, возможно, и стараются избегать. Профессионалы-программисты СУБД триггеры знают, любят и умеют применять по назначению.


 
DiamondShark ©   (2008-08-29 13:38) [25]


> Транзакции в триггере есть безусловное зло :)

Это смотря на каком сервере.
На MSSQL, который, судя по синтаксису, у автора -- таки да.
На других, у которых поведение транзакций не такое удодское, вполне себе имеет право на жизнь.


 
sql   (2008-08-29 13:58) [26]

Сорри, а как производится пакетная вставка ?


 
DiamondShark ©   (2008-08-29 14:16) [27]

Сорри, а что такое "пакетная вставка"?

Bulk insert, что-ли? Она производится быстро. Триггеры, кстати, при ней могут не срабатывать (зависит от опций).

Или что-то другое имелось в виду?


 
sql   (2008-08-29 14:17) [28]


> Или что-то другое имелось в виду?

А я хз, потому и спрашиваю...


 
DiamondShark ©   (2008-08-29 14:37) [29]


> А я хз, потому и спрашиваю...

Жжошь.
Чего ты хз? Ты эти волшебные слова где услышал?


 
stas ©   (2008-08-29 14:42) [30]

sql   (29.08.08 13:58) [26]
Insert Into
select from

При этом Select возвращает не 1 запись а много.


 
stas ©   (2008-08-29 14:45) [31]

Я так понимаю в переменные ты хочешь записывать значения из Inserted,Deleted или я неправильно понял?


 
sql   (2008-08-29 14:47) [32]


> stas ©   (29.08.08 14:45) [31]

Правильно.


 
Курдль   (2008-08-29 14:47) [33]


> Polevi ©   (29.08.08 12:02) [4]
> профессионалы стараются избегать триггеров


Это сильно сказано! Также как и слова, что вся целостность данных может быть поддержана "... такими как PK-FK constraints... ХП"

Да. Даже не знаю, что ответить...
Особенно про ХП? Знаю такой стиль - применение ХП вместо DML.
Мало того, что это геморрой, но еще и обрубает все пути автоматизации генерирования этих DML средами разработки.

Вот пример для разминки ума.
Есть рефлексивная связь в сущности Х. (Дерево - в простонародьи).
Отследите-ка логическую ошибку "кольцевой связи" (т.е. если экземпляр сущности А является родительским для В. В - родительским для С. С - родительским для А).


 
sql   (2008-08-29 14:48) [34]


> Чего ты хз?

хто его знает...


Ты эти волшебные слова где услышал?

Кто его знает...


 
stas ©   (2008-08-29 14:51) [35]

DiamondShark ©   (29.08.08 14:37) [29]
Это я писал выше.
sql   (29.08.08 14:48) [34]
он о пакетной вставке говорит :-D


 
stas ©   (2008-08-29 14:53) [36]

sql   (29.08.08 14:47) [32]
Вот, а если пройдет одновременная вставка или апдейт 10 записей, Inserted будет содержать 10 записей, как ты их сохранишь в переменные?


 
Ega23 ©   (2008-08-29 14:55) [37]


> Особенно про ХП? Знаю такой стиль - применение ХП вместо
> DML.
> Мало того, что это геморрой, но еще и обрубает все пути
> автоматизации генерирования этих DML средами разработки.


понеслось...
Однако - пятница...


 
sql   (2008-08-29 14:57) [38]


> он о пакетной вставке говорит :-D

Нет, это ты о покетной вставке говоришь. Я о ней просто спросил: "Что это ?". Потому что сразу не понял....

ЗЫ:


> stas ©   (29.08.08 12:30) [18]
> Вверху общие.
>
> Я сразу скажу этот лог (как в примере) работать будет некорректно
> при пакетной вставке, удалении обновлении.


Ну поидеи Inserted, ...., ....d, по одной записи содержат..., или все же если пакетная вставка, ..., ..., весь пакет записей и держат... ?


 
sql   (2008-08-29 14:58) [39]


> Вот, а если пройдет одновременная вставка или апдейт 10
> записей, Inserted будет содержать 10 записей, как ты их
> сохранишь в переменные?


получил ответ на вопрос.

Ну поидеи Inserted, ...., ....d, по одной записи содержат..., или все же если пакетная вставка, ..., ..., весь пакет записей и держат... ?

...


 
stas ©   (2008-08-29 15:01) [40]

sql   (29.08.08 14:57) [38]
Весь, для этого  и таблица, а не переменные в самом триггере.
Триггер выполнится столько раз сколько выполнишь запрос независимо сколько обновилось записей.



Страницы: 1 2 3 вся ветка

Текущий архив: 2009.05.03;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.02 c
15-1235568930
X5
2009-02-25 16:35
2009.05.03
транзакции


2-1237905631
Magedon
2009-03-24 17:40
2009.05.03
Typecasting


4-1208953279
angel
2008-04-23 16:21
2009.05.03
Вопрос по Flash USB


2-1237549858
Pavel
2009-03-20 14:50
2009.05.03
Работа с WordDocument


3-1219995619
sql
2008-08-29 11:40
2009.05.03
Транзакции в триггере