május 2013 havi bejegyzések

A tábla változó, mint log tábla

A tábla változót nagyon jól lehet tranzakciók logolására használni. Úgy viselkedik, mint egy változó, viszont nem skaláris értékkel, hanem „táblázattal” tér vissza. Mivel változóként viselkedik, ezért örököl(het)te azt a tulajdonságát, hogy immunis a tranzakciókezelésre. Nekünk ez azért jó, mert kívül esik a rollback hatókörén.
Ennek a tulajdonságának az előnyét akkor lehet igazán élvezni, amikor valahogy logolni/debugolni kell, hogy egy tranzakció hol akad meg, vagy melyik ágba fut, mielőtt rollbackel véget érne.

Jöjjön egy nagyon egyszerű demó, hogy mire gondolok:

use tempdb
go

if object_id('temdb..#tmp') is not null
    drop table #tmp
go

create table #tmp (
    id int not null identity(1,1) primary key,
    name nvarchar(10) not null
)
go

declare @log_table table (
    id int not null identity(1,1) primary key,
    msg nvarchar(255) not null,
    dt datetime not null default getdate()
)

begin tran
    begin try
        insert into @log_table (msg) 
            values ('Első insert')
        insert into #tmp (name) 
            values ('Józsi')

        insert into @log_table (msg) 
            values ('Második insert')
        insert into #tmp (name) 
            values ('Több mint tíz karakter, hogy itt elszálljon')

        insert into @log_table (msg) 
            values ('Sikeresen végigfutottunk')
        commit
    end try
    begin catch
        if @@trancount > 0 rollback
        insert into @log_table (msg) 
            values ('Hibára futottunk a feldolgozás során')
    end catch

A temp táblánk a rollback hatására semmit nem írt be:

select * from #tmp

table_variable_empty_result

Míg a tábla változó gyönyörűen logolta, hogy mi is történt:

select * from @log_table

table_variable_log_table

A történetet tovább lehet bonyolítani azzal is, hogy az átmenti log tábla (@log_table) a futás után egy végleges log táblába (olyat most nem csináltunk) is teheti az eredményt, hogy később visszanézhető legyen.

Reklámok