Как я могу откатить запрос UPDATE в SQL Server 2005? - PullRequest
18 голосов
/ 06 апреля 2009

Как мне откатить запрос UPDATE в SQL Server 2005?

Мне нужно сделать это в SQL, а не через код.

Ответы [ 10 ]

32 голосов
/ 06 апреля 2009
begin transaction

// execute SQL code here

rollback transaction

Если вы уже выполнили запрос и хотите откатить его, к сожалению, единственный реальный вариант - восстановить резервную копию базы данных. Если вы используете полное резервное копирование, вы сможете восстановить базу данных в определенный момент времени.

28 голосов
/ 06 апреля 2009

Вам нужен этот инструмент, и вы можете найти транзакцию и отменить ее.

Журнал ApexSQL

6 голосов
/ 30 января 2014

Вы можете использовать неявные транзакции для этого

SET IMPLICIT_TRANSACTIONS ON

update Staff set staff_Name='jas' where staff_id=7

ROLLBACK

По запросу. Вы можете УСТАНОВИТЬ эту настройку (SET IMPLICIT_TRANSACTIONS ON) из хранимой процедуры, задав эту хранимую процедуру в качестве процедуры запуска.

Но команда SET IMPLICIT TRANSACTION ON зависит от соединения. Таким образом, любое соединение, отличное от того, которое запускает хранимую процедуру запуска, не получит выгоды от установленной вами настройки.

5 голосов
/ 06 апреля 2009

Вы можете откатить операторы, которые вы выполнили в транзакции. Вместо фиксации транзакции выполните откат транзакции.

Если вы что-то обновили и хотите откатить эти обновления, и вы не сделали этого внутри (еще не зафиксированной) транзакции, то я думаю, что это удача ...

(Восстановление вручную или восстановление резервных копий)

1 голос
/ 09 января 2013

Просто сделать:

код заголовка ...

Set objMyConn = New ADODB.Connection

Set objMyCmd = New ADODB.Command Set

objMyRecordset = New ADODB.Recordset

On Error GoTo ERRORHAND 

Рабочий код ...

objMyConn.ConnectionString = ConnStr

objMyConn.Open 

код ....

'Копировать данные из Excel'

objMyConn.BeginTrans <-- define transactions to possible be rolled back 

For NewRows = 2 To Rows

objMyRecordset.AddNew 

For NewColumns = 0 To Columns - 1

objMyRecordset.Fields(NewColumns).Value = ActiveSheet.Cells(NewRows, NewColumns + 1)

Next NewColumns objMyRecordset.Update Next NewRows

objMyConn.CommitTrans <- if success, commit them to DB

objMyConn.Close

ERRORHAND:

Success = False 

objMyConn.RollbackTrans <-- here we roll back if error encountered somewhere

LogMessage = "ERROR writing database: " & Err.Description

...

1 голос
/ 06 апреля 2009

Исходя из указанной вами информации, ваш лучший шанс на восстановление - через резервную копию базы данных. Я не думаю, что вы сможете откатить любое из тех изменений, которые вы продвинули, поскольку вы, по-видимому, в то время не использовали транзакции.

1 голос
/ 06 апреля 2009

После того, как обновление зафиксировано, вы не можете откатить только одно обновление. Лучше всего откатиться на предыдущую резервную копию базы данных.

0 голосов
/ 04 января 2018

в этом примере мы запускаем 2-строчную вставку в запрос и, если все они верны, он выполняется, но если нет, то ничего не запускается и ROLLBACK

DECLARE @rowcount int  set @rowcount = 0 ; 
BEGIN TRANSACTION [Tran1]
BEGIN TRY 
 insert into [database].[dbo].[tbl1] (fld1) values('1') ;
    set @rowcount = (@rowcount + @@ROWCOUNT); 
 insert into [database].[dbo].[tbl2] (fld1) values('2') ;
    set @rowcount = (@rowcount + @@ROWCOUNT); 

IF @rowcount =  2
  COMMIT TRANSACTION[Tran1]
ELSE
  ROLLBACK TRANSACTION[Tran1]
END TRY
  BEGIN CATCH
  ROLLBACK TRANSACTION[Tran1]
END CATCH
0 голосов
/ 31 июля 2012

Попробуйте

ROLLBACK WORK;

Обычно работает

0 голосов
/ 06 апреля 2009

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

Хотя мы не помогли вам в вашей непосредственной проблеме ... надеюсь, эти ответы помогут вам не столкнуться с этой проблемой в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...