Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.011 c
2-1237444768
IIIakal
2009-03-19 09:39
2009.05.03
Как правильно создать оператор проверки?


8-1193561865
kas86
2007-10-28 11:57
2009.05.03
Вопрос по JPEG из DLL


2-1237453662
matveih1
2009-03-19 12:07
2009.05.03
Почему форма меняет размер?


2-1237554328
StriderMan
2009-03-20 16:05
2009.05.03
Действия над группой объектов


15-1235760588
Кто б сомневался
2009-02-27 21:49
2009.05.03
Программа для дефрагментации папки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский