Saya memiliki tabel login tempat semua sisipan dilakukan oleh satu prosedur tersimpan.
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
Saat ini ada sekitar 45500000 baris dalam tabel itu dan saya ingin langsung masuk ke tabel lain.
Ide saya adalah menggunakan skrip berikut
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;
Apakah ini berfungsi dan memiliki dampak minimal terhadap prosedur lain yang memanggil LogInsert?
sql-server-2008
transaction
ddl
bernd_k
sumber
sumber
Jawaban:
Iya nih. Transaksi berlaku untuk DDL dan span batch.
Saya akan melakukan sesuatu seperti ini. Perhatikan penggunaan ISOLASI SERIALISASI untuk memastikan isolasi penuh dan XACT_ABORT yang akan memaksa rollback pada kesalahan apa pun.
sumber