select * from aa
update aa set City='chennai',LastName='vinoth';
ID FirstName LastName City
29 Abcrdrr vinoth chennai
1 John vinoth chennai
2 Joe vinoth chennai
35 raja vinoth chennai
38 Johsdfgn vinoth chennai
誤って更新しましたLastname, City
すべての行の列。次に、古いテーブル行にロールバックします。
SQL-Server 2008R2を使用します。
何らかの履歴テーブルとトリガーを配置していない限り、すべての変更で古い値を保持するため、または更新を実行する前にテーブルのコピーを作成した場合を除き、最後のbackupを使用する必要があります。それはその更新の前に取られました。それを(一時データベースとして)復元し、データを抽出します。
バックアップはありますか?
ところで、次回更新するときは、次のように設定することをお勧めします。
SELECT *
-- UPDATE t SET Column1 = x, Column2 = y
FROM MyTable AS t
WHERE ...
最初にSELECT
を実行して、更新される行を正確に確認します。必要に応じて、WHERE
句を調整して、ターゲットにする行を取得します。次に、文をUPDATE
から最後までマークして実行します。 WHERE
句を忘れて、 "ブラインド"更新を実行する方がはるかに安全です(これが問題だったと思います)。
より安全です-最初にいくつかのテストデータベースで実行してください。
別のアプローチはfn_dblog
はトランザクションログ内を確認します。それは静かな事前のトピックなので、優れた記事を参照してください SQL Serverログの読み取りと解釈の方法 - Remus Rusan による
今後回避するために、いつでもトランザクションを使用できます
BEGIN TRAN
BEGIN TRY
update tbl set City='chennai',LastName='vinoth' from aa AS tbl;
-- if update is what you want then
COMMIT TRAN
END TRY
BEGIN CATCH
-- if NOT then
IF @@TRANCOUNT > 0
ROLLBACK
THROW
END CATCH
編集:複雑なT-SQLを作成するときは、TRY-CATCH
ブロックしてTRANSACTION
を使用すると、例外が発生した場合やクエリがキャンセルされた場合にリソースをロックしません。それ以外の場合、クエリが複雑でない場合は、トランザクションを使用しないことをお勧めします。
また、Blazが述べたように、データベースに変更を加える前に、データベースまたはテーブルのみのバックアップを取ることは常に良いことです。