Конференция "Базы" » Транзакции в триггере
 
  • stas © (29.08.08 15:01) [40]
    sql   (29.08.08 14:57) [38]
    Весь, для этого  и таблица, а не переменные в самом триггере.
    Триггер выполнится столько раз сколько выполнишь запрос независимо сколько обновилось записей.
  • DiamondShark © (29.08.08 15:11) [41]

    > sql   (29.08.08 14:57) [38]
    >
    >
    > > он о пакетной вставке говорит :-D
    >
    > Нет, это ты о покетной вставке говоришь. Я о ней просто
    > спросил: "Что это ?". Потому что сразу не понял....


    А в русском написании это неоднозначный термин.
    Его можно понять и как bulk insert, и как insert ... select, и ещё хз как.
    Поэтому и спросили, что ты под этим понимаешь. А ты -- хз.


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

    Все записи, которые затрагивает выполняющийся оператор.
  • sql (29.08.08 15:21) [42]

    > DiamondShark ©   (29.08.08 15:11) [41]

    Хорошо, если я делаю пакетную вставку, тогда как мне отобразить записи в логе которые я вставил, т.е. лог не обычный клон той таблици в которой триггер, а в общей таблице для логирования событий, думаю примерно понятно о чем речь... Тогда прейдется в триггере делать cursor, чтоб он перелил каждую запись, или нет ?
  • MsGuns © (29.08.08 15:22) [43]
    >DiamondShark ©   (29.08.08 13:28) [22]
    >Нет такой "концепции".

    Есть только одна "концепция" - твоя. Остальное - бред сивой кобылы ;)
  • Курдль (29.08.08 15:27) [44]

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

    А я вот не поленился почитать Ваш код и ужаснулся - это я так отстал от жизни, или триггер ... BEFORE INSERT... существует только в оракле?
  • Игорь Шевченко © (29.08.08 15:36) [45]
    MsGuns ©   (29.08.08 15:22) [43]

    Не надо садиться в лужу лишний раз
  • Polevi © (29.08.08 15:44) [46]
    >DiamondShark ©   (29.08.08 13:33) [24]

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

    но при этом стараются избегать
  • stas © (29.08.08 15:46) [47]
    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:49) [48]

    > Курдль   (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;

  • stas © (29.08.08 15:49) [49]
    sql   (29.08.08 15:21) [42]
    неделай курсор в триггере!
  • stas © (29.08.08 15:51) [50]
    Курдль   (29.08.08 15:49) [48]
    в ms sql тоже есть.
  • Курдль (29.08.08 15:58) [51]

    > stas ©   (29.08.08 15:51) [50]
    >
    > Курдль   (29.08.08 15:49) [48]
    > в ms sql тоже есть.

    А чего тогда аутор копья ломает о мельницы?
  • stas © (29.08.08 16:04) [52]
    Курдль   (29.08.08 15:58) [51]
    несилен в sql видимо. Да там и ненужны транзакции.
  • DiamondShark © (29.08.08 16:20) [53]

    > sql   (29.08.08 15:21) [42]
    > > DiamondShark ©   (29.08.08 15:11) [41] Хорошо, если я
    > делаю пакетную вставку, тогда как мне отобразить записи
    > в логе которые я вставил, т.е. лог не обычный клон той таблици
    > в которой триггер, а в общей таблице для логирования событий,
    >  думаю примерно понятно о чем речь... Тогда прейдется в
    > триггере делать cursor, чтоб он перелил каждую запись, или
    > нет ?

    Можно курсор, можно insert into logtable(...) select ... from inserted

    Зависит от сложности преобразований над вставленными строками.
  • DiamondShark © (29.08.08 16:27) [54]

    > Курдль   (29.08.08 15:49) [48]
    > Слава Богу - не только в оракле! Не поленился отрыть свои "труды"
    > многолетней давности под Sybase ASA:


    О, да. У Sybase ASA очень хороший диалект SQL.
    Как вам квалификаторы for each row/for each statement для триггеров?

    А у MSSQL таки нет BEFORE триггеров.
    Зато есть INSTEAD триггеры.
  • DiamondShark © (29.08.08 16:34) [55]

    > 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]
    >
    > >Профессионалы-программисты СУБД триггеры знают, любят и
    > умеют >применять по назначению.
    >
    > но при этом стараются избегать

    Врядли Вы знакомы со ВСЕМИ специалистами или обладаете единственно верным представлением о специалистах. Поэтому обобщённое заявление такого рода, мягко говоря, не корректно.

    Вот заявления, вроде: "Я стараюсь избегать" или: "Известные мне специалисты стараются избегать" возражений не вызывают. Правда, и ценности не имеют.
  • stas © (29.08.08 16:35) [56]
    DiamondShark ©   (29.08.08 16:27) [54]
    Ну, да - INSTEAD. Они могут заменить BEFORE.
  • MsGuns © (29.08.08 16:55) [57]
    >Игорь Шевченко ©   (29.08.08 15:36) [45]
    >Не надо садиться в лужу лишний раз

    О "луже" поподробнее, пожалуйста
  • DiamondShark © (29.08.08 17:27) [58]
    Лужа -- относительно мелкое углубление в плотном верхнем слое грунта или искусственном покрытии, заполненное жидкостью, преимущественно, дождевой либо талой водой, часто с заметным количеством взвешенных частиц грунта и других веществ, присутствующих в атмосфере и на подлежащей поверхности.
    Посадка в лужу состоит в погружении ягодиц в наполняющую лужу жидкость на всю глубину лужи. Вхождение ягодиц в лужу сопровождается характерным звуком и, при значительной вертикальной составляющей скорости вхождения ягодиц в лужу, разбрызгиванием содержимого лужи и, в случае грунтового основания, размокшего грунта.
  • XentaAbsenta © (29.08.08 20:08) [59]
    Категорично против триггеров,
    категорично против транзакций в триггерах!

    ТРИГГЕРЫ ЗЛО
    ТРИГГЕРЫ ЗЛО
    ТРИГГЕРЫ ЗЛО
    ТРИГГЕРЫ ЗЛО
    ТРИГГЕРЫ ЗЛО

    Если кому будет интересно - обосную
 
Конференция "Базы" » Транзакции в триггере
Есть новые Нет новых   [134473   +28][b:0][p:0.002]