Sayfalar

Translate

7 Haziran 2015 Pazar

SQL Server - EXEC Management

Bir SP miz var. Bu SP nin kontrollü çalışmasını istiyoruz. Örneğin SP miz çalışmaya başlayınca yaklaşık 1 saat boyunca çalışıyor olsun. SP mizi EXEC ettik, çalışması bitene kadar yanlışlıkla tekrar EXEC edilse bile çalışmasını istemiyoruz.

Bunun için aşağıdaki gibi bir şablon kullanabiliriz;


1- ExecInfoTable Tablosu:


CREATE TABLE ExecInfoTable(
      SpName VARCHAR(64) NOT NULL,
      LastSessionID INT NOT NULL
)

Bu tabloda istediğimiz SP mizin anlık çalışma bilgisini saklıyor olacağız.

Her oluşturduğumuz SP için ExecInfoTable tablosuna bir kayıt insert ederiz. Bizim örneğimizde SP mizin ismi sp_ExecManagementTest olacak.

INSERT INTO ExecInfoTable(SpName, LastSessionID) VALUES('sp_ExecManagementTest', 0)

SP miz çalışmaya başladığında SessionID sini @@SPID distem değişkeninden alarak ExecInfoTable tablosuna kaydedeceğiz



2- SessionID Aktiflik Kontolü:


SQL Server in çalışmakta olan Exec işlemlerinin SessionID lerini sakladığı bir sistem tablosu var. Bu tablonun ismi sys.dm_exec_requests dir.

Aşağıdaki sorgu ile sistemde aktif çalışan Exec işlemlerinin SessionID lerini görebiliriz.

SELECT session_id FROM sys.dm_exec_requests WHERE status IN ('running', 'suspended', 'pending', 'runnable')




3- EXEC Management Şablonu:

SP mize aşağıdaki şablonu uygulayarak, kontrollü çalışmasını sağlamış oluyoruz:

CREATE PROCEDURE sp_ExecManagementTest
AS
BEGIN
      DECLARE @LastSessionID INT = 0
     
      SELECT @LastSessionID = LastSessionID FROM ExecInfoTable WITH(NOLOCK) WHERE SpName = 'sp_ExecManagementTest'
     
      IF EXISTS(SELECT 1 FROM sys.dm_exec_requests WHERE status IN ('running', 'suspended', 'pending', 'runnable') AND session_id = @LastSessionID)
      BEGIN
            PRINT 'sp_ExecManagementTest bitmeden tekrar çalýþtýrýlamaz!'
            GOTO SPEnd
      END
      ELSE
            UPDATE ExecInfoTable SET LastSessionID = @@SPID WHERE SpName = 'sp_ExecManagementTest'
     
      -- Bu noktadan sonra SP mizin asıl kodları başlar
      WAITFOR DELAY '00:00:10'
      PRINT 'sp_ExecManagementTest çalışmas bitti'
   
SPEnd:
   
END


4- Test:

SP mizi farklı pencerelerde(farklı session lar altında) çalıştırmayı denersek sonuç aşağıdaki gibi olacaktır:




Hiç yorum yok:

Yorum Gönder