Article View: alt.pl.comp.lang.csharp
Article #21201logowanie procedur T-SQL
From: Maro
Date: Fri, 27 Nov 2009 16:43
Date: Fri, 27 Nov 2009 16:43
64 lines
4809 bytes
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-mailShow 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