2011-12-17 7 views
-1

可能性の重複可能であるかよりも、TRUNCATE文をロールバックすることが許可されていない場合:
Truncate Table Within Transactionトランザクションに

それがどのようによりTRUNCATE文をロールバックすることが許可されていない場合トランザクションでロールバックされます。次のコードを考えて、返信してください。

USE tempdb 
GO 
-- Create Test Table 
CREATE TABLE TruncateTest (ID INT) 
INSERT INTO TruncateTest (ID) 
SELECT 1 
UNION ALL 
SELECT 2 
UNION ALL 
SELECT 3 
GO 
-- Check the data before truncate 
SELECT * FROM TruncateTest 
GO 
-- Begin Transaction 
BEGIN TRAN 
-- Truncate Table 
TRUNCATE TABLE TruncateTest 
GO 
-- Check the data after truncate 
SELECT * FROM TruncateTest 
GO 
-- Rollback Transaction 
ROLLBACK TRAN 
GO 
-- Check the data after Rollback 
SELECT * FROM TruncateTest 
GO 
-- Clean up 
DROP TABLE TruncateTest 
GO 
+1

正確に何を求めていますか? SQL Serverでは、TRUNCATEはトランザクションです。あなたはそれがどこでないと読んだのですか? –

+3

あなたは答えがあり、明らかにあなたを助けてくれましたが、あなたはそれを受け入れていませんでした(http://u.sbhat.me/t6SXUH)。他の人はあなたを助けてくれる人ではないかもしれない – Sathya

答えて

0

Oracleでは、TRUNCATE文は実行前に現在のトランザクションを終了します(COMMITを使用して)。次に、DDL文のように扱われるため、TRUNCATEはロールバックの可能性なしで実行されます。そして、新しいトランザクションが開始されます。

私が理解しているように、Oracleの他のDDL文の動作は多少似ています。

一部のDBMSはトランザクション型のDDL文を提供しますが、非常に便利です。

4

Truncate Cannot Be Rolled Back Because It Is Not LoggedというSQL Serverの一般的な考え方です。しかし、あなたの質問のコードは、これが実際には神話であることを確認するだけです。それだけではなく、ログ(See a detailed breakdown of logging here)に削除された行の内容全体を記録するよりも、システムテーブルにページdeallocatonsと、いくつかのメタデータの更新をログに記録するよう

TRUNCATE

DELETEよりもはるかに少ない 伐採を伴うん。

SQL Serverのcontinues to lock割当て解除されたページのトランザクションはそう彼らの再割り当てを防止TRUNCATEROLLBACKは単にログに記録されているこれらのページの割り当て解除とシステムテーブルの更新を逆にする必要がコミットするまで。

2

MS SQL:

TRUNCATE文はロールバックすることができないという概念はかなり一般的に誤解されます。

Truncateステートメントを実行すると、DDLステートメントのようにログファイルに記録されません。

テーブルを切り捨てると、切り捨て前の時点に戻ることはできません。

ただし、トランザクションでは、ロールバックが許可され、他のロールバックと同様に機能します。

参照されるロールバックは、トランザクションロールバックではありません。

本質的には、COMMITが発行される前のどこでも、TRUNCATE文をロールバックできます。 COMMIT後、ログ・ファイルを使用してもデータをロールバックすることはできません。回復不能です。

+0

この質問にはOracleとSQL Serverの質問がありますので、答えはSQL Server(OracleではTRUNCATEをロールバックできません)についてだけ書いています。 –

+0

ありがとう、ありがとうそれ。 – Charl

関連する問題