Article View: pl.comp.lang.delphi.bazy-danych
Article #82824Re: Dziennik operacji
From: wloochacz
Date: Thu, 13 Jul 2017 16:22
Date: Thu, 13 Jul 2017 16:22
76 lines
5560 bytes
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-mailReferences:
<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