Форум: "Базы";
Текущий архив: 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