🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.lang.csharp
Article #21201

logowanie procedur T-SQL

#21201
From: Maro
Date: Fri, 27 Nov 2009 16:43
64 lines
4809 bytes
Witam,

(Z gory przepraszam jesli NTG, temat na pograniczu C#/TSQL.)

Mamy w projekcie ologowany kod C# (biblioteka log4net), logi zapisuja
sie w bazie danych (poziom error) oraz w rolling files (wszystko),
swietnie sie to sprawdza. Jestesmy w stanie przesledzic wykonanie
wszystkich akcji w aplikacji do momentu wywolania procedury
skladowanej. W momencie przejscia wykonania na strone bazy danych,
wpadamy w czarna dziure. Jesli kod T-SQL rzuci wyjatkiem to nie ma
mozliwosci uzyskac informacji z ktorego konkretnie miejsca i jaka
instrukcja ten wyjatek spowodowala. Jest to zwlaszcza problematyczne w
przypadku, gdy wywolujemy jakas procedure (mamy wiec punkt
zaczepienia), ale ta procedura wywoluje kolejne procedury, te wywoluja
kolejne itd. Taki poziom komplikacji kodu bazodanowego sprawia duze
trudnosci przy wykrywaniu, analizowaniu i poprawianiu bledow.
Refaktoring warstwy bazodanowej niestety nie wchodzi w gre.

Padl zatem pomysl opracowania mechanizmu logownia wykonania kodu w
procedurach skladowanych T-SQL (SQL Server 2k5, szukuje sie "niedlugo"
migracja na 2k8). Czyli parafrazujac nazewnictwo cos typu "log4TSQL".
Idealnym rozwiazaniem byloby umieszczanie tychze logow do tego samego
rolling file'a, do ktorego pisze log4net, aby zachowac logiczna
kolejnosc wykonywania sie kodu oraz tym samym ulatwic support itd.
Innym rozwiazaniem jest rowniez wpisywanie logow do tabeli, wraz z
timestampem, poziomem komunikatu (debug, info, error, critical),
loginem itp. To podejscie jest o tyle dobre, ze pozwala latwo
filtrowac i przegladac logi, co w przypadku pliku tekstowego nie jest
mozliwe. Idealnym rozwiazaniem byloby polaczenie tych dwoch opcji, tak
jak to ma miejsce w log4net - dodajemy tylko  odpowiedni appender.

Jesli zas chodzi o samo ologowanie procedur, to dobrym punktem
startowym byloby uzyskanie sytuacji, w ktorej mamy zalogowane wejscie
do procedury plus wartosc wszystkich parametrow oraz wyjscie z
procedury. Wyobrazam to sobie w ten sposob, aby napisac mechanizm,
ktory automatycznie do ciala kazdej procedury dodaje na poczatku
odpowiednie wywolanie innej procedury. W tej dodanej procedurze bedzie
juz sie odbywac logowanie. No i tutaj juz pierwsze schody - jak cos
takiego napisac. Reflksji nie mamy:) Jest widok, w ktorym sa trzymane
ciala wszystkich procedur, ale napisanie skryptu, ktory to potrafi
sprytnie przeparsowac i powstawiac "to co trzeba, tam gdzie trzeba"
juz nie wydaje sie wcale banalna sprawa. Dodatkowo dochodzi tu sprawa
wydajnosci - czy aby zbyt duzo insertow nie zarznie serwera. inna
sprawa, ktora rowniez mnie nurtuje to transakcje. Kod w C# jest
napisany w ten sposob, ze transakcja jest otwierana na poziomie
aplikacji i jesli z procedury przyjdzie wyjatek, to w catchu robimy
rollback. Jesli zatem bedziemy robic inserty z logami to jakiejs
tabeli to w momencie rollbacka zostajemy z wroblem na dachu. Moze da
sie zrobic cos w rodzaju wewnetrznej transakcji do wykonania tych
insertow?

Troche moj mail jest nieuporzadkowany, za co przepraszam. Jest mnostwo
znakow zapytania i watpliwosci (nie sposob nawet wszystkich wymienic),
a wolalbym nie zaczynac pracy nie majac pewnosci, ze warto. Mam
nadzieje, ze udalo mi sie w miare jasno nakreslic sytuacje :)

Uprzejmie bym prosil o jakies wskazowki, linki do artykulow (niestety
nie znalazlem niczego sensownego), Wasze doswiadczenia i sugestie. Jak
sobie poradzic z takim problemem. A moze mechanizm logowania T-SQL'a
to slepy zaulek i istnieje jakis lepszy, uniwersalny sposob na to?

Z gory dziekuje ze wszelkie porady.
Pozdrawiam uprzejmie,
Maro
Technical Details
Message-ID: <d836be97-594a-479d-87f1-92c1afe86622@m26g2000yqb.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!m26g2000yqb.googlegroups.com!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!m26g2000yqb.googlegroups.com!not-for-mail
From: Maro <m.kortylewicz@gmail.com>
Newsgroups: alt.pl.comp.lang.csharp
Subject: logowanie procedur T-SQL
Date: Fri, 27 Nov 2009 08:43:17 -0800 (PST)
Organization: http://groups.google.com
Lines: 64
Message-ID: <d836be97-594a-479d-87f1-92c1afe86622@m26g2000yqb.googlegroups.com>
NNTP-Posting-Host: 15.203.169.106
Mime-Version: 1.0
X-Trace: posting.google.com 1259340197 29745 127.0.0.1 (27 Nov 2009 16:43:17 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Fri, 27 Nov 2009 16:43:17 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: m26g2000yqb.googlegroups.com; posting-host=15.203.169.106;  posting-account=GEyluAoAAAAP0lZ-i0_6_0ItazjIo1Ly
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;  GTB6; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR  3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR  3.5.30729),gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit