Skocz do zawartości

Pobranie z Śladu rewizyjnego, szczegółowych danych przez SQL

Polecane posty

Próbuję rozgryźć strukturę tabeli danych Śladu rewizyjnego, celem kontroli zmian w rachunkach bankowych klientów, w sumie w związku z tym postem:

Przeanalizowałem dokumentację i moduły śladu rewizyjnego, ale niestety utknąłem w martwym punkcie. Chciałbym wyciągnąć wszystkie zdarzenia dotyczące modyfikacji rachunku klienta, jak np. to:

slad.thumb.JPG.02f4c1812dabbf4f6404f0f86c7b4ab9.JPG

Rozpocząłem analizowanie waszej struktury danych, znalazłem Sobie zapis z powyższego zrzutu danych, do analizy, ale niestety nie jestem w stanie w SQLu dotrzeć do danych, z grupy Zmiany - podejrzewałem dane z DaneTechniczneZdarzenSladuRewizyjnego mogą to być, ale te są skompresowane i w SQLu nie mogę się do nich dostać. Już nawet próbowałem użyć funkcji DECOMPRESS, która w dokumentacji serwera SQL istnieje, ale już w samym serwerze nie działa :(

SELECT
zds.Id [Id],
zds.Data [Data zdarzenia],
CAST(DECOMPRESS(dtzsr.DaneSkompresowane) AS NVARCHAR(MAX)) [Info]
FROM ModelDanychContainer.ZdarzeniaSladuRewizyjnego AS zds
INNER JOIN ModelDanychContainer.DaneTechniczneZdarzenSladuRewizyjnego AS dtzsr ON dtzsr.Id=zds.DaneTechniczneId
WHERE zds.Id = 305580

 

Link to postu

Szedł Pan właściwym tropem. Już tłumaczę ścianę z którą Pan się zderzył:

Ze względu na ilość danych w "Szczegółach" zdecydowaliśmy ich nie trzymać w formie tabel SQL lecz skompresowanych danych binarnych.

Kompresowane są one po stronie aplikacji (nie serwera SQL) ze względu na to, że mamy w ten sposób kontrolę nad algorytmem kompresji (możemy użyć tego, który w danej sytuacji daje najlepszy stopień kompresji).

Kod jakim nexo odczytuje szczegóły ze zdarzenia (z encji ZdarzenieSladuRewizyjnego) wygląda następująco (2 metody statyczne: pierwsza rozpakowuje do postaci stringa z JSON-em, który jest deserializowany do postaci obiektów za pomocą drugiej metody):

        public static string RozpakujDaneTechniczne(this ZdarzenieSladuRewizyjnego zdarzenie)
        {
            var daneTechniczne = zdarzenie.DaneTechniczne;
            if (daneTechniczne != null)
            {
                if (!string.IsNullOrEmpty(daneTechniczne.Dane))
                {
                    return daneTechniczne.Dane;
                }
                else if (daneTechniczne.DaneSkompresowane != null && daneTechniczne.DaneSkompresowane.Length > 0)
                {
                    var trybKompresji = (KompresjaISzyfrowanie.MetodaKompresji)daneTechniczne.DaneSkompresowane[0];
                    var daneDoDekompresji = daneTechniczne.DaneSkompresowane.Skip(1).ToArray();
                    return KompresjaISzyfrowanie.DecompressStringFromBytes(daneDoDekompresji, trybKompresji);
                }
            }

            return null;
        }

        public static SzczegolyZdarzenia DeserializujDaneTechniczne(string daneTechniczne)
        {
            return daneTechniczne != null ? JsonConvert.DeserializeObject<SzczegolyZdarzenia>(daneTechniczne) : null;
        }
    }

 

Zatem, aby znaleźć wszystkie zdarzenia, które modyfikują dane pole, należy przeiterować po stronie aplikacji .NET (nie musi być to Sfera, bo ww. metody korzystają wyłącznie ze statycznych typów z DLL-ek nexo) po wszystkich zdarzeniach, rozpakować, zdeserializować szczegóły i sprawdzić w nich czy było zmieniane jakieś pole.

 

Edytowane przez Wojciech Urbanowski
Link to postu
  • 4 miesiące temu...
Dnia 8.11.2019 o 08:41, Radomił Ząbik napisał:

Dobra, to skąd bierzecie KompresjaISzyforwanie - nie znajduje mi tego w dokumentacji :(

Przepraszam za zwłokę w odpowiedzi - umknęło mi powiadomienie.

namespace: InsERT.Moria.Narzedzia.DokumentyDoKsiegowania
assembly: InsERT.Moria.Narzedzia.dll

Link to postu
×
×
  • Dodaj nową pozycję...