如何在SQL Server DDL中使用事务?


20

我有一个登录表,所有插入都通过一个存储过程完成。

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(1, 1) NOT NULL,
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log PRIMARY KEY CLUSTERED  (LogRefnr)
)
go


Create procedure DBO.LogInsert ( @Query varchar(255), @time datetime, @duration int, @SessinID int) as
begin
    Insert into LogTable ( LogRefnr, LogQuery, logQueryDuration, LogSessionID)
    Values  (@Query, @time, @duration, @SessinID);
end;
GO

当前该表中大约有45500000行,我想直接将日志记录到另一个表中。

我的想法是使用以下脚本

begin Transaction

exec sp_rename LogTable, LogTableOld;

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL,            -- greater than select max(LogRefnr) from LogTableOld
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED  (LogRefnr);
)
go

sp_recompile LogTable;
go

Commit;

这对其他调用LogInsert的过程有效吗?


2
您不需要sp_recompile。重命名对象时,使用对象dbo.LogTable的所有对象的过程高速缓存将自动过期。
mrdenny

Answers:


24

是。事务适用于DDL和跨批次。

我会做这样的事情。请注意,使用SERIALIZABLE ISOLATION可以确保完全隔离,并使用XACT_ABORT会强制回退任何错误。

SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
begin Transaction
GO
exec sp_rename LogTable, LogTableOld;
GO
CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL,            -- greater than select max(LogRefnr) from LogTableOld
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED  (LogRefnr);
)
go
EXEC sp_recompile LogTable;
go

Commit;

1
您可以链接到显示SQL Server事务适用于DDL和跨批次的参考吗?在明显的 BOL页面没有提到这一点。
Nick Chammas,

2
@Nick:我从没找过。我知道它在我一直使用时会起作用。由您自己决定相信我还是反对我,还是自己尝试一下。当然,事务是针对每个连接的,就像我使用的各种set语句一样。一个连接包含多个批次。您还需要什么?
gbn

我相信您,但是我希望获得一些“官方”文档,该文档枚举与显式事务绑定的所有操作,而哪些不是。例如,表变量不受事务回滚的影响(对我而言,这违反了“最不惊奇原则”)。
Nick Chammas

2
几乎相同的代码,但是事务不起作用:stackoverflow.com/questions/47868213/…–
aleyush
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.