powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
13 сообщений из 13, страница 1 из 1
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32002986
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересуют следующие вопросы :
1. При каких условиях триггер не будет запущен повторно ? Как я понимаю, это происходит при изменении (добавлении, удалении) нескольких строк таблице одним оператором (UPDATE, INSERT, DELETE). При каких еще условиях это происходит (например операции в составе одной транзакции или пакета) ?
2. Как влияет на повторный запуск триггера использование пакетного обновления записей на сервере (Dataset.LockType:=ltBacthOptimistic ... в Delpi)?
3. Можно ли както добиться повторного запуска триггера на изменения(добавление, удаление) в каждой строке. Либо настройками SQL Srever или каким-то другим способом ?

все вопросы интересуют для SQL Server 7 или 2000 (если есть разница) !
Заранее спасибо за ответ !
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32002988
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггер запускается при выполнении на сервере операторов insert, delete или update. На него не влияет выполняются ли эти действия в пакете, из процедуры или из триггера других таблиц. Обновляется одна запись или несколько можно узнать внутри триггера из таблиц deleted и inserted.

Непонятно зачем добиваться повторного выполнения триггера - не проще ли все действия выполнить при первом его вызове? Но вообще если написать типа:
update TBL set FLD=FLD where ...
то триггер вызоветься и при этом никаких изменений не произойдет.

В базе настраивается будет ли триггер вызываться рекурсивно. Но это действует сразу для всех триггеров базы.

А вообще я не очень понял что вы имеете ввиду под "повторным запуском триггера "
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32002989
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггер MS SQL всегда запускается один раз, поэтому при написании триггера это нужно учитывать и работать не с одной строкой а набором строк.

Чтобы повторно запустить триггер нужно повторно сделать операцию insert update delete

Советую почитать BOL для лучшего понимания механизма работы триггеров.
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003002
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему, ранее DennisL работал с СУБД, в которой присутствуют триггеры BEFORE и AFTER. Как правило, в таких инструментариях триггеры срабатывают на операцию с каждой строкой таблицы по отдельности. В MS SQL Server есть только After-триггеры (даже Instead-триггеры SQL-2000 по своей сути являются AFTER-триггерами). Когда триггер сработал, операция УЖЕ ПРОИЗОШЛА, причем над всем массивом записей. Однако, ее еще можно откатить, либо внести в результаты ее работы некоторые изменения, либо дополнительные действия. Что именно произошло во время операции, можно узнать из специальных таблиц Deleted и Inserted. Грамотно построенный триггер в MS SQL SERVER не должен предполагать действий только над одной строкой (хотя, конкретное клиентское приложение, возможно, производит только построчные операции с таблицей). Он должен уметь обработать ситуацию, когда вызвана операция над пустым множеством строк, а также когда строк больше одной - на случай, если такие операции запущены из EM, QA или вообще из космоса...
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003009
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как мне кажется, Garya сделал правильное предположение. Тоько не Иуащку и After, а Row-level и Statement-level триггеры. Когда я начал изучать MsSQL, уже был опыт работы с Sybase SA. Там все это реализовано. По началу было как-то непонятно, но быстро пришло понимание, что достаточно организовать цикл по таблицам Inserted или Deleted, чтобы получить возможность работы с отдельнвми строками, когда это необходимо.
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003010
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как мне кажется, Garya сделал правильное предположение. Тоько не Before и After, а Row-level и Statement-level триггеры. Когда я начал изучать MsSQL, уже был опыт работы с Sybase SA. Там все это реализовано. По началу было как-то непонятно, но быстро пришло понимание, что достаточно организовать цикл по таблицам Inserted или Deleted, чтобы получить возможность работы с отдельнвми строками, когда это необходимо.
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003029
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня (упрощенно) такая задача :

Например в какойто таблице происходят изменения или удаление записей (например счета), каждый счет соответствует какомунибудь договору (они храняться в другой таблице) у договора может быть несколько статусов (в зависимости от того в каком статусе сейчас договор надо запретить удалять и изменять счета или это можено позволить).

В принципе такую проверку хотелось бы реализовать не очень сложным способом, при изменении или удалении записи запускаеться соответствующий триггер и проверяет статус у договора если стстус не позволяет изменений и удалений то они отменяються. Вот я и хотел уточнить что будет при пакетных изменениях (они могут затронуть одновременно как счета кторые можно изменять так и счета которые нельзя отменять) ... Тут ROLLBACK TRANSACTION отменит все изменения и те что надо отменить и те что не конфликуют со статусом договора.

Вот такой пример, но у меня есть несколько схожих ситуаций .... Потому интересуютвозможные пути и приемы разрешения таких задач.
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003030
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите в BOL Conditional Insert Trigger.
В принципе Вы можете не откатывать транзакцию, а востановить по заданному условию записи из таблицы deleted.
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003031
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На вский случай поясню - в момент обновления Вы получаете к Вашей обновленной таблице несколько виртуальных.
deleted - Содержит старые или удаленные записи
inserted содержит новые или обновляемые данные.

Таким образом у Вас есть возможность запрограммировать поведение триггера как Вам нужно, а откат транзакции лишь вариант такого поведения
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003038
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет в принципе я таким способом и думал решать эту задачу просто хотелось, узнать можеь есть решения по проще, чтобы не востанавливать записи из виртуальных таблиц т.д. Дело в том что у меня опять же при внесении новой записи в таблицу производиться еще фиксацие различных бугалтерских данных в специальные таблицы и т.д. Но в принципе эта проблема разрешима, как я понял из придыдущих ответов можно запретить запуск одних тригеров из других ...
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003039
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Но в принципе эта проблема разрешима, как я понял из придыдущих ответов можно запретить запуск одних тригеров из других ...

Это как? Я таких способов не знаю.
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003040
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что то связанное с каскадным запуском триггеров ... или это не то что надо !?

А как насчет обработки в цикле записей из deleted или inserted : может кините какойнибуть примерчик как это изящнее пишется ?

P.S. В одной из веток был упомянут какойто автор (Др... забыл), насколько я понял какието принципы постороения структур баз данных, можно по подробнее про то где можно найти информацию по этому вопросу (лучше в интернет).
...
Рейтинг: 0 / 0
Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
    #32003055
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 DennisL

Вобщем да, запустившись один триггер может запустить другой и т. д. Но вданном случае триггер можно запустить, но никак не запретить его выполнение. MS SQL позволяет также выполнять триггера рекурсивно, однако всеми этими возможностями нужно пользоваться осторожно, дабы пользователь все же смог дождаться окончания обновления

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


В инете, к сожаления я таких книг не находил, правда и не особенно искал.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как запускаються Триггеры в SQL Server (операции над несколькими строками)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]