Eu tenho uma tabela de logon na qual todas as inserções são feitas por um único procedimento armazenado.
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
Atualmente, existem cerca de 45500000 linhas nessa tabela e desejo direcionar o log para uma tabela diferente.
Minha ideia é usar o seguinte script
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;
Isso funciona e tem impacto mínimo em outros procedimentos que chamam LogInsert?
sql-server-2008
transaction
ddl
bernd_k
fonte
fonte
Respostas:
Sim. As transações se aplicam a DDL e abrangem lotes.
Eu faria algo assim. Observe o uso de SERIALIZABLE ISOLATION para garantir o isolamento completo e o XACT_ABORT, que forçará uma reversão a qualquer erro.
fonte