Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сохранить транзакцию частично в триггере / 16 сообщений из 16, страница 1 из 1
26.08.2020, 16:27
    #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
26.08.2020, 16:30
    #39992606
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
Сделать instead of триггер и не вставлять те данные, которые вставлять не надо.
...
Рейтинг: 0 / 0
26.08.2020, 16:33
    #39992607
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
Если ограничены только триггером AFTER. Можем только в рамках его делать.
...
Рейтинг: 0 / 0
26.08.2020, 16:39
    #39992612
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
Challenger
Если ограничены только триггером AFTER. Можем только в рамках его делать.
Тогда просто удалите ненужное вставленное. Это накладнее, но как сделать не накладнее, я уже предлагал.

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


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


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

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

Как корректно по условию, вставлять (поведение по умолчанию без триггера) или не вставлять запись?
...
Рейтинг: 0 / 0
27.08.2020, 00:03
    #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
27.08.2020, 00:15
    #39992752
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
Гавриленко Сергей Алексеевич, спасибо огромное, а есть возможность не указывать список полей в ситуации когда поведение по умолчанию
Код: sql
1.
2.
3.
4.
INSERT
		INTO tbTest()
			SELECT *
				FROM inserted
...
Рейтинг: 0 / 0
27.08.2020, 00:17
    #39992753
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
выдается ошибка в последнем случае
Значение столбца идентификаторов в таблице "tbTest" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.
...
Рейтинг: 0 / 0
27.08.2020, 01:20
    #39992764
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
Challenger
выдается ошибка в последнем случае
Значение столбца идентификаторов в таблице "tbTest" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.
А вам религия не позволяет список полей написать без поля identity?
...
Рейтинг: 0 / 0
27.08.2020, 01:29
    #39992765
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить транзакцию частично в триггере
Гавриленко Сергей Алексеевич
Challenger
выдается ошибка в последнем случае
Значение столбца идентификаторов в таблице "tbTest" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON.
А вам религия не позволяет список полей написать без поля identity?


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


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


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