🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi.bazy-danych
Article #82824

Re: Dziennik operacji

#82824
From: wloochacz
Date: Thu, 13 Jul 2017 16:22
76 lines
5560 bytes
W dniu 2017-07-13 o 13:33, immo pisze:
> W dniu czwartek, 13 lipca 2017 13:13:17 UTC+2 użytkownik Pancio napisał:
>>>> Czasami numerację rekordów pokazuję w aplikacji, aby użytkownik miał wgląd w numer rekordu. I już kilku userów zgłosiło mi, że nagle "zginęło im" 1000
>>>
>>> I choćby z tego powodu nigdy tego nie robię :) ID jest wewnętrzną sprawą programu :P Jak chcesz mieć numerację dla człowieka to trzeba ją zrobić.
>>
>> A tak swoją drogą w jaki sposób to robisz? Trigery czy sam to obsługujesz z poziomu aplikacji? Bo chyba też będę musiał się z tym zmierzyć i szukam jakiegoś sprawdzonego, sprawnego rozwiązania.
> 
> Mówisz o logowaniu operacji?
Mowa chyba o nadawaniu numerków :)
Ja rozwiązałem to w ten sposób, że dostarczyłem nową funkcję do 
preprocesora FireDAC, która jest wywoływana jako DefaultExpression 
danego pola, które chce dostać nową wartość przy dodaniu rekordu.
Ta funkcja zwraca odpowiednią wartość i w ten sposób obsługuje ID i 
numeratory - np. numer jakiegoś dokumentu.

> Hmm... Ogólnie z poziomu aplikacji. Ale - ja nie koduje w sposób Click and Code :) Mam framework, gdzie definicje SQLi sobie siedzą np. w bazie, dana forma wie co ma obsługiwać. SQLe są obsługiwane przez odpowiednią klasę nimi zarządzającą. Przez co ma ona wiedzę o jej stanie przed i po aktualizacji i potrafi automatycznie logować to do np. bazy/ pliku / czy w jakiekolwiek inne miejsce. Core aplikacji ma też informacje o sesji, użytkownikach, uprawnieniach itd itp, więc log może być bardzo szczegółowy.

To się da zrobić w FireDAC/AnyDAC by design, ale trzeba ciut niżej 
zejść. Lepiej kod pokażę:
<code>
function TADAdaptedDataSetHelper.GetChangesAsXML: string;
var
   lXMLStorage  : TADStorage;
   lStringStream: TStringStream;
   lTable       : TADDatSTable;
   lEncoder     : TADEncoder;
begin
   lEncoder          := TADEncoder.Create(nil);
   //-- kododwanie XML dla typu danych XML w MSSQL musi być UTF-16!
   lEncoder.Encoding := ecUTF16;

   lTable        := Self.Table.GetChanges();
   lXMLStorage   := ADStorageManager().GetStorage('', sfXML, 
Self.ResourceOptions, lEncoder);
   lStringStream := TStringStream.Create();
   try
     lXMLStorage.Open('', lStringStream, smWrite);
     lTable.SaveToStorage(lXMLStorage);
     lXMLStorage.Close;
     Result := lStringStream.DataString;
   finally
     lTable.Free;
     lXMLStorage.Free;
     lStringStream.Free;
     lEncoder.Free;
   end;
end;
</code>

Kod jest prosty nie wymaga tłumaczenia, raczej...
Warunek jest jeden - DataSet z którego pobieramy zmiany musi działać w 
trybie CachedUpdates.
Natomiast sam XML zwraca dla każdego zmienionego wiersza jego stan przed 
i po zmianach - wystarczy spojrzeć na tak wygenerowanego XMLa i wszystko 
będzie jasne.
Można sobie tego XMLa sparsować i wydłubać z niego tylko np. zmiany.
Kod jest na tyle ogólny, że zadziała z dowolnym DataSetem.

> Gdybym tego nie miał to poszedł bym (jako że nie używam Expressa) w kierunku obsługi logów przez SQLServer - bo tak jest najprościej nie dotykając kodu.
Ale zdajesz sobie sprawę, że CDC to tylko w wersji Enterprise?
A ta wersja MSSQLa z definicji będzie tylko w bardzo dużych organizacjach...

> Pytanie jest zawsze takie samo - chcesz zapłacić i się mniej narobić (kupując gotowe rozwiązanie, lepszą wersję SQLServera itd itp), czy zaoszczędzić (teoretycznie) i mieć więcej roboty tworząc swoje rozwiązanie.
Mam zupełnie inną opinię w tej kwestii.
Żaden gotowiec po stronie bazy danych nie da Ci wszystkiego, co jest 
potrzebne Twojej aplikacji.
No chyba, ze ta aplikacja jest prosta i realizuje dostęp do danych 
table-by-table - to może, ale i to nie zawsze...

Jest jeszcze inne podejście, po bandzie - ale to wymaga zmiany podejścia 
do programowania o 180 stopni ;-)
http://blog.synopse.info/post/2014/06/22/Audit-trail-for-ORM-change-tracking

-- 
wloochacz
Technical Details
Message-ID: <59679e65$0$5157$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <229b9869-138d-4149-a1b7-51f2e27b25d1@googlegroups.com> <596354e1$0$5148$65785112@news.neostrada.pl> <596369d3$0$15194$65785112@news.neostrada.pl> <bced7674-60e6-4431-8a2c-8767e428b786@googlegroups.com> <5964ef7c$0$15204$65785112@news.neostrada.pl> <5723a4db-6a3f-4513-8cde-1c130acd5be4@googlegroups.com> <c8060669-c23b-43ad-8540-af6602af8cc0@googlegroups.com> <755dd297-011a-47ff-a2e5-194c649e6e20@googlegroups.com> <202a44f5-f016-43a6-b82f-f0519cfdeec3@googlegroups.com> <7c0b6ffa-a7e6-4210-8958-b5aca00db84e@googlegroups.com> <eaa269e8-dd56-4238-860e-1203600afac9@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: Dziennik operacji
Newsgroups: pl.comp.lang.delphi.bazy-danych
References: <229b9869-138d-4149-a1b7-51f2e27b25d1@googlegroups.com> <596354e1$0$5148$65785112@news.neostrada.pl> <596369d3$0$15194$65785112@news.neostrada.pl> <bced7674-60e6-4431-8a2c-8767e428b786@googlegroups.com> <5964ef7c$0$15204$65785112@news.neostrada.pl> <5723a4db-6a3f-4513-8cde-1c130acd5be4@googlegroups.com> <c8060669-c23b-43ad-8540-af6602af8cc0@googlegroups.com> <755dd297-011a-47ff-a2e5-194c649e6e20@googlegroups.com> <202a44f5-f016-43a6-b82f-f0519cfdeec3@googlegroups.com> <7c0b6ffa-a7e6-4210-8958-b5aca00db84e@googlegroups.com> <eaa269e8-dd56-4238-860e-1203600afac9@googlegroups.com>
From: wloochacz <wloochacz@no.spam.gmail.com>
Date: Thu, 13 Jul 2017 18:22:59 +0200
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1
MIME-Version: 1.0
In-Reply-To: <eaa269e8-dd56-4238-860e-1203600afac9@googlegroups.com>
Lines: 76
Message-ID: <59679e65$0$5157$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 79.186.44.213
X-Trace: 1499962982 unt-rea-a-01.news.neostrada.pl 5157 79.186.44.213:7392
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit