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:




6 Haziran 2015 Cumartesi

SQL Server Management Studio (SSMS) - Find And Replace Ayarları

SQL Server Management Studio(SSMS) kullanırken editörde ki script in içerisinde arama yaptığımız durumlar sık sık oluyor.



Kelime arama işi bittiğinde ekranımıza bunu bildiren aşağıdaki mesajın geldiğini biliyoruz.



Eğer bu mesaj kutusundaki "Always show this message" tikini yanlışlıkla yada bi anlık ihtiyaç sebebiyle kaldırırsak çok can sıkıcı bir durum ortaya çıkıyor.

Çok uzun bir script te arama yaparken ve oradan oraya atlanarak kelimeler bulunurken, script in sonuna gelindiğinde artık bu mesaj çıkmayacağı için, arama en baştan devam ediyor ve bunu anlamak için scrollbar ı takip etmek zorunda kalıyoruz.



Ne yazık ki bu durumu eski haline çevirmek için SSMS nun ayarları arasında Find and Replace yada Alert mesajları ile ilgili bir seçenek bulunmuyor. Google da arattığımız da ise genellikle Find and Replace de Regex i kullanarak nasıl daha profesyonel aramalar yapabileceğimiz ile ilgili bilgiler buluyoruz. Ama en sonunda aradığımız bilgiyi de bulabiliyoruz tabi. Bu kadar çok uğraşmaya gerek kalmaması amacıyla bu paylaşımı çoğaltmak istiyorum.

Find and Replace, ayarlarını regedit ten okunuyor. SSMS 2008 kurulu olan makineler için Find and Replace ayarlarını aşağıdaki path de bulabilirsiniz. Daha eski versiyonlarda kırmızı ile işaretli kısım 100 değil de 90 yada 80 olmaktadır.

HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\100\Tools\Shell
Aramanın sonuna gelindiğini bildiren mesajın gösterilip gösterilmemesi ile ilgili ayarın tutulduğu key, ShowEndOfSearch Key idir. Diğer Key ler Find and Replace ekranının diğer ayarlarıdır. Şu an için onlarla işimiz yok.
 Regedit te ki ShowEndOfSearch ayarı 1 olarak tanımlı iken, "Always show this message" tikini kaldırdığımızda  aşağıdaki gibi 0 olarak atanıyor.


SSMS yu kapatarak ShowEndOfSearch Key ini yeniden 1 olarak değiştirir isek canımızı sıkan bu sorunumuz da hallolmuş oluyor.