Làm cách nào để sử dụng giao dịch với SQL Server DDL?


20

Tôi có một bảng đăng nhập để thực hiện tất cả các thao tác chèn bằng một thủ tục được lưu trữ.

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

Hiện tại có khoảng 45500000 hàng trong bảng đó và tôi muốn đăng nhập trực tiếp vào một bảng khác.

Ý tưởng của tôi là sử dụng đoạn script sau

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;

Điều này có hoạt động và có tác động tối thiểu đến các thủ tục khác gọi LogInsert không?


2
Bạn không cần sp_recompile. Bộ đệm thủ tục cho mọi đối tượng sử dụng đối tượng dbo.LogTable sẽ tự động hết hạn khi bạn đổi tên đối tượng.
mrdenny

Câu trả lời:


24

Vâng. Giao dịch áp dụng cho các đợt DDL và span.

Tôi sẽ làm một cái gì đó như thế này. Lưu ý việc sử dụng SERIALIZABLE ISOLATION để đảm bảo cách ly hoàn toàn và XACT_ABORT, điều này sẽ buộc khôi phục lại bất kỳ lỗi nào.

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
Bạn có thể liên kết đến một tham chiếu hiển thị các giao dịch SQL Server áp dụng cho các đợt DDL và span không? Các trang BOL rõ ràng không đề cập đến điều này.
Nick Chammas

2
@Nick: Tôi chưa bao giờ tìm kiếm một cái. Tôi biết nó hoạt động như tôi sử dụng tất cả các thời gian. Tùy thuộc vào bạn để tin tôi hoặc từ chối tôi hoặc thử nó cho chính mình. Tất nhiên, các giao dịch trên mỗi kết nối giống như các câu lệnh khác nhau mà tôi sử dụng. Một kết nối bao gồm nhiều lô. Bạn cần thêm gì nữa à?
gbn

Tôi tin bạn, nhưng tôi đã hy vọng một số tài liệu "chính thức" liệt kê tất cả các hành động bị ràng buộc với các giao dịch rõ ràng và những hành động nào không. Ví dụ: các biến bảng không bị ảnh hưởng bởi các giao dịch quay vòng (mà theo tôi, vi phạm Nguyên tắc bất ngờ tối thiểu ).
Nick Chammas

2
Gần mã giống nhau, nhưng giao dịch không hoạt động: stackoverflow.com/questions/47868213/...
aleyush
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.