![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакции в триггере
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]
И...? в случае ошибки программа зависнет в цикле? Так будете отлавливать?