Member 13225800 Ответов: 2

В отношении команды отката тоже


Мы создали таблицу, например, с 10 записями. Пример 101,102,103,104,105,106, 107,108,109,110

1-й шаг мы вставили 5 записей и создали точку сохранения A
2-й шаг мы обновили 5 записей и создали точку сохранения B
3-й шаг мы удалили 5 записей и создали точку сохранения C.
Удаленные записи были, например, 101,103,105,107 и 109. Теперь, если мы наберем команду rollback для сохранения точки B, все удаленные записи будут откатаны.

**Мой вопрос: Можно ли откатить определенные записи, такие как 103 и 107, вместо всех 5 записей, которые были удалены?**

Что я уже пробовал:

пытался, но не смог добиться результата.

2 Ответов

Рейтинг:
2

OriginalGriff

Нет: MSDN -
Вложенные Транзакции
[^]

Цитата:
Фиксация внутренних транзакций игнорируется ядром базы данных SQL Server. Транзакция либо фиксируется, либо откатывается в зависимости от действия, предпринятого в конце самой внешней транзакции. Если внешняя транзакция зафиксирована, то фиксируются и внутренние вложенные транзакции. Если внешняя транзакция откатывается, то все внутренние транзакции также откатываются, независимо от того, были ли внутренние транзакции зафиксированы индивидуально.


Единственный способ добиться этого - иметь две независимые транзакции: как только первая будет зафиксирована, можно будет начать вторую транзакцию. Откат второго не будет откатывать первого.


0x01AA

Только вопрос: в чем тогда смысл вложенных транзакций? Я имею в виду, тогда одного будет достаточно?

OriginalGriff

Это позволит им, вложенные коммиты игнорируются, но вложенные откаты-нет.
Так что если вы сделаете это:

Старт транс 1
... Добавьте
Старт транс 2
... Добавить B
Rollback 2-откат B
... Добавить C
Фиксация 1

Затем A & C фиксируются в БД.
Это имеет большой смысл, когда вы думаете об этом:


Старт транс 1
... Добавьте
Старт транс 2
... Добавить B
Совершить 2
... Добавить C
Откат 1

Если бы он не игнорировал вложенные коммиты, A &C был бы откатан назад, оставив B как потенциально несогласованные данные.

0x01AA

Ух ты, Спасибо, сэр. Мне нужно сейчас несколько минут, чтобы понять это и посмотреть, где это мне поможет. Нажать на пятерку гораздо проще :)

[Редактировать]
Второй я пока не получаю, но работаю над ним
[/Редактировать]

0x01AA

не то место, моя ошибка

Рейтинг:
2

RickZeeland

Вы можете переместить удаленные или измененные записи в" резервную " таблицу с помощью trigger при удалении.
Затем, при необходимости, вы можете восстановить записи из этой таблицы.
Другим вариантом было бы добавить поле "удалено" в вашу таблицу и использовать его в качестве флага, но это не элегантное решение, я думаю, производительность также будет лучше при использовании первого решения.

Пример для SQL Server, не тестировался, но должен работать:

CREATE TRIGGER ondeleteTrigger
    ON database1.dbo.table1
    FOR DELETE
AS
    INSERT INTO database2.dbo.backupTable SELECT * FROM DELETED
GO

Более подробная информация о CREATE TRIGGER можно найти здесь: Создать триггер (Transact-SQL) | Microsoft Docs[^]


Member 13225800

Здравствуйте, сэр, не могли бы вы привести пример.