Как я могу отменить запрос UPDATE на SQL Server 2005?
Мне нужно сделать это в SQL, а не через код.
Как я могу отменить запрос UPDATE на SQL Server 2005?
Мне нужно сделать это в SQL, а не через код.
begin transaction
// execute SQL code here
rollback transaction
Если вы уже выполнили запрос и хотите его вернуть, к сожалению, единственная реальная опция - восстановить резервную копию базы данных. Если вы используете полное резервное копирование, вы должны иметь возможность восстановить базу данных в определенный момент времени.
Вам нужен этот инструмент, и вы можете найти транзакцию и отменить ее.
Вы можете использовать неявные транзакции для этого
SET IMPLICIT_TRANSACTIONS ON
update Staff set staff_Name='jas' where staff_id=7
ROLLBACK
Как вы просите - вы можете установить эту настройку (SET IMPLICIT_TRANSACTIONS ON
) из хранимой процедуры, установив эту хранимую процедуру как процедуру запуска.
Но команда SET IMPLICIT TRANSACTION ON
является специфичной для соединения. Таким образом, любое соединение, отличное от того, которое запускает хранимую процедуру запуска, не будет использовать настройку, которую вы установили.
Вы можете отменить заявления, которые вы выполнили в транзакции. Вместо совершения транзакции откат транзакции.
Если вы что-то обновили и хотите отменить эти обновления, и вы не сделали этого внутри транзакции (пока еще не совершена), я думаю, что это удача...
(вручную восстановить или восстановить резервные копии)
Как только обновление будет выполнено, вы не сможете отменить только одно обновление. Лучше всего вернуться к предыдущей резервной копии базы данных.
Из информации, которую вы указали, ваша лучшая вероятность восстановления - это резервное копирование базы данных. Я не думаю, что вы сможете откатить какие-либо из этих изменений, которые вы проталкивали, поскольку в то время вы, по-видимому, не использовали транзакции.
Простота:
код заголовка...
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command Set
objMyRecordset = New ADODB.Recordset
On Error GoTo ERRORHAND
Рабочий код...
objMyConn.ConnectionString = ConnStr
objMyConn.Open
code....
'Копировать данные из 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
...
Как уже было сказано, вы ничего не можете сделать, кроме восстановления из резервной копии. По крайней мере, теперь вы научитесь всегда переносить утверждения в транзакции, чтобы увидеть, что происходит до того, как вы решите совершить. Кроме того, если у вас нет резервной копии вашей базы данных, это также научит вас делать регулярные резервные копии вашей базы данных.
Хотя мы не очень помогали вашей проблеме imdeiate... надеюсь, эти ответы гарантируют, что вы не столкнетесь с этой проблемой снова в будущем.
в этом примере мы запускаем 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
Try
ROLLBACK WORK;
Он обычно работает