Да, TRUNCATE
можно откатить в транзакции в SQL Server. На самом деле есть только несколько вещей, которые нельзя откатить с помощью транзакции в SQL Server. Например, вы даже можете откатить другие операторы DDL (например, DROP
и CREATE
ниже):
USE Sandbox;
GO
CREATE TABLE dbo.Table1 (I int);
CREATE TABLE dbo.Table2 (I int);
GO
WITH N AS (
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N))
INSERT INTO dbo.Table1
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4;
WITH N AS (
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N))
INSERT INTO dbo.Table2
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4;
GO
BEGIN TRANSACTION SampleTran;
TRUNCATE TABLE dbo.Table1;
CREATE TABLE dbo.Table3 (I int);
INSERT INTO dbo.Table3
SELECT I
FROM dbo.Table2;
DROP TABLE dbo.Table2;
ROLLBACK TRANSACTION SampleTran;
GO
--Contains 10,000 rows
SELECT *
FROM dbo.Table1;
GO
--Still exists
SELECT *
FROM dbo.Table2;
GO
--Doesn't exist
SELECT *
FROM dbo.Table3;
GO
--Clean up
DROP TABLE dbo.Table1;
DROP TABLE dbo.Table2;
Несмотря на то, что «intellisense», вероятно, говорит вам, что dbo.Table2
не существует в более низких пакетах, он существует, поскольку эта транзакция была отменена. (Intellisense также будет думать, что dbo.Table3
все еще существует, а это не так.)
В отличие от мифа, в который люди верят, TRUNCATE
регистрируется. Однако, в отличие от DELETE
, TRUNCATE
удаляет страницы, на которых хранятся данные, а не отдельные строки. Журнал того, какие страницы были удалены, все еще записывается, поэтому TRUNCATE
все еще можно откатить, так как удаление этих страниц просто не зафиксировано.
person
Larnu
schedule
01.03.2020
commit
? - person Yogesh Sharma   schedule 01.03.2020commit
. Так что он пока в стадии эксплуатации. - person Yogesh Sharma   schedule 01.03.2020