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


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


Petr V. Abramov   (2008-09-02 16:56:00) [1]

кстати о птичках: а не пора ли в потрепаловку?
:)


Petr V. Abramov   (2008-09-02 16:55:00) [2]


> evvcom ©   (02.09.08 16:52) [83]

ага


evvcom   (2008-09-02 16:52:00) [3]


> бегать по ним, обрабатывать...
>
> update ...
> set ... = (select ...
> where not exists (....
> returning ...
>
> всяко меньше букаф и лучше по скорости

уууу.... А если еще аналитические функции оракловые вспомнить, то ADO.NET вообще глаза выпучит! А они, ой, как иной раз скорости добавляют :-)


evvcom   (2008-09-02 16:48:00) [4]

Подобные вкусности (универсальность) с точки зрения "написал программу, и она под любой осью работает", тоже уже реализовали в java. Но как я только сталкиваюсь с жутко тормозящим приложением, первая мысль - это java. Взять тот же инсталлятор оракловый. Насколько хороша СУБД, настолько же плох ее инсталлятор. Нельзя написать универсальное приложение, чтобы оно всех и во всем устраивало.


Petr V. Abramov   (2008-09-02 16:39:00) [5]


> Один смысл ты и сам написал: foreign-ключи на клиенте проверять

это хорошо для одпользовательской системы иначе пустая трата времени


> 2. Весело и задорно пользовать возможности
> public DataRow[] GetChildRows (DataRelation relation)

бегать по ним, обрабатывать...

update ...
set ... = (select ...
where not exists (....
returning ...

всяко меньше букаф и лучше по скорости

опять же, если база - foxpro, то 2-5 - вкусно, если oracle -совсем нет


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


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


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


Petr V. Abramov   (2008-09-02 14:39:00) [7]


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

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

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


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


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


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


Petr V. Abramov   (2008-09-02 13:44:00) [9]


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

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

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

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


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


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


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


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

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


Petr V. Abramov   (2008-09-01 23:52:00) [12]

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


Petr V. Abramov   (2008-09-01 17:07:00) [13]


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

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


evvcom   (2008-09-01 17:02:00) [14]


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

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


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


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


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


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


> Курдль   (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 вызовет ошибку, код не помню


evvcom   (2008-09-01 15:04:00) [17]


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

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


MsGuns   (2008-09-01 14:42:00) [18]

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

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

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

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


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

XentaAbsenta ©   (29.08.08 20:08) [59]


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


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


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

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

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


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

Наверх

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