У меня есть таблица входа в систему, в которую все вставки выполняются с помощью одной хранимой процедуры.
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?
sql-server-2008
transaction
ddl
bernd_k
источник
источник
Ответы:
Да. Транзакции применяются к партиям DDL и span.
Я бы сделал что-то вроде этого. Обратите внимание на использование SERIALIZABLE ISOLATION для обеспечения полной изоляции и XACT_ABORT, который вызывает откат при любой ошибке.
источник