Mam tabelę logowania, w której wszystkie wstawki są wykonywane za pomocą jednej procedury składowanej.
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
Obecnie w tej tabeli znajduje się około 45500000 wierszy i chcę przekierować logowanie do innej tabeli.
Moim pomysłem jest użycie następującego skryptu
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;
Czy to działa i ma minimalny wpływ na inne procedury wywołujące LogInsert?
sql-server-2008
transaction
ddl
bernd_k
źródło
źródło
Odpowiedzi:
Tak. Transakcje dotyczą partii DDL i zakresów.
Zrobiłbym coś takiego. Zwróć uwagę na użycie SERIALIZABLE ISOLATION, aby zapewnić pełną izolację i XACT_ABORT, który wymusi wycofanie każdego błędu.
źródło