Sql Server Job
Sql Job veri tabanının olmazsa olmaz özelliklerinden biridir. Veri tabanın planlanan iş olarak anlatılır. Biraz örneklendirirsek bir adet alış veriş sistemimiz olsun ve gece saat 2 de bir önceki güne ait satış verisini hesaplayıp ayrı bir tabloya yazsın. Böylece satış müdürü işe geldiğinde bir önceki günün satış değerini görmüş olsun. Şimdi diyebilirsiniz niye direk olarak satış tablosundan hesaplatarak bulmadık da neden ayrı bir tabloya yazıyoruz bunu. Bunun nedeni gündüz vakti veri tabanı yoğun olduğu için bizde bu işlem için ekstra bir yoğunluk oluşturmayalım. Burada her gün ki veri ayrı ayrı veri tabanımıza kaydedilecektir. Bu sayede satış müdürü istediği günü 1 saniyeden daha kısa sürece çekebilecektir.
AdventureworksDw veri tabanımızı açıyoruz bir adet tablo ToplamSatis tablosu oluşturalım. Bu tablonun id, SalesDate, SalesSum diye üç adet kolonu olsun.
Kod:
USE [AdventureWorksDW2012]
GO
CREATE TABLE [dbo].[SumSales](
[id] [int] IDENTITY(1,1) NOT NULL,
[SalesDate] [datetime] NULL,
[SalesSum] [decimal](18, 2) NULL,
CONSTRAINT [PK_SumSales] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
FactInternetSales tablomuzdaki OrderDate kolonu bakıyoruz. Max ve min OrderDate tarihleri neler,
Kod:
SELECT max(s.OrderDate) FROM FactInternetSales s
SELECT min(s.OrderDate) FROM FactInternetSales s
Şekil 1 de minumum ve maximum tarihleri görüyoruz. Şimdi bu günü 2005 06 30 e eşitleyelim ve sonra procedure yazalım. Tarihi 1 gün evvele taşımamızın nedeni çünkü gece saat 12 de tarih 2005 07 02 olacak, bizim sorgumuzdaki tarihte 2005 07 01 olmuş olacak.
Asıl soru Bugünü nasıl eşitleyeceğimiz, herkes bu ayarı kendi yapacak. Bugünün tarihi 11.02.2014. Ben bu tarihi referans alarak sorguyu yazacağım, sizde deneyeceğiniz tarihten yola çıkarak bu sorguyu yazınız.
Bugünden yola çıkarak bize 2005 06 30 e götüren sorgu
Kod:
SELECT DateAdd(dd,-11,(DateAdd(mm,5,(DateAdd(yy, -9, GetDate())))))
2005-06-30 09:56:18.677
Sorguyu biraz açıklarsak dd gün oluyor, mm ay oluyor yy ise yıl oluyor. Biz 9 sene geriye gittik -9 ile. 7. ay olduğu için bizde şuan 2. ay da olduğumuz için 5 ay ileriye gittik. Bugün ayın 11 i olduğu içinde 11 gün geriye gittik.
Tarihimizi bugüne eşitlediğimize göre şimdi verileri atacağımız procedure yazabiliriz.
Kod:
CREATE PROCEDURE dbo.SalesSumInsert
AS
BEGIN
DECLARE @GETDATE DATE
SET @GETDATE = (SELECT DateAdd(dd,-10,(DateAdd(mm,5,(DateAdd(yy, -9, GetDate()))))))
INSERT INTO SumSales
SELECT @GETDATE,SUM(TotalProductCost) FROM FactInternetSales
WHERE OrderDate = @GETDATE
END
Şekil 2 de de görüldüğü gibi proceduremuzu oluşturduk. Burada dikkat etmemiz gereken @GetDate parametresini biz Date olarak tanımladık. Datetime tanımlamadık. Çünkü Datetime saat, dakika ve saniyede alıyor. Bize lazım olan ise sadece tarih. Bu sebepten dolayı Date aldık.
Şimdi sıra geldi Sql Job ı oluşturmaya. Sql Joblar , Sql Agent Servisinin altında çalışırlar. Kurulumda eğer ekstra bir ayar yapmadıysanız Sql Agent disable gelir. Sql Agenti enable edelim. Bilgisayarıma geliyoruz sağ tuşa basıp yönet diyoruz.
Sql Server Agent'ın üzerine geliyoruz. Sağ tuşa basıp özellikler diyoruz. Şekil 4 de açılan ekranda
Startup type dan Automatic i seçiyoruz ve uygula diyip Ok e basıyoruz. Şuan itibari ile Sql Server Agent aktif edildi. Sadece sıra sevisi açmaya geldi . Sql Server Management Studioya gelip Sql Server Agent'ın üzerine sağ tuşla tıklıyoruz.
Start'a basınca bize soruyor servis başlatılsın mı diye bizde evet diyoruz ve servis başlıyor. Sql Server Agentta açılan menuden Job ın üzerine gelip (Şekil 6) New Job diyoruz.
Karşımıza çıkan ekranda (Şekil 7) General Sekmesinden bizeden Job'a bir isim vermemizi isteyecektir. Bizde isim olarak SumSalesInsert ismini veriyoruz. Description kısmına istediğiniz yazıyı yazabilirsiniz ama biz yine SumSalesInsert yazıyoruz.
Daha sonra soldaki sekmelerden Steps e geliyoruz. Step menusunden sol alt köşeden New seçeneğini tıklayarak yeni bir step oluşturuyoruz. Şekil 8 deki ekran karşımıza çıkıyor.Bir adet Step Name veriyoruz. Type olarak Transact Sql i seçiyoruz. Çünkü yazacağımız sorgu bir T-SQL sorgusudur. Daha sonrada yazacağımız sorgunun hangi veri tabanından çalışacağını seçiyoruz.SalesSumInsert ismini verdiğimiz stepte çalışmasını istediğimiz sorgumuzu yazıyoruz.
Bu sorgu git SalesSumInsert isimli proceduru çalıştır demektir. Sonra ok basıyoruz.
Sol Menuden Schedules i seçerek new diyoruz. Schedules adında anlaşılacağı gibi bir iş planıdır. Job ın ne zaman çalışacağını bu ekrandan yönetiyoruz.
Öncelikle bir adet Schedule Name veriyoruz. Biz isim olarak yine SalesSumInsert verdik. Occurstan Jobımızın Daily yi seçerek günlük çalışacağını belirledik. Occours Once At menusunden de her gün gece saat 1 de çalışacağını belirledik ve Ok e bastık. New Job ekranında da okey basınca Jobımız oluştu. (Şekil 10)
Job ın çalışıp çalışmadığını kontrol etmek için bilgisayarımızın tarihini ve saatini 12.02.2014 00.59 a ayarlıyoruz ve bekliyoruz. (Sekil 11)
Saatimiz 1 i geçti şimdi Şekil 12 deki gibi Sql Server Agenttaki Jobın üzerine sağ tuşla tıklayıp
View History diyelim. Ve açılan ekranda Jobımızın çalıştığını görmektediyiz. (Şekil 13)
Şimdi de gidip kontol edelim Job doğru çalış mı?
Şekil 14 de de görüldüğü gibi Job doğru çalışmakta.
Sizde bu örneği istediğiniz gibi şekillendirebilirsiniz. Temel olarak burada Sql Jobın ne olduğunu nasıl yapıldığını anladık. Artık geriye kalan tek şey sizin hayal gücünüz ve azminizdir.