powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сохранить транзакцию частично в триггере
16 сообщений из 16, страница 1 из 1
Как сохранить транзакцию частично в триггере
    #39992604
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги,
добрый день

Есть триггер AFTER INSERT

Код: sql
1.
2.
ALTER       TRIGGER [dbo].[trTestInserted] ON [dbo].[tbTest] 
AFTER INSERT 



В триггере при определенных условиях, происходит отмена INSERT в базовой таблице, к которой привязан триггер, и сохранение отмененных данных

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
IF (..)
BEGIN
  ROLLBACK TRAN
  INSERT 
    INTO tbTestLost(CreateDate,ModifyDate,TestId)
    VALUES(@CreateDate,NULL,@TestId)
						
  RETURN
END



Можно ли тоже самое сделать как то по другому? Более изящно.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992606
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать instead of триггер и не вставлять те данные, которые вставлять не надо.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992607
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ограничены только триггером AFTER. Можем только в рамках его делать.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992612
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
Если ограничены только триггером AFTER. Можем только в рамках его делать.
Тогда просто удалите ненужное вставленное. Это накладнее, но как сделать не накладнее, я уже предлагал.

Роллбэки в триггере -- очень плохая идея. Прям вооот такая вот грабля, которая будет вас лупить и лупить по голове.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992614
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
Можно ли тоже самое сделать как то по другому?
delete output
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992621
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич, если явно даю delete from table в триггере, то зависает транзакция.
Может там какие-то нюансы есть?
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992625
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
Гавриленко Сергей Алексеевич, если явно даю delete from table в триггере, то зависает транзакция.
Может там какие-то нюансы есть?
Ну так разберитесь, почему она "зависает".
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992630
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
Гавриленко Сергей Алексеевич, если явно даю delete from table в триггере, то зависает транзакция.
Может там какие-то нюансы есть?


Идите по пути INSTEAD OF INSERT . А вообще я подозреваю, что вам проще в самом insert условие поставить.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992650
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё это необходимо выполнять в процедуре. Программировать бизнес-логику "на триггерах" очень плохая идея.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992749
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Сделать instead of триггер и не вставлять те данные, которые вставлять не надо.


Если перейти все таки е Instead of trigger

В нем явно надо прописывать insert

Как корректно по условию, вставлять (поведение по умолчанию без триггера) или не вставлять запись?
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992750
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
Гавриленко Сергей Алексеевич
Сделать instead of триггер и не вставлять те данные, которые вставлять не надо.


Если перейти все таки е Instead of trigger

В нем явно надо прописывать insert

Как корректно по условию, вставлять (поведение по умолчанию без триггера) или не вставлять запись?
Командой insert вставлять нужное в нужные таблицы из псевдо-таблицы inserted. Если в instead of триггере не написать вставку, ничего и не вставится.

Как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF (..) 
  INSERT 
    INTO tbTestLost(CreateDate,ModifyDate,TestId)
    VALUES(@CreateDate,NULL,@TestId)
						
else
   insert [dbo].[trTestInserted] ( список полей )
   select список полей from inserted
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992752
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич, спасибо огромное, а есть возможность не указывать список полей в ситуации когда поведение по умолчанию
Код: sql
1.
2.
3.
4.
INSERT
		INTO tbTest()
			SELECT *
				FROM inserted
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992753
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выдается ошибка в последнем случае
Значение столбца идентификаторов в таблице "tbTest" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992764
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
выдается ошибка в последнем случае
Значение столбца идентификаторов в таблице "tbTest" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.
А вам религия не позволяет список полей написать без поля identity?
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992765
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Challenger
выдается ошибка в последнем случае
Значение столбца идентификаторов в таблице "tbTest" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.
А вам религия не позволяет список полей написать без поля identity?


Список полей я написал. И это работает.
Просто хотелось бы чтобы триггер не зависел от полей, если это возможно. Поля могут добавляться. Не хотелось бы каждый раз менять триггер.
Или это невозможно?
...
Рейтинг: 0 / 0
Как сохранить транзакцию частично в триггере
    #39992766
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger
Гавриленко Сергей Алексеевич
пропущено...
А вам религия не позволяет список полей написать без поля identity?


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


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