J'ai une table de connexion dans laquelle toutes les insertions sont effectuées par une seule procédure stockée.
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
Actuellement, il y a environ 45 500 000 lignes dans cette table et je souhaite diriger la journalisation vers une autre table.
Mon idée est d'utiliser le script suivant
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;
Est-ce que cela fonctionne et a un impact minimal sur les autres procédures appelant LogInsert?
sql-server-2008
transaction
ddl
bernd_k
la source
la source
Réponses:
Oui. Les transactions s'appliquent aux lots DDL et span.
Je ferais quelque chose comme ça. Notez l'utilisation de SERIALIZABLE ISOLATION pour assurer une isolation complète et XACT_ABORT qui forcera un retour en arrière sur toute erreur.
la source