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

回答:


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ページはこのことを言及していません。
ニックチャマス

2
@ニック:探したことがありません。私いつも使っているので、それが機能することを知っています。私を信じるか、私を反証するか、自分で試してみてください。もちろん、トランザクションは、私が使用するさまざまなsetステートメントのような接続ごとです。接続は複数のバッチで構成されます。さらに何が必要ですか?
gbn

私はあなたを信じていますが、明示的なトランザクションにバインドされているアクションとそうでないアクションを列挙した「公式」ドキュメントを望んでいました。たとえば、テーブル変数はトランザクションのロールバックの影響を受けません(私にとっては、最小サプライズの原則に違反しています)。
ニックチャンマス

2
ほぼ同じコードが、トランザクションは動作しません:stackoverflow.com/questions/47868213/...
aleyush
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.