SQL Server DDL ile işlemler nasıl kullanılır?


20

Tüm eklerin tek bir saklı yordamla yapıldığı bir oturum açma tablom var.

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

Şu anda bu tabloda yaklaşık 45500000 satır var ve günlüğe kaydetmeyi farklı bir tabloya yönlendirmek istiyorum.

Benim fikrim şu betiği kullanmak

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;

Bu çalışıyor mu ve LogInsert'i çağıran diğer prosedürleri minimum düzeyde etkiliyor mu?


2
Sp_recompile dosyasına ihtiyacınız yoktur. Dbo.LogTable nesnesini kullanan nesneler için yordam önbelleğinin süresi, nesneyi yeniden adlandırdığınızda otomatik olarak sona erer.
mrdenny

Yanıtlar:


24

Evet. İşlemler DDL ve yayılma kümeleri için geçerlidir.

Böyle bir şey yapardım. Tam izolasyon sağlamak için SERIALIZABLE ISOLATION ve tüm hatalarda geri dönüşü zorlayacak XACT_ABORT kullanımına dikkat edin.

SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
begin Transaction
GO
exec sp_rename LogTable, LogTableOld;
GO
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
EXEC sp_recompile LogTable;
go

Commit;

1
SQL Server işlemlerinin DDL ve yayılma kümeleri için geçerli olduğunu gösteren bir referansa bağlanabilir misiniz? Bariz BOL sayfaları bu söz etmeyin.
Nick Chammas

2
@Nick: Hiç aramadım. Her zaman kullandığım gibi çalıştığını biliyorum . Bana inanmak, beni çürütmek ya da kendin denemek sana kalmış. Tabii ki, işlemler bağlantı başına kullandığım set ifadeleri gibi. Bir bağlantı birden çok partiden oluşur. Daha ne istiyorsun?
gbn

Sana inanıyorum, ancak açık işlemlere bağlı olan ve olmayan tüm eylemleri numaralandıran bazı "resmi" belgeler umuyordum. Örneğin, tablo değişkenleri işlem geri alımlarından etkilenmez (bana göre En Az Sürpriz İlkesini ihlal eder ).
Nick Chammas

2
Neredeyse aynı kod, ancak işlem çalışmıyor: stackoverflow.com/questions/47868213/…
aleyush
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.