Конференция "Базы" » Транзакции в триггере
 
  • sql (29.08.08 11:40) [0]
    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



    В какой части текста триггера лучше всего открывать глобальную, по отношению к триггеру, транзакцию ?
  • Игорь Шевченко © (29.08.08 11:41) [1]
    Транзакции в триггере есть безусловное зло :)
  • MsGuns © (29.08.08 11:43) [2]
    Как же все-таки гадость, этот ваш... триггер !
  • sql (29.08.08 11:53) [3]
    Ребят кому не сложно, можно ваши триггеры посмотреть, большей частью интересуют «сложно выпоенные» триггеры. Не беда если я в них не разберусь, просто хотелось посмотреть как их (триггеры) делают если можно так сказать профессионалы.

    Спасибо.
  • Polevi © (29.08.08 12:02) [4]
    профессионалы стараются избегать триггеров
  • sql (29.08.08 12:05) [5]

    > Polevi ©   (29.08.08 12:02) [4]

    А как же тогда логирование изменений, обеспечение целостности информации и т.д. ? Да, и насколько в среднем триггер замедляет процесс обработки данных ?
  • Игорь Шевченко © (29.08.08 12:08) [6]

    > А как же тогда логирование изменений, обеспечение целостности
    > информации и т.д.


    целостность информации обычно обеспечивается декларативными средствами.

    Про транзакции и триггеры рекомендую почитать:
    http://sql.ru/forum/actualthread.aspx?tid=588877 все страницы
  • stas © (29.08.08 12:09) [7]
    Для чего эта проверка?

    >
    >  IF EXISTS(SELECT * FROM Inserted)
    >    BEGIN
    >      IF NOT EXISTS(SELECT * FROM Deleted)
  • Ega23 © (29.08.08 12:09) [8]

    > профессионалы стараются избегать триггеров
    >


    +1.


    > А как же тогда логирование изменений, обеспечение целостности
    > информации и т.д. ?


    целостность данных обеспечивается средствами самой СУБД, такими как PK-FK constraints, нафига для этой цели триггеры - непонятно.

    Логгирование отлично обеспечивается из других мест (ХП, например).

    За 8+ лет работы с БД триггер понадобился один единственный раз.
  • Ega23 © (29.08.08 12:11) [9]

    > Для чего эта проверка?


    А как, по-твоему, устроена операция Update? Сначала Delete, потом Insert
  • stas © (29.08.08 12:13) [10]
    Ega23 ©   (29.08.08 12:11) [9]
    т.е. для определения операции?
  • sql (29.08.08 12:13) [11]

    > stas ©   (29.08.08 12:09) [7]

    В зависимости от события INSERT, UPDATE, DELETE, делать "разные вещи"...
  • stas © (29.08.08 12:17) [12]
    не проще 3 триггера сделать?
  • Ega23 © (29.08.08 12:21) [13]

    > т.е. для определения операции?


    Ну судя по тексту - да.
  • sql (29.08.08 12:22) [14]

    > stas ©   (29.08.08 12:17) [12]

    Мне кажется нет...
  • stas © (29.08.08 12:23) [15]
    Ну, или

    IF <Условие> --определяем UPDATE
    BEGIN
    Declare ...
    END

    IF <Условие> --INSERT
    BEGIN
    Declare ...
    END

    IF <Условие> -- DELETE
    BEGIN
    Declare ...
    END
    ...
    Insert into

    без всяких транзакций
  • sql (29.08.08 12:23) [16]

    > Ega23 ©   (29.08.08 12:21) [13]

    Не по тексту судить не надо, этот текст к примеру...
  • sql (29.08.08 12:25) [17]

    > stas ©   (29.08.08 12:23) [15]

    А допустим если необходимо при разных событиях иметь общию(ии) переменные...
  • stas © (29.08.08 12:30) [18]
    Вверху общие.

    Я сразу скажу этот лог (как в примере) работать будет некорректно при пакетной вставке, удалении обновлении.

    У нас огранизован лог подобный лог (я не настаиваю на его правильности)
    3 триггера на таблицу. Внутри просто
    Insert into...
    select f1..fn from inserted.
    Каждую ночь таблицы LOG списываются в архив и очищаются, т.к. при наполнении таблицы лога вставка происходит все медленее.
  • Игорь Шевченко © (29.08.08 12:49) [19]

    > А как, по-твоему, устроена операция Update? Сначала Delete,
    >  потом Insert


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