Azure Logic Apps için SQL bağlayıcısında saklı yordam zaman aşımlarını işleme

Şunlar için geçerlidir: Azure Logic Apps (Tüketim)

Mantıksal uygulamanız, SQL bağlayıcısının tüm sonuçları aynı anda döndürmemesi için sonuç kümeleriyle çalıştığında veya sonuç kümelerinizin boyutu ve yapısı üzerinde daha fazla denetime sahip olmak istiyorsanız, sonuçları istediğiniz gibi düzenleyen bir saklı yordam oluşturabilirsiniz. SQL bağlayıcısı, SQL veritabanı tablolarıyla çalışan iş görevlerini daha kolay otomatik hale getirebilmeniz için Azure Logic Apps kullanarak erişebileceğiniz birçok arka uç özelliği sağlar.

Örneğin, birden çok satır alırken veya eklerken mantıksal uygulamanız bu sınırlar içinde bir Until döngüsü kullanarak bu satırlar arasında yineleme yapabilir. Ancak mantıksal uygulamanızın binlerce veya milyonlarca satırla çalışması gerektiğinde, veritabanına yapılan çağrılardan kaynaklanan maliyetleri en aza indirmek istersiniz. Daha fazla bilgi için bkz . SQL bağlayıcısını kullanarak toplu verileri işleme.

Saklı yordam yürütmede zaman aşımı sınırı

SQL bağlayıcısının 2 dakikadan kısa bir saklı yordam zaman aşımı sınırı vardır. Bazı saklı yordamların tamamlanması bu sınırdan uzun sürebilir ve hataya 504 Timeout neden olur. Bazen bu uzun süre çalışan işlemler, bu amaçla açıkça saklı yordamlar olarak kodlanabilir. Zaman aşımı sınırı nedeniyle bu yordamları Azure Logic Apps'ten çağırmak sorun oluşturabilir. SQL bağlayıcısı zaman uyumsuz modu yerel olarak desteklemese de sql tamamlama tetikleyicisi, yerel SQL geçiş sorgusu, durum tablosu ve sunucu tarafı işleri kullanarak bu soruna geçici bir çözüm bulup bu modun benzetimini yapabilirsiniz. Bu görev için Azure SQL Veritabanı için Azure Elastik İş Aracısı'nı kullanabilirsiniz. Şirket içi ve Azure SQL Yönetilen ÖrneğiSQL Server için SQL Server Agent kullanabilirsiniz.

Örneğin, çalıştırmayı tamamlamak için zaman aşımı sınırından daha uzun süren aşağıdaki uzun süre çalışan saklı yordamınız olduğunu varsayalım. Bu saklı yordamı SQL bağlayıcısını kullanarak bir mantıksal uygulamadan çalıştırırsanız, sonuç olarak bir HTTP 504 Gateway Timeout hata alırsınız.

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

Saklı yordamı doğrudan çağırmak yerine, bir iş aracısı kullanarak yordamı arka planda zaman uyumsuz olarak çalıştırabilirsiniz. Girişleri ve çıkışları mantıksal uygulamanız aracılığıyla etkileşim kurabileceğiniz bir durum tablosunda depolayabilirsiniz. Girişlere ve çıkışlara ihtiyacınız yoksa veya sonuçları saklı yordamdaki bir tabloya yazıyorsanız, bu yaklaşımı basitleştirebilirsiniz.

Önemli

Saklı yordamınızın ve tüm işlerin bir kez etkili olduğundan emin olun; başka bir deyişle sonuçları etkilemeden birden çok kez çalışabilirler. Zaman uyumsuz işleme başarısız olursa veya zaman aşımına uğradıysa, iş aracısı adımı ve dolayısıyla saklı yordamınızı birden çok kez yeniden deneyebilir. Çıktıyı yinelemekten kaçınmak için, herhangi bir nesne oluşturmadan önce bu en iyi yöntemleri ve yaklaşımları gözden geçirin.

Sonraki bölümde, Azure SQL Veritabanı için Azure Elastik İş Aracısı'nı nasıl kullanabileceğiniz açıklanmaktadır. SQL Server ve Azure SQL Yönetilen Örneği için SQL Server Agent kullanabilirsiniz. Bazı yönetim ayrıntıları farklılık gösterir, ancak temel adımlar Azure SQL Veritabanı için iş aracısı ayarlamakla aynı kalır.

Azure SQL Veritabanı için iş aracısı

Azure SQL Veritabanı için saklı yordamı çalıştırabilen bir iş oluşturmak için Azure Elastik İş Aracısı'nı kullanın. Azure portal iş aracınızı oluşturun. Bu yaklaşım, aracı tarafından kullanılan ve aracı veritabanı olarak da bilinen veritabanına çeşitli saklı yordamlar ekler. Ardından hedef veritabanında saklı yordamınızı çalıştıran ve bittiğinde çıkışı yakalayan bir iş oluşturabilirsiniz.

İşi oluşturabilmeniz için önce Azure Elastik İş Aracısı'nın tam belgelerinde açıklandığı gibi izinleri, grupları ve hedefleri ayarlamanız gerekir. Ayrıca, aşağıdaki bölümlerde açıklandığı gibi hedef veritabanında bir destekleyici tablo oluşturmanız gerekir.

Parametreleri kaydetmek ve girişleri depolamak için durum tablosu oluşturma

SQL Aracısı İşleri giriş parametrelerini kabul etmez. Bunun yerine, hedef veritabanında, parametreleri kaydettiğiniz ve saklı yordamlarınızı çağırmak için kullanılacak girişleri depoladığınız bir durum tablosu oluşturun. Tüm aracı işi adımları hedef veritabanında çalıştırılır, ancak işin saklı yordamları aracı veritabanında çalışır.

Durum tablosunu oluşturmak için şu şemayı kullanın:

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]

Sonuçta elde edilen tablonun SQL Server Management Studio (SMSS) içinde nasıl göründüğü şöyle görünür:

Saklı yordam için girişleri depolayan oluşturulan durum tablosunu gösteren ekran görüntüsü.

İyi performans sağlamak ve aracı işinin ilişkili kaydı bulabildiğinden emin olmak için, tabloda birincil anahtar olarak iş yürütme kimliği (jobid) kullanılır. İsterseniz, giriş parametreleri için tek tek sütunlar da ekleyebilirsiniz. Daha önce açıklanan şema daha genel olarak birden çok parametreyi işleyebilir, ancak tarafından hesaplanan boyutla NVARCHAR(MAX)sınırlıdır.

Saklı yordamı çalıştırmak için üst düzey bir iş oluşturma

Uzun süre çalışan saklı yordamı yürütmek için aracı veritabanında bu üst düzey iş aracısını oluşturun:

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

Şimdi, saklı yordamı parametreleştiren, çalıştıran ve tamamlayan adımları işe ekleyin. Varsayılan olarak, bir iş adımı 12 saat sonra zaman aşımına uğrar. Saklı yordamınızın daha fazla zamana ihtiyacı varsa veya yordamın daha önce zaman aşımına uğrarsa, parametreyi step_timeout_seconds saniye cinsinden belirtilen başka bir değerle değiştirebilirsiniz. Varsayılan olarak, bir adımın her yeniden deneme arasında geri alma zaman aşımı ile 10 yerleşik yeniden denemesi vardır ve bunu sizin yararınıza kullanabilirsiniz.

Ekleme adımları şunlardır:

  1. Parametrelerin tabloda görünmesini LongRunningState bekleyin.

    Bu ilk adım, parametrelerin tabloya eklenmesini LongRunningState bekler ve bu işlem iş başladıktan hemen sonra gerçekleşir. İş yürütme kimliği (jobid) tabloya eklenmezse LongRunningState , adım yalnızca başarısız olur ve varsayılan yeniden deneme veya geri alma zaman aşımı beklemeyi gerçekleştirir:

    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. Durum tablosundan parametreleri sorgulayıp saklı yordama geçirin. Bu adım, yordamı arka planda da çalıştırır.

    Saklı yordamınızın parametrelere ihtiyacı yoksa doğrudan saklı yordamı çağırmanız yeterlidir. Aksi takdirde, parametresini @timespan geçirmek için, ek parametreleri geçirmek için genişletebileceğiniz öğesini kullanın @callparams.

    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. İşi tamamlayın ve sonuçları kaydedin.

    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'
    

İşi başlatın ve parametreleri geçirin

İşi başlatmak için SQL sorgusu yürüt eylemiyle bir geçiş yerel sorgusu kullanın ve işin parametrelerini hemen durum tablosuna iletin. Hedef tablodaki jobid özniteliğine giriş sağlamak için Logic Apps, önceki eylemden gelen tablo çıkışında yineleyen Her için döngüsü ekler. Her iş yürütme kimliği için, işin paketini açıp hedef saklı yordama geçirmesi için parametreleri eklemek üzere dinamik veri çıkışını ResultSets JobExecutionIdkullanan bir Satır ekle eylemini çalıştırın.

İşi başlatmak ve saklı yordama parametre geçirmek için kullanılacak eylemleri gösteren ekran görüntüsü.

İş tamamlandığında, bir öğe değiştirildiğinde tetikleyicisiniLongRunningState kullanarak sonucu kolayca tetikleyebilmeniz için iş tabloyu güncelleştirir. Çıkışa ihtiyacınız yoksa veya zaten bir çıkış tablosunu izleyen bir tetikleyiciniz varsa, bu bölümü atlayabilirsiniz.

Bir öğenin değiştirildiği zaman için SQL tetikleyicisini gösteren ekran görüntüsü.

SQL Server veya Azure SQL Yönetilen Örneği için iş aracısı

Aynı senaryo için şirket içive Azure SQL Yönetilen Örneği SQL Server için SQL Server Agent kullanabilirsiniz. Bazı yönetim ayrıntıları farklı olsa da, temel adımlar Azure SQL Veritabanı için iş aracısı ayarlamayla aynı kalır.

Sonraki adımlar

SQL Server, Azure SQL Veritabanına veya Azure SQL Yönetilen Örneği bağlanma