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

Вниз

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

 
stas ©   (2008-08-29 15:01) [40]

sql   (29.08.08 14:57) [38]
Весь, для этого  и таблица, а не переменные в самом триггере.
Триггер выполнится столько раз сколько выполнишь запрос независимо сколько обновилось записей.


 
DiamondShark ©   (2008-08-29 15:11) [41]


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


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


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

Все записи, которые затрагивает выполняющийся оператор.


 
sql   (2008-08-29 15:21) [42]


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

Хорошо, если я делаю пакетную вставку, тогда как мне отобразить записи в логе которые я вставил, т.е. лог не обычный клон той таблици в которой триггер, а в общей таблице для логирования событий, думаю примерно понятно о чем речь... Тогда прейдется в триггере делать cursor, чтоб он перелил каждую запись, или нет ?


 
MsGuns ©   (2008-08-29 15:22) [43]

>DiamondShark ©   (29.08.08 13:28) [22]
>Нет такой "концепции".

Есть только одна "концепция" - твоя. Остальное - бред сивой кобылы ;)


 
Курдль   (2008-08-29 15:27) [44]


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

А я вот не поленился почитать Ваш код и ужаснулся - это я так отстал от жизни, или триггер ... BEFORE INSERT... существует только в оракле?


 
Игорь Шевченко ©   (2008-08-29 15:36) [45]

MsGuns ©   (29.08.08 15:22) [43]

Не надо садиться в лужу лишний раз


 
Polevi ©   (2008-08-29 15:44) [46]

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

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

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


 
stas ©   (2008-08-29 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


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

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


 
stas ©   (2008-08-29 15:51) [50]

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


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


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

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


 
stas ©   (2008-08-29 16:04) [52]

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


 
DiamondShark ©   (2008-08-29 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 ©   (2008-08-29 16:27) [54]


> Курдль   (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: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 ©   (2008-08-29 16:35) [56]

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


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

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

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


 
DiamondShark ©   (2008-08-29 17:27) [58]

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


 
XentaAbsenta ©   (2008-08-29 20:08) [59]

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

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

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


 
Petr V. Abramov ©   (2008-08-30 16:38) [60]


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

+1


 
Petr V. Abramov ©   (2008-08-30 17:45) [61]


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

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

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


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

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

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


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


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

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


 
stas ©   (2008-08-31 12:58) [64]

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


 
Курдль   (2008-09-01 14:06) [65]


> 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. Есть ли вероятность того, что между апдэйтом, селектом и реакцией на ошибку, кто-то из клиентов поимеет и употребит во зло измененную запись вместе с ошибкой?


 
Cobalt   (2008-09-01 14:12) [66]

> Petr V. Abramov ©   (31.08.08 00:54) [63]

И...? в случае ошибки программа зависнет в цикле? Так будете отлавливать?


 
Игорь Шевченко ©   (2008-09-01 14:13) [67]

XentaAbsenta ©   (29.08.08 20:08) [59]


> ТРИГГЕРЫ ЗЛО
> ТРИГГЕРЫ ЗЛО
> ТРИГГЕРЫ ЗЛО
> ТРИГГЕРЫ ЗЛО
> ТРИГГЕРЫ ЗЛО
>
> Если кому будет интересно - обосную


Ламерам удавиться и сдохнуть


 
MsGuns ©   (2008-09-01 14:42) [68]

>Игорь Шевченко ©   (01.09.08 14:13) [67]
>> ТРИГГЕРЫ ЗЛО

В некоторых случаях 100%

>Ламерам удавиться и сдохнуть

Как и некоторым здешним "академикам" ;)


 
evvcom ©   (2008-09-01 15:04) [69]


> Cobalt   (01.09.08 14:12) [66]
>
> > Petr V. Abramov ©   (31.08.08 00:54) [63]
>
> И...? в случае ошибки программа зависнет в цикле? Так будете
> отлавливать?

Ты не понял. Если сервер сообщит об ошибке, то допущен цикл в связке.
А вообще каждый инструмент хорош при его правильном использовании. Триггер нужен на своем месте, хп на своем.


 
Petr V. Abramov ©   (2008-09-01 16:18) [70]


> Курдль   (01.09.08 14:06) [65]


> 1. Сколько СУБД понимают "select ... start with PARENT_ID
> = :1"?

одна :)

> 2. Нужен ли клиенту СУБД весь этот сыр-бор с селектами/апдэйтами?

КЛИЕНТУ - не нужен, для того хранимки и придумали

> 3. Есть ли вероятность того, что между апдэйтом, селектом
> и реакцией на ошибку, кто-то из клиентов поимеет и употребит
> во зло измененную запись вместе с ошибкой?

если после update не всобачен commit - то нету
> Cobalt   (01.09.08 14:12) [66]
> > Petr V. Abramov ©   (31.08.08 00:54) [63]
>
> И...? в случае ошибки программа зависнет в цикле? Так будете
> отлавливать?

нет, select вызовет ошибку, код не помню


 
Курдль   (2008-09-01 16:36) [71]


> Petr V. Abramov ©   (01.09.08 16:18) [70]
> нет, select вызовет ошибку, код не помню


А не вернет ли пустой набор?
Если ты имеешь в виду ораклевый connect by prior start with...


 
evvcom ©   (2008-09-01 17:02) [72]


> А не вернет ли пустой набор?
> Если ты имеешь в виду ораклевый connect by prior start with...

Нет, вызовет исключение.


 
Petr V. Abramov ©   (2008-09-01 17:07) [73]


> Курдль   (01.09.08 16:36) [71]

нет, именно ошибку
ORA-01436: CONNECT BY loop in user data


 
Petr V. Abramov ©   (2008-09-01 23:52) [74]

поп факту ж.. в данных можно найти с помощью
CONNECT_BY_ISCYCLE pseudocolumn
и
CONNECT BY NOCYCLE PRIOR
но:
в 10.2.ххх работает стабильно, в 8.1.7.4 нету.


 
Кщд   (2008-09-02 07:58) [75]

>XentaAbsenta ©   (29.08.08 20:08) [59]
>Категорично против триггеров,
>категорично против транзакций в триггерах!
с удовольствием послушаю о причинах
да, и где записывают в вашу секту?


 
Курдль   (2008-09-02 13:05) [76]


> Petr V. Abramov ©   (01.09.08 16:18) [70]
> КЛИЕНТУ - не нужен, для того хранимки и придумали


Для чего? У меня есть фигова туча наработок под клиенты и апп.серверы  - целые классы, даже скажу пафоснее - паттерны! Они расшифровывают мои замысловатые многотабличные датасэты, чтобы сгенерировать DML. Они подстраиваются под конкретную СУБД и конкретный драйвер соединения. Они исправно работают от проекта к проекту и еще и совершенствуются в своем универсализме. А ты хочешь, чтобы я взял каменный топор и пошел писать "хранимки" под каждый датасэт?
Вот без триггеров представить себе работу не могу... Рад бы от них отказаться - но не получается.


 
Petr V. Abramov ©   (2008-09-02 13:44) [77]


> даже скажу пафоснее - паттерны!
... чтобы сгенерировать DML

позволю себе опошлить: == "шаблоны хранимок" в профиль
:)))

> А ты хочешь, чтобы я взял каменный топор и пошел писать "хранимки" под каждый датасэт?
а если что-то в шаблон не укладывается, то на pl/sql писать проще, чем извращаться на студии или дельфях.

Конечно, если надо делать что-то СУБД-независимое, твой подход получается верным.
Но если не надо, то проще пользоваться мощнейшим pl/sql`ем, чем C# или VB, которые для работы с реляционными данными просто не заточены


 
Курдль   (2008-09-02 14:08) [78]


> Petr V. Abramov ©   (02.09.08 13:44) [77]
>  чем C# или VB, которые для работы с реляционными данными
> просто не заточены


ADO.NET для работы с реляционными данными заточены!
На то есть датасэты с реляциями.


 
Petr V. Abramov ©   (2008-09-02 14:39) [79]


> На то есть датасэты с реляциями.

а что делать-то с этими реляциями?
foreign-ключи на клиенте проверять?

растолкуй смысл, я его действительно не понимаю


 
Курдль   (2008-09-02 15:52) [80]


> Petr V. Abramov ©   (02.09.08 14:39) [79]
> а что делать-то с этими реляциями?
> foreign-ключи на клиенте проверять?
>
> растолкуй смысл, я его действительно не понимаю


Один смысл ты и сам написал: foreign-ключи на клиенте проверять
2. Весело и задорно пользовать возможности
public DataRow[] GetChildRows (DataRelation relation)
3. Весело и задорно пользовать возможности
DataRow.GetParentRows (DataRelation)
4. Использовать объект, максимально точно инкапсулирующий какую-либо структуру данных из предметной области.
5. Создавать и использовать классы, способные автоматически обрабатывать сложные структуры данных.



Страницы: 1 2 3 вся ветка

Форум: "Базы";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.008 c
15-1236093100
boa_kaa
2009-03-03 18:11
2009.05.03
Те, кто ждал - дождались...


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


2-1237465592
djkondakov
2009-03-19 15:26
2009.05.03
Перемешать ListBox без повторов


2-1237887945
J.S.
2009-03-24 12:45
2009.05.03
Наследник TList


6-1202735762
gear
2008-02-11 16:16
2009.05.03
Как выключить HTTP/1.1 и включить HTTP/1.0 в WININET?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский