-
sql (29.08.08 14:57) [38] Весь, для этого и таблица, а не переменные в самом триггере. Триггер выполнится столько раз сколько выполнишь запрос независимо сколько обновилось записей.
-
> sql (29.08.08 14:57) [38] > > > > он о пакетной вставке говорит :-D > > Нет, это ты о покетной вставке говоришь. Я о ней просто > спросил: "Что это ?". Потому что сразу не понял....
А в русском написании это неоднозначный термин. Его можно понять и как bulk insert, и как insert ... select, и ещё хз как. Поэтому и спросили, что ты под этим понимаешь. А ты -- хз.
> Ну поидеи Inserted, ...., ....d, по одной записи содержат. > .., или все же если пакетная вставка, ..., ..., весь пакет > записей и держат... ?
Все записи, которые затрагивает выполняющийся оператор.
-
> DiamondShark © (29.08.08 15:11) [41]
Хорошо, если я делаю пакетную вставку, тогда как мне отобразить записи в логе которые я вставил, т.е. лог не обычный клон той таблици в которой триггер, а в общей таблице для логирования событий, думаю примерно понятно о чем речь... Тогда прейдется в триггере делать cursor, чтоб он перелил каждую запись, или нет ?
-
>DiamondShark © (29.08.08 13:28) [22] >Нет такой "концепции".
Есть только одна "концепция" - твоя. Остальное - бред сивой кобылы ;)
-
> В какой части текста триггера лучше всего открывать глобальную, > по отношению к триггеру, транзакцию ?
А я вот не поленился почитать Ваш код и ужаснулся - это я так отстал от жизни, или триггер ... BEFORE INSERT... существует только в оракле?
-
MsGuns © (29.08.08 15:22) [43]
Не надо садиться в лужу лишний раз
-
>DiamondShark © (29.08.08 13:33) [24]
>Профессионалы-программисты СУБД триггеры знают, любят и умеют >применять по назначению.
но при этом стараются избегать
-
sql (29.08.08 15:21) [42]
пример №1 ... Declare @username nvarchar(256), @time datetime set @username = SUSER_SNAME() set @time = GETDATE()
Insert into logtable (ftime,fuser,f1,f2..fn) select @time,@username,f1,f2..fn from inserted
Пример №2
Insert into logtable (ftime,fuser,f1,f2..fn) select GETDATE(),SUSER_SNAME(),f1,f2..fn from inserted
-
> Курдль (29.08.08 15:27) [44] > А я вот не поленился почитать Ваш код и ужаснулся - это > я так отстал от жизни, или триггер ... BEFORE INSERT... > существует только в оракле?
Уф! Слава Богу - не только в оракле! Не поленился отрыть свои "труды" многолетней давности под Sybase ASA:
create trigger XXX_TR_CNTR_BEFORE_I_U before insert, update on XXX_CONTRACTS
referencing new as N old as O
for each row
begin
declare cntrID Integer;
if ((select CNTR_ID from XXX_CONTRACTS C1 where (C1.CNTR_TYPE = 1) and
(C1.SBJ_ID_INS = N.SBJ_ID_INS) and (C1.SBJ_ID_CUS = N.SBJ_ID_CUS) and
(C1.CNTR_ACTIV is Not null)) <> N.CNTR_ID) and (N.CNTR_TYPE = 1)
then raiserror 23002 'XXX SERVER ERROR: В силе может быть только один договор xxx со xxx
end if;
if (N.CNTR_ID_PR is not null) then
if N.CNTR_ID_PR = N.CNTR_ID
then raiserror 23003 'XXX SERVER ERROR: Договор не может быть первичным для самого себя'
end if;
set cntrID = N.CNTR_ID_PR;
while (cntrID <> 0) loop
set cntrID = (select first(C2.CNTR_ID_PR) from XXX_CONTRACTS C2 where C2.CNTR_ID = cntrID);
if (cntrID = N.CNTR_ID)
then raiserror 23005 'XXX SERVER ERROR: Кольцевая связь первичных и подчиненных договоров'
end if;
end loop;
if (select max(C2.CNTR_START_DATE) from XXX_CONTRACTS C2 where C2.CNTR_ID = N.CNTR_ID_PR) > N.CNTR_START_DATE
then raiserror 23006 'XXX SERVER ERROR: Подчиненный договор не может быть подписан ранее первичного'
end if;
end if;
if (select min(C2.CNTR_START_DATE) from XXX_CONTRACTS C2 where C2.CNTR_ID_PR = N.CNTR_ID) < N.CNTR_START_DATE
then raiserror 23007 'XXX SERVER ERROR: В наличии подчиненные договоры, подписанные ранее настоящего'
end if;
if (N.CNTR_END_DATE is not Null) and (N.CNTR_END_DATE < N.CNTR_START_DATE)
then raiserror 23009 'XXX SERVER ERROR: Дата подписания не может превышать дату окончания'
end if;
end;
-
sql (29.08.08 15:21) [42] неделай курсор в триггере!
-
Курдль (29.08.08 15:49) [48] в ms sql тоже есть.
-
> stas © (29.08.08 15:51) [50] > > Курдль (29.08.08 15:49) [48] > в ms sql тоже есть.
А чего тогда аутор копья ломает о мельницы?
-
Курдль (29.08.08 15:58) [51] несилен в sql видимо. Да там и ненужны транзакции.
-
> sql (29.08.08 15:21) [42] > > DiamondShark © (29.08.08 15:11) [41] Хорошо, если я > делаю пакетную вставку, тогда как мне отобразить записи > в логе которые я вставил, т.е. лог не обычный клон той таблици > в которой триггер, а в общей таблице для логирования событий, > думаю примерно понятно о чем речь... Тогда прейдется в > триггере делать cursor, чтоб он перелил каждую запись, или > нет ?
Можно курсор, можно insert into logtable(...) select ... from inserted
Зависит от сложности преобразований над вставленными строками.
-
> Курдль (29.08.08 15:49) [48] > Слава Богу - не только в оракле! Не поленился отрыть свои "труды" > многолетней давности под Sybase ASA:
О, да. У Sybase ASA очень хороший диалект SQL. Как вам квалификаторы for each row/for each statement для триггеров?
А у MSSQL таки нет BEFORE триггеров. Зато есть INSTEAD триггеры.
-
> MsGuns © (29.08.08 15:22) [43] > > >DiamondShark © (29.08.08 13:28) [22] > >Нет такой "концепции". > > Есть только одна "концепция" - твоя. Остальное - бред сивой > кобылы ;)
Не совсем так, но тренд ты уловил.
> Polevi © (29.08.08 15:44) [46] > > >DiamondShark © (29.08.08 13:33) [24] > > >Профессионалы-программисты СУБД триггеры знают, любят и > умеют >применять по назначению. > > но при этом стараются избегать
Врядли Вы знакомы со ВСЕМИ специалистами или обладаете единственно верным представлением о специалистах. Поэтому обобщённое заявление такого рода, мягко говоря, не корректно.
Вот заявления, вроде: "Я стараюсь избегать" или: "Известные мне специалисты стараются избегать" возражений не вызывают. Правда, и ценности не имеют.
-
DiamondShark © (29.08.08 16:27) [54] Ну, да - INSTEAD. Они могут заменить BEFORE.
-
>Игорь Шевченко © (29.08.08 15:36) [45] >Не надо садиться в лужу лишний раз
О "луже" поподробнее, пожалуйста
-
Лужа -- относительно мелкое углубление в плотном верхнем слое грунта или искусственном покрытии, заполненное жидкостью, преимущественно, дождевой либо талой водой, часто с заметным количеством взвешенных частиц грунта и других веществ, присутствующих в атмосфере и на подлежащей поверхности. Посадка в лужу состоит в погружении ягодиц в наполняющую лужу жидкость на всю глубину лужи. Вхождение ягодиц в лужу сопровождается характерным звуком и, при значительной вертикальной составляющей скорости вхождения ягодиц в лужу, разбрызгиванием содержимого лужи и, в случае грунтового основания, размокшего грунта.
-
Категорично против триггеров, категорично против транзакций в триггерах!
ТРИГГЕРЫ ЗЛО ТРИГГЕРЫ ЗЛО ТРИГГЕРЫ ЗЛО ТРИГГЕРЫ ЗЛО ТРИГГЕРЫ ЗЛО
Если кому будет интересно - обосную
|