Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транзакции в триггере


Страницы:   1 2 3 4 5

sql ©   (2008-08-29 11:40:00) 

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-09-01 14:06:00) [21]


> Petr V. Abramov ©   (31.08.08 00:54) [63]
> "тоже мне бином Ньютона"
> update потом select ... start with PARENT_ID = :1
> если ошибка, то цикл


1. Сколько СУБД понимают " select ... start with PARENT_ID = :1"?
2. Нужен ли клиенту СУБД весь этот сыр-бор с селектами/апдэйтами?
3. Есть ли вероятность того, что между апдэйтом, селектом и реакцией на ошибку, кто-то из клиентов поимеет и употребит во зло измененную запись вместе с ошибкой?


stas   (2008-08-31 12:58:00) [22]

XentaAbsenta ©   (29.08.08 20:08) [59]
интересно.


Petr V. Abramov   (2008-08-31 00:54:00) [23]


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

"тоже мне бином Ньютона"
update потом select ... start with PARENT_ID = :1
если ошибка, то цикл


MsGuns   (2008-08-31 00:40:00) [24]

>DiamondShark ©   (29.08.08 17:27) [58]

Какое доскональное знание предмета ! Сразу чувствуется гигантский практический опыт.


Petr V. Abramov   (2008-08-30 17:45:00) [25]


> Особенно про ХП? Знаю такой стиль - применение ХП вместо
> DML.
что геморройного?

> Мало того, что это геморрой, но еще и обрубает все пути
> автоматизации генерирования этих DML средами разработки.
>

а что, средства разработки уже умеют делать что-то сложнее, чем нагенерить insert-update-delete одной таблицы, да и то при insert не зная откуда ключ взять?


Petr V. Abramov   (2008-08-30 16:38:00) [26]


> DiamondShark ©   (29.08.08 13:28) [22]

+1


XentaAbsenta   (2008-08-29 20:08:00) [27]

Категорично против триггеров,
категорично против транзакций в триггерах!

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

Если кому будет интересно - обосную


DiamondShark   (2008-08-29 17:27:00) [28]

Лужа -- относительно мелкое углубление в плотном верхнем слое грунта или искусственном покрытии, заполненное жидкостью, преимущественно, дождевой либо талой водой, часто с заметным количеством взвешенных частиц грунта и других веществ, присутствующих в атмосфере и на подлежащей поверхности.
Посадка в лужу состоит в погружении ягодиц в наполняющую лужу жидкость на всю глубину лужи. Вхождение ягодиц в лужу сопровождается характерным звуком и, при значительной вертикальной составляющей скорости вхождения ягодиц в лужу, разбрызгиванием содержимого лужи и, в случае грунтового основания, размокшего грунта.


MsGuns   (2008-08-29 16:55:00) [29]

>Игорь Шевченко ©   (29.08.08 15:36) [45]
>Не надо садиться в лужу лишний раз

О "луже" поподробнее, пожалуйста


stas   (2008-08-29 16:35:00) [30]

DiamondShark ©   (29.08.08 16:27) [54]
Ну, да - INSTEAD. Они могут заменить BEFORE.


DiamondShark   (2008-08-29 16:34:00) [31]


> 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   (2008-08-29 16:27:00) [32]


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


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

А у MSSQL таки нет BEFORE триггеров.
Зато есть INSTEAD триггеры.


DiamondShark   (2008-08-29 16:20:00) [33]


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

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

Зависит от сложности преобразований над вставленными строками.


stas   (2008-08-29 16:04:00) [34]

Курдль   (29.08.08 15:58) [51]
несилен в sql видимо. Да там и ненужны транзакции.


Курдль   (2008-08-29 15:58:00) [35]


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

А чего тогда аутор копья ломает о мельницы?


stas   (2008-08-29 15:51:00) [36]

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


stas   (2008-08-29 15:49:00) [37]

sql   (29.08.08 15:21) [42]
неделай курсор в триггере!


Курдль   (2008-08-29 15:49:00) [38]


> Курдль   (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   (2008-08-29 15:46:00) [39]

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


Polevi   (2008-08-29 15:44:00) [40]

>DiamondShark ©   (29.08.08 13:33) [24]

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

но при этом стараются избегать


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо