Megosztás a következőn keresztül:


Tárolt eljárás időtúllépéseinek kezelése az Azure Logic Apps SQL-összekötőjében

A következőkre vonatkozik: Azure Logic Apps (használat)

Ha a logikai alkalmazás olyan nagy eredményhalmazokkal dolgozik, hogy az SQL-összekötő nem adja vissza egyszerre az összes eredményt, vagy ha nagyobb mértékben szeretné szabályozni az eredményhalmazok méretét és szerkezetét, létrehozhat egy tárolt eljárást , amely a kívánt módon rendezi az eredményeket. Az SQL-összekötő számos háttérfunkciót biztosít, amelyeket az Azure Logic Apps használatával érhet el, így egyszerűbben automatizálhatja az SQL-adatbázistáblákkal dolgozó üzleti feladatokat.

Ha például több sort kap vagy szúr be, a logikai alkalmazás át tudja haladni ezeket a sorokat egy Until hurkot használva ezeken a korlátokon belül. Ha azonban a logikai alkalmazásnak több ezer vagy több millió sortal kell dolgoznia, minimalizálni szeretné az adatbázisba irányuló hívásokból eredő költségeket. További információ: Tömeges adatok kezelése az SQL-összekötővel.

A tárolt eljárás végrehajtásának időtúllépési korlátja

Az SQL-összekötő egy tárolt eljárás időtúllépési korlátjával rendelkezik, amely kevesebb, mint 2 perc. Néhány tárolt eljárás ennél a korlátnál hosszabb időt is igénybe vehet, ami hibát okoz 504 Timeout . Előfordulhat, hogy ezek a hosszú ideig futó folyamatok kifejezetten erre a célra tárolt eljárásokként vannak kódva. Az időtúllépési korlát miatt ezek az eljárások az Azure Logic Appsből való meghívása problémákat eredményezhet. Bár az SQL-összekötő natív módon nem támogatja az aszinkron módot, megkerülheti ezt a problémát, és szimulálhatja ezt a módot egy SQL-befejezési eseményindító, natív SQL-továbbítási lekérdezés, állapottábla és kiszolgálóoldali feladatok használatával. Ehhez a feladathoz használhatja az Azure Elastic Job AgentetAzure SQL Database-hez. Helyszíni SQL Server és Azure SQL Managed Instance használhatja a SQL Server Agent.

Tegyük fel például, hogy a következő hosszú ideig futó tárolt eljárással rendelkezik, amely hosszabb időt vesz igénybe, mint az időtúllépési korlát a futtatás befejezéséhez. Ha ezt a tárolt eljárást egy logikai alkalmazásból futtatja az SQL-összekötő használatával, hibaüzenet jelenik HTTP 504 Gateway Timeout meg.

CREATE PROCEDURE [dbo].[WaitForIt]
   @delay char(8) = '00:03:00'
AS
BEGIN
   SET NOCOUNT ON;
   WAITFOR DELAY @delay
END

Ahelyett, hogy közvetlenül meghívja a tárolt eljárást, egy feladatügynök használatával aszinkron módon futtathatja az eljárást a háttérben. A bemeneteket és kimeneteket egy állapottáblában tárolhatja, amelyet aztán használhat a logikai alkalmazáson keresztül. Ha nincs szüksége a bemenetekre és kimenetekre, vagy ha már megírja az eredményeket egy táblába a tárolt eljárásban, egyszerűsítheti ezt a megközelítést.

Fontos

Győződjön meg arról, hogy a tárolt eljárás és az összes feladat idempotens, ami azt jelenti, hogy többször is futtathatók az eredmények befolyásolása nélkül. Ha az aszinkron feldolgozás meghiúsul vagy túllépi az időkorlátot, előfordulhat, hogy a feladatügynök többször is újrapróbálkozott a lépéssel, és így a tárolt eljárással. A kimenet duplikálásának elkerülése érdekében mielőtt bármilyen objektumot létrehoz, tekintse át ezeket az ajánlott eljárásokat és megközelítéseket.

A következő szakasz azt ismerteti, hogyan használhatja az Azure Elastic Job Agentet Azure SQL Database-hez. SQL Server és Azure SQL Managed Instance használhatja a SQL Server Agent. Egyes felügyeleti részletek eltérőek lesznek, de az alapvető lépések ugyanazok maradnak, mint egy feladatügynök beállítása Azure SQL Database-hez.

Feladatügynök az Azure SQL Database-hez

Ha olyan feladatot szeretne létrehozni, amely futtathatja az Azure SQL Database tárolt eljárását, használja az Azure Elastic Job Agentet. Hozza létre a feladatügynököt a Azure Portal. Ez a módszer több tárolt eljárást is hozzáad az ügynök által használt adatbázishoz, más néven ügynökadatbázishoz. Ezután létrehozhat egy feladatot, amely futtatja a tárolt eljárást a céladatbázisban, és amikor elkészült, rögzíti a kimenetet.

A feladat létrehozása előtt engedélyeket, csoportokat és célokat kell beállítania az Azure Elastic Job Agent teljes dokumentációjában leírtak szerint. Emellett létre kell hoznia egy segédtáblát a céladatbázisban az alábbi szakaszokban leírtak szerint.

Állapottábla létrehozása paraméterek regisztrálására és bemenetek tárolására

Az SQL Agent-feladatok nem fogadják el a bemeneti paramétereket. Ehelyett a céladatbázisban hozzon létre egy állapottáblát, amelyben regisztrálja a paramétereket, és tárolja a tárolt eljárások meghívásához használandó bemeneteket. Az ügynökfeladat összes lépése a céladatbázison fut, de a feladat tárolt eljárásai az ügynökadatbázison futnak.

Az állapottábla létrehozásához használja a következő sémát:

CREATE TABLE [dbo].[LongRunningState](
   [jobid] [uniqueidentifier] NOT NULL,
   [rowversion] [timestamp] NULL,
   [parameters] [nvarchar](max) NULL,
   [start] [datetimeoffset](7) NULL,
   [complete] [datetimeoffset](7) NULL,
   [code] [int] NULL,
   [result] [nvarchar](max) NULL,
   CONSTRAINT [PK_LongRunningState] PRIMARY KEY CLUSTERED
      (   [jobid] ASC
      )WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
      ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Így néz ki az eredményként kapott tábla a SQL Server Management Studio (SMSS)-ben:

Képernyőkép a tárolt eljárás bemeneteit tároló létrehozott állapottábláról.

A megfelelő teljesítmény biztosítása és annak biztosítása érdekében, hogy az ügynökfeladat megtalálja a társított rekordot, a tábla a feladat végrehajtási azonosítóját (jobid) használja elsődleges kulcsként. Igény szerint egyéni oszlopokat is hozzáadhat a bemeneti paraméterekhez. A korábban ismertetett séma általában több paramétert képes kezelni, de a által NVARCHAR(MAX)kiszámított méretre korlátozódik.

Legfelső szintű feladat létrehozása a tárolt eljárás futtatásához

A hosszan futó tárolt eljárás végrehajtásához hozza létre ezt a legfelső szintű feladatügynököt az ügynökadatbázisban:

EXEC jobs.sp_add_job 
   @job_name='LongRunningJob',
   @description='Execute Long-Running Stored Proc',
   @enabled = 1

Most adja hozzá a lépéseket a feladathoz, amely paraméterezi, futtatja és végrehajtja a tárolt eljárást. Alapértelmezés szerint egy feladatlépés 12 óra elteltével túllépi az időkorlátot. Ha a tárolt eljárásnak több időre van szüksége, vagy ha azt szeretné, hogy az eljárás korábban időtúllépést érjen el, a step_timeout_seconds paramétert másik, másodpercben megadott értékre módosíthatja. Alapértelmezés szerint egy lépésben 10 beépített újrapróbálkozás található, amelyeknél az egyes újrapróbálkozások között időtúllépés van hátra, amelyet az előnyére használhat.

A hozzáadás lépései a következők:

  1. Várjon, amíg a paraméterek megjelennek a LongRunningState táblában.

    Ez az első lépés megvárja, amíg a paraméterek bekerülnek a táblába LongRunningState , ami nem sokkal a feladat elindítása után történik. Ha a feladat végrehajtási azonosítója (jobid) nem lesz hozzáadva a LongRunningState táblához, a lépés egyszerűen meghiúsul, és az alapértelmezett újrapróbálkozási vagy visszalépési időtúllépés a várakozást végzi el:

    EXEC jobs.sp_add_jobstep
       @job_name='LongRunningJob',
       @step_name= 'Parameterize WaitForIt',
       @step_timeout_seconds = 30,
       @command= N'
          IF NOT EXISTS(SELECT [jobid] FROM [dbo].[LongRunningState]
             WHERE jobid = $(job_execution_id))
             THROW 50400, ''Failed to locate call parameters (Step1)'', 1',
       @credential_name='JobRun',
       @target_group_name='DatabaseGroupLongRunning'
    
  2. Lekérdezheti a paramétereket az állapottáblából, és átadhatja őket a tárolt eljárásnak. Ez a lépés a háttérben is futtatja az eljárást.

    Ha a tárolt eljárásnak nincs szüksége paraméterekre, egyszerűen hívja meg közvetlenül a tárolt eljárást. Ellenkező esetben a @timespan paraméter átadásához használja a @callparamsparamétert, amelyet további paraméterek átadására is kiterjeszthet.

    EXEC jobs.sp_add_jobstep
       @job_name='LongRunningJob',
       @step_name='Execute WaitForIt',
       @command=N'
          DECLARE @timespan char(8)
          DECLARE @callparams NVARCHAR(MAX)
          SELECT @callparams = [parameters] FROM [dbo].[LongRunningState]
             WHERE jobid = $(job_execution_id)
          SET @timespan = @callparams
          EXECUTE [dbo].[WaitForIt] @delay = @timespan', 
       @credential_name='JobRun',
       @target_group_name='DatabaseGroupLongRunning'
    
  3. Fejezze be a feladatot, és rögzítse az eredményeket.

    EXEC jobs.sp_add_jobstep
       @job_name='LongRunningJob',
       @step_name='Complete WaitForIt',
       @command=N'
          UPDATE [dbo].[LongRunningState]
             SET [complete] = GETUTCDATE(),
                [code] = 200,
                [result] = ''Success''
             WHERE jobid = $(job_execution_id)',
       @credential_name='JobRun',
       @target_group_name='DatabaseGroupLongRunning'
    

Indítsa el a feladatot, és adja át a paramétereket

A feladat elindításához használjon átmenő natív lekérdezést az SQL-lekérdezés végrehajtása művelettel , és azonnal küldje le a feladat paramétereit az állapottáblába. A céltáblában lévő attribútum bemenetének megadásához jobid a Logic Apps hozzáad egy Minden olyan hurokhoz , amely az előző művelet táblakimenetén keresztül iterál. Minden feladat végrehajtási azonosítójához futtasson egy Sor beszúrása műveletet, amely a dinamikus adatkimenetet használja, ResultSets JobExecutionIdés adja hozzá a feladat paramétereit a kicsomagoláshoz és a célként tárolt eljárásnak való továbbításhoz.

Képernyőkép a feladat elindításához és a paraméterek tárolt eljárásnak való átadásához használandó műveletekről.

Amikor a feladat befejeződött, a feladat frissíti a LongRunningState táblát, hogy könnyen aktiválhassa az eredményt az Elem módosításakor eseményindító használatával. Ha nincs szüksége a kimenetre, vagy ha már rendelkezik egy kimeneti táblát figyelő eseményindítóval, kihagyhatja ezt a részt.

Képernyőkép az SQL-eseményindítóról az elem módosításakor.

SQL Server vagy Azure SQL Managed Instance feladatügynöke

Ugyanebben a forgatókönyvben a helyszíni és a Azure SQL Managed InstanceSQL Server SQL Server Agent is használhatja. Bár egyes felügyeleti részletek eltérnek, az alapvető lépések ugyanazok maradnak, mint az Azure SQL Database feladatügynökének beállítása.

Következő lépések

Csatlakozás SQL Server, Azure SQL adatbázishoz vagy Azure SQL Managed Instance