Udostępnij za pośrednictwem


Tworzenie zapytań związanych z automatyzacją za pomocą usługi Fabric

Notatka

Zastrzeżenie: Scenariusze, przykłady zapytań i dane użyte w tym samouczku są fikcyjne, mogą zawierać błędy, niewydajności i są przeznaczone wyłącznie do celów demonstracyjnych.

W poniższej tabeli wymieniono tabele związane z automatyzacją, często używane do raportowania i wglądu.

Display name Object name Purpose
Dziennik przepływu flowlog Zawiera szeroką gamę dzienników, takich jak dzienniki niestandardowe, dzienniki akcji przepływu pulpitu V2, dzienniki kolejek uruchomień maszyn, nienadzorowane żądania/odpowiedzi samonaprawy oraz dzienniki przetwarzania kolejki pracy itp. Dane są przechowywane w tabeli Elastic Dataverse , i w zależności od typu dziennika można je skonfigurować z własnymustawieniem czasu wygaśnięcia (TTL) w tabeli Organizacji ( FlowLogsTtlInMinutes iDesktopFlowQueueLogsTtlInMinutes ), które określa, kiedy rekordy mają być automatycznie usuwane z tabeli.
Maszyna przepływu flowmachine Zawiera informacje związane z maszyną i maszyną hostowaną.
Grupa maszyn przepływu flowmachinegroup Zawiera informacje związane z grupą maszyn i grupą maszyn hostowanych.
Przebieg przepływu flowrun Zawiera dane związane z uruchomieniem przepływu w chmurze, takie jak rozpoczęcie, zakończenie, trwanie, kontekst przepływu nadrzędnego itp.
Sesja przepływu flowsession Zawiera dane związane z uruchomieniem przepływu pulpitu, takie jak rozpoczęcie, trwania, status, maszyna, konto roagenta, kontekst przepływu nadrzędnego itp.
Proces workflow Zawiera przepływy pulpitu i przepływy w chmurze oparte na rozwiązaniach (wraz z innymi typami przepływów pracy).
Użytkownik systemuser Reprezentuje Dataverse użytkownika.
Kolejka pracy workqueue Reprezentuje wystąpienie wykonania przepływu pracy.
Element kolejki pracy workqueueitem Zawiera informacje o każdym uruchomieniu przepływu pracy.

Uproszczony diagram relacji między tabelami

Na ilustracji przedstawiono tylko odpowiednie relacje między tabelami na potrzeby automatyzacji.

Zrzut ekranu z rysunkiem relacji między encjami pokazującym relacje między tabelami związane z automatyzacją.

Tworzenie swojej pierwszej aplikacji w Fabric

Wykonaj następujące kroki, aby utworzyć przykładowe zapytanie SQL w analitycznym punkcie końcowym SQL w usłudze Fabric dla contoso_westus_accounts_payable Lakehouse.

  1. W przeglądarce przejdź do Microsoft Fabric (https://powerbi.com) i zaloguj się przy użyciu swoich poświadczeń.

  2. Wybierz obszar roboczy, w którym znajduje się magazyn lakehouse, a następnie wybierz żądany analityczny punkt końcowy SQL (węzeł podrzędny magazynu lakehouse).

  3. W analitycznym punkcie końcowym SQL wybierz pozycję Nowe zapytanie SQL, aby otworzyć edytor zapytań SQL.

  4. W edytorze zapytań SQL wprowadź zapytanie SQL i wybierz pozycję Uruchom. Poniższe przykładowe zapytanie pobiera wszystkie przebiegi przepływu pulpitu (sesje przepływu) skojarzone z określonym przepływem pulpitu i identyfikatorem komputera, które nie powiodły się w ciągu ostatnich siedmiu dni.

       SELECT   
           flowsessionid,  
           statuscode,  
           startedon, 
           completedon,
           errorcode,  
           errormessage,  
           sessionusername,  
           runexecutionduration,  
           runduration,  
           runwaitduration,  
           context
       FROM   
           flowsession  
       WHERE   
           regardingobjectid = '[specific_flow_id]' -- Replace with the actual flow ID  
           AND machineid = '[specific_machine_guid]'  -- Replace with the actual machine ID  
           AND statuscode = 8 -- 'Failed' sessions  
           AND createdon >= DATEADD(day, -7, GETDATE())  
       ORDER BY   
           createdon DESC;  
    
  5. Oto lista dostępnych przyczyn stanu (kod stanu) dla Flow Sessions (przebiegi przepływu pulpitu) tabeli.

    Przyczyna stanu Wartość
    Wstrzymana 1
    Bieganie 2
    Oczekiwanie 3
    Zakończone pomyślnie 100
    Pominięty 5
    Zawieszona 6
    Anulowane 7
    Zakończone niepowodzeniem 8
    Zakończono błędem 9
    TimedOut 10
    Przerwana 11
    Zignorowane 12
  6. Przejrzyj wyniki zapytania, aby upewnić się, że spełniają Twoje potrzeby.

    Zrzut ekranu zapytania SQL wykonywanego w narzędziu do zarządzania bazami danych.

  7. (Opcjonalnie) Otwórz zapytanie na żywo z wynikami w programie Excel, zaznaczając zapytanie SQL i wybierając pozycję Otwórz w programie Excel w sekcji danych wyjściowych zapytania. Spowoduje to wygenerowanie i pobranie pliku programu Excel z zapytaniem na żywo do punktu końcowego SQL Analytics w celu dalszej analizy.

    Zrzut ekranu zapytania SQL wykonywanego w panelu zapytań bazy danych w usłudze Fabric.

  8. (Opcjonalnie) Aby zapisać zapytanie SQL do użycia w przyszłości, kliknij Zapisz zapytanie.

Podstawowe zapytania dotyczące przepływu

Pobieranie przepływów w chmurze z informacjami o właścicielu

To zapytanie zwraca wszystkie przepływy w chmurze wraz z informacjami o właścicielu.

Notatka

W Fabric dostępne są tylko przepływy w chmurze, które są częścią Dataverse rozwiązania.

    SELECT   
        w.name AS 'Cloud flow',  
        w.workflowid AS 'Cloud flow Id',  
        w.createdon AS 'Created on',
        w.modifiedon AS 'Last modified on',
        w.clientdata AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 5;  -- Only consider solution-cloud flows (category 5)  

Pobieranie przepływów pulpitu z informacjami o właścicielu

To zapytanie zwraca wszystkie przepływy pulpitu wraz z informacjami o właścicielu.

    SELECT   
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',
        w.modifiedon AS 'Last modified on',
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 6;  -- Only consider desktop flows (category 6)  

To zapytanie pobiera minimalną, średnią, maksymalną i odchylenie standardowe czasów wykonania dla przebiegów przepływów pulpitu (sesji przepływu) określonego przepływu pulpitu, przy czym czasy wykonania są konwertowane z milisekund zaokrąglonych w górę do najbliższej pełnej sekundy. Zapytanie grupuje wyniki według identyfikatorów maszyn i zawiera szczegółowe informacje, takie jak nazwy maszyn, typy zarządzania, maksymalna liczba hostowanych maszyn, pojemność sesji i data ostatniego sygnału z tabel grupy maszyn i maszyn.

    SELECT   
        f.machineid,  
        fm.name AS machine_name,  
        CASE   
            WHEN mg.managementtype = 0 THEN 'Regular Machine (Group)'  
            ELSE 'Hosted Machine (Group)'  
        END AS managementtype,  
        mg.maxmanagedmachinecount AS maxmanagedmachinecount,  
        fm.lastheartbeatdate AS last_heartbeat_date,  
        fm.sessioncapacity AS 'Max Parallel Sessions',    
        CEILING(MIN(f.runduration) / 1000.0) AS min_runtime,  
        CEILING(AVG(f.runduration) / 1000.0) AS mean_runtime,  
        CEILING(MAX(f.runduration) / 1000.0) AS max_runtime,  
        CEILING(STDEV(f.runduration) / 1000.0) AS stdev_runtime
    FROM   
        flowsession f  
    JOIN   
        flowmachinegroup mg ON f.machinegroupid = mg.flowmachinegroupid  
    JOIN   
        flowmachine fm ON f.machinegroupid = fm.flowmachinegroupid  
    WHERE   
        f.regardingobjectid = '[specific_flow_id]' -- Replace with the actual flow ID
    GROUP BY   
        f.machineid, fm.name, mg.managementtype, mg.maxmanagedmachinecount, fm.lastheartbeatdate, fm.sessioncapacity  
    ORDER BY   
        mean_runtime DESC;  

Zrzut ekranu zapytania SQL wykonywanego w Fabric z oknem wyników.

To zapytanie identyfikuje problemy z pojemnością komputera i licencjonowania dla określonego przepływu pulpitu, aby pomóc w optymalizacji alokacji zasobów i rozwiązaniu problemów z ograniczeniami wydajności.

    SELECT   
        f.machineid,  
        fm.name AS machine_name,  
        CASE   
            WHEN mg.managementtype = 0 THEN 'Regular Machine (Group)'  
            ELSE 'Hosted Machine (Group)'  
        END AS managementtype,  
        mg.maxmanagedmachinecount AS maxmanagedmachinecount,  
        fm.lastheartbeatdate AS last_heartbeat_date,  
        fm.sessioncapacity AS 'Max Parallel Sessions',  
        fm.overcapacitysince,  
        CASE   
            WHEN fm.overcapacitysince IS NOT NULL THEN 'Over Capacity'  
            ELSE 'Within Capacity'  
        END AS capacity_status  
    FROM   
        flowsession f  
    JOIN   
        flowmachinegroup mg ON f.machinegroupid = mg.flowmachinegroupid  
    JOIN   
        flowmachine fm ON f.machinegroupid = fm.flowmachinegroupid
    WHERE   
        f.regardingobjectid = '[specific_flow_id]' -- Replace with the actual flow ID
    GROUP BY   
        f.machineid, fm.name, mg.managementtype, mg.maxmanagedmachinecount, fm.lastheartbeatdate, fm.sessioncapacity, fm.overcapacitysince  
    ORDER BY   
        capacity_status DESC, fm.lastheartbeatdate DESC;  

Znajdowanie skryptów, które zawierają hasła w postaci zwykłego tekstu w połączeniach

To zapytanie znajduje wszystkie przepływy pulpitu używające parametrów połączenia z bazą danych (OLEDB), które są skonfigurowane do używania hasła w postaci zwykłego tekstu.

    SELECT   
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 6  
        AND w.definition IS NOT NULL  
        AND (LOWER(w.definition) LIKE '%;password=%');

Potencjalne ryzyko wstrzyknięcia SQL

Zapytanie wykrywa przepływy pulpitu zawierające skrypty potencjalnie podatne na wstrzyknięcie kodu SQL, wyszukując użycie database.executesqlstatement.execute [brakujący termin] w definicjach przepływów. Rozważmy scenariusz, w którym zamiast bezpośrednio pisać kod SQL w akcji 'Wykonaj instrukcję SQL', skrypt używa zmiennej wejściowej na pulpicie Power Automate (na przykład, %LetsDeleteAllGeneralLedgerEntriesFromDB%) podanej skryptowi w czasie wykonywania.

Zrzut ekranu okna dialogowego konfiguracji

    SELECT   
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 6  
        AND w.definition IS NOT NULL  
        AND LOWER(w.definition) LIKE '%database.executesqlstatement.execute%';
    

Użycie żądania API

To zapytanie pobiera przepływy pulpitu, które korzystają z zaawansowanych metod żądań interfejsu API, takich jak curl i Invoke-RestMethod inne requests, w celu identyfikowania łączności z zewnętrznymi usługami sieci Web lub usługami.

    SELECT   
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 6  
        AND w.definition IS NOT NULL  
        AND (
            LOWER(w.definition) LIKE '%curl%' OR 
            LOWER(w.definition) LIKE '%invoke-restmethod%' OR 
            LOWER(w.definition) LIKE '%invoke-webrequest%' OR 
            LOWER(w.definition) LIKE '%httpclient%' OR 
            LOWER(w.definition) LIKE '%requests.get%' OR 
            LOWER(w.definition) LIKE '%requests.post%' OR 
            LOWER(w.definition) LIKE '%fetch%' OR 
            LOWER(w.definition) LIKE '%axios%' OR 
            LOWER(w.definition) LIKE '%.ajax%'
        );
    

Użycie internetowych punktów końcowych i skrótów URL

To zapytanie wykrywa przepływy pulpitu zawierające skrypty, które odwołują się do skracaczy adresów URL, aby ocenić potencjalne ryzyko użycia ograniczonych adresów URL.

    SELECT   
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 6  
        AND w.definition IS NOT NULL  
        AND (
            LOWER(w.definition) LIKE '%bit.ly%' OR 
            LOWER(w.definition) LIKE '%linkedin.com%' OR 
            LOWER(w.definition) LIKE '%aka.ms%' OR 
            LOWER(w.definition) LIKE '%tinyurl.com%' OR 
            LOWER(w.definition) LIKE '%goo.gl%' OR 
            LOWER(w.definition) LIKE '%t.co%' OR 
            LOWER(w.definition) LIKE '%fb.me%' OR 
            LOWER(w.definition) LIKE '%is.gd%' OR 
            LOWER(w.definition) LIKE '%buff.ly%'
        );
    

Brakująca obsługa błędów w skryptach

To zapytanie wyszukuje przepływy pulpitu, które nie mają żadnych mechanizmów obsługi błędów, takich jak on block error lub on error, w celu zapewnienia niezawodności wykonywania skryptów.

    SELECT   
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM   
        workflow w  
    JOIN   
        systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.category = 6  
        AND w.definition IS NOT NULL  
        AND NOT (LOWER(w.definition) LIKE '%on block error%' OR LOWER(w.definition) LIKE '%on error%');
    

Notatka

Zanim przejdziesz do tej sekcji, upewnij się, że dzienniki przepływu pulpitu w wersji 2 zostały włączone w środowisku i że masz istniejące przebiegi przepływu pulpitu.

Przebiegi przepływu pulpitu z ograniczonym dostępem do adresów URL

To zapytanie znajduje wywołania usługi sieci Web (akcja Wywołaj usługę sieci Web) w określonym przepływie pulpitu w ciągu ostatnich trzech tygodni. Ten wynik jest przydatny do identyfikowania i analizowania potencjalnie podejrzanych punktów końcowych lub ograniczonych wywołań interfejsu API.

    SELECT   
        JSON_VALUE(f.data, '$.name') AS ActionName,  
        f.data AS 'Action log',  
        f.parentobjectid AS 'Parent object id',  
        f.createdon AS 'Log created on',
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM  
        [flowlog] f  
    JOIN  flowsession fs ON f.parentobjectid = fs.flowsessionid         
    JOIN  workflow w ON fs.regardingobjectid = w.workflowid  
    JOIN  systemuser s ON w.ownerid = s.systemuserid  
    WHERE   
        w.workflowid = '[specific_flow_id]' -- Replace with the actual flow ID
        AND f.createdon >= DATEADD(day, -21, GETDATE())
        AND JSON_VALUE(f.data, '$.name') = 'Invoke web service'  
        AND (  
            f.data LIKE '%contoso-default.crm.dynamics.com/api%'  
            OR f.data LIKE '%api.second-restricted-url.net%'  
            OR f.data LIKE '%api.third-restricted-url.de%'  
            OR f.data LIKE '%api.phishing-example.com%'  
        );

Problemy z kodem kryptograficznym

To zapytanie skanuje przepływy pulpitu w poszukiwaniu akcji skryptów PowerShell, które zawierały kod kryptograficzny w ciągu ostatnich siedmiu dni.

    -- Queries actions logs named 'Run PowerShell script' that contain code that that uses cryptographic libraries 
    -- and terms such as "AES", "RSA", "encryption", or "decryption," which may indicate risky operations
    SELECT top(1)
        JSON_VALUE(data, '$.name') AS ActionName,
        JSON_VALUE(data, '$.inputs') AS Inputs,
        JSON_VALUE(data, '$.outputs') AS Outputs
    FROM 
        [flowlog]
    WHERE
        JSON_VALUE(data, '$.name') = 'Run PowerShell script'
        AND createdon >= DATEADD(day, -7, GETDATE())
        AND (
            JSON_VALUE(data, '$.inputs') LIKE '%AES%'
            OR JSON_VALUE(data, '$.inputs') LIKE '%RSA%'
            OR JSON_VALUE(data, '$.inputs') LIKE '%encryption%'
            OR JSON_VALUE(data, '$.inputs') LIKE '%decryption%'
        )
    ORDER BY
        ActionName
    

Przepływ pulpitu z kodem

To zapytanie jest nieco bardziej zaawansowane. Identyfikuje i zlicza odrębne przebiegi przepływu pulpitu (Sesje Flow) z częściami kodu napisanymi w profesjonalnych językach programowania (takimi jak VBScript, PowerShell, JavaScript, .NET lub Python) z ostatnich siedmiu dni, a następnie grupuje wyniki według przepływu pulpitu.

WITH ProCodingSessions AS (  
    SELECT   
        fs.flowsessionid,  
        f.data AS 'Action log',  
        f.parentobjectid AS 'Parent object id',  
        f.createdon AS 'Log created on',  
        w.name AS 'Desktop flow',  
        w.workflowid AS 'Desktop flow Id',  
        w.createdon AS 'Created on',  
        w.modifiedon AS 'Last modified on',  
        w.definition AS 'Script',  
        w.ownerid AS 'Owner Id',  
        s.fullname AS 'Owner name',  
        s.internalemailaddress AS 'Owner email'  
    FROM [flowlog] f  
    JOIN flowsession fs ON f.parentobjectid = fs.flowsessionid  
    JOIN workflow w ON fs.regardingobjectid = w.workflowid  
    JOIN systemuser s ON w.ownerid = s.systemuserid  
    WHERE f.createdon >= DATEADD(day, -7, GETDATE())  
    AND (  
        LOWER(w.definition) LIKE '%runvbscript%' OR  
        LOWER(w.definition) LIKE '%runpowershellscript%' OR  
        LOWER(w.definition) LIKE '%runjavascript%' OR  
        LOWER(w.definition) LIKE '%rundotnetscript%' OR  
        LOWER(w.definition) LIKE '%runpythonscript%'  
    )  
),  
FlowCounts AS (  
    SELECT  
        p.[Desktop flow],  
        p.[Desktop flow Id],  
        p.[Created on],  
        p.[Last modified on],  
        p.[Script],  
        p.[Owner Id],  
        p.[Owner name],  
        p.[Owner email],  
        COUNT(DISTINCT p.flowsessionid) AS ProCodingSessionCount  
    FROM ProCodingSessions p  
    GROUP BY  
        p.[Desktop flow],  
        p.[Desktop flow Id],  
        p.[Created on],  
        p.[Last modified on],  
        p.[Script],  
        p.[Owner Id],  
        p.[Owner name],  
        p.[Owner email]  
)  
SELECT  
    f.[Desktop flow],  
    f.[Desktop flow Id],  
    f.[Created on],  
    f.[Last modified on],  
    f.[Script],  
    f.[Owner Id],  
    f.[Owner name],  
    f.[Owner email],  
    f.ProCodingSessionCount AS 'Runs with pro-code' 
FROM FlowCounts f  
ORDER BY f.ProCodingSessionCount DESC;  

10 najczęstszych akcji przepływu pulpitu, które zakończyły się niepowodzeniem

To zapytanie zwraca 10 akcji najczęściej zakończonych niepowodzeniem według liczby błędów w ciągu ostatnich siedmiu dni.

    SELECT TOP(10)   
        JSON_VALUE(data, '$.name') AS ActionName,  
        SUM(CASE WHEN JSON_VALUE(data, '$.status') = 'Failed' THEN 1 ELSE 0 END) AS ErrorCount  
    FROM [flowlog]  
    WHERE createdon >= DATEADD(day, -7, GETDATE())  
    GROUP BY JSON_VALUE(data, '$.name')  
    HAVING SUM(CASE WHEN JSON_VALUE(data, '$.status') = 'Failed' THEN 1 ELSE 0 END) > 0  
    ORDER BY ErrorCount DESC;  

10 najpopularniejszych kodów błędów z ilością wystąpień

    SELECT TOP(10)  
        JSON_VALUE(data, '$.errorCode') AS ErrorCode,  
        COUNT(*) AS OccurrenceCount  
    FROM [flowlog]  
    WHERE createdon >= DATEADD(day, -7, GETDATE())  
      AND JSON_VALUE(data, '$.status') = 'Failed'  
    GROUP BY JSON_VALUE(data, '$.errorCode')  
    ORDER BY OccurrenceCount DESC;