SQLPDF
SQLPDF
T-SQL ................................................................................................................................................ 4
SELECT KOMUTU.................................................................................................................................................................. 5
ALİAS KULLANIMI................................................................................................................................................................. 5
USE KOMUTU....................................................................................................................................................................... 5
PRINT KOMUTU ................................................................................................................................................................... 5
CONVERT - CAST METODU ..................................................................................................................................................... 5
WHERE KOMUTU ................................................................................................................................................................. 6
AGGREGATE FONKSİYONLARI ................................................................................................................................................ 7
GROUP BY KULLANIMI........................................................................................................................................................... 7
DISTINCT KOMUTU............................................................................................................................................................... 7
STRING FONKSİYONLAR ........................................................................................................................................................ 8
SP_RENAME İLE TABLO ADI GÜNCELLEME................................................................................................................................ 8
SAYISAL FONKSİYONLAR ....................................................................................................................................................... 8
TARİHSEL FONKSİYONLAR..................................................................................................................................................... 8
DML KOMUTLARI ............................................................................................................................................................... 9
SELECT .............................................................................................................................................. 9
INSERT .............................................................................................................................................. 9
UPDATE............................................................................................................................................. 9
DELETE.............................................................................................................................................. 9
INTO ................................................................................................................................................ 9
TRUNCATE ......................................................................................................................................... 9
DDL KOMUTLARI.................................................................................................................................................................. 9
CREATE ............................................................................................................................................. 9
ALTER ............................................................................................................................................... 9
DROP ................................................................................................................................................ 9
WITH KOMUTU ................................................................................................................................................................ 10
WITH NOLOCK.................................................................................................................................... 10
WITHROLLUP .................................................................................................................................... 10
ORDER BY ......................................................................................................................................... 11
PARTITION BY KOMUTU......................................................................................................................... 11
NTILE.............................................................................................................................................. 11
IDENTITY İLE İLGİLİ KOMUTLAR ......................................................................................................................................... 12
IDENTITY OLUŞTURMA .......................................................................................................................... 12
IDENT_CURRENT ................................................................................................................................. 12
@@ROWCOUNT ................................................................................................................................. 12
NULL DEĞER KONTROLÜ................................................................................................................................................... 13
ISNULL ........................................................................................................................................... 13
COALESCE ....................................................................................................................................... 13
DEĞİŞKEN TANIMLAMA .................................................................................................................................................... 13
DMLTRIGGER..................................................................................................................................... 30
MASTER DB:....................................................................................................................................... 36
MODEL DB:........................................................................................................................................ 36
MSDB: ............................................................................................................................................. 36
TEMP DB:.......................................................................................................................................... 36
SQL YEDEK ALMA.............................................................................................................................................................. 37
SQL EXPRESS SÜRÜMÜNDE OTOMATİK YEDEK ALMA İŞLEMLERİ ........................................................................................ 37
SQL SERVER’DA BACKUP STRATEJİŞERİ FULL BACKUP VE DIFFERENTIAL BACKUP ................................................................ 38
SQL SERVER’DA CANLI VERİYİ TABLO BAZLI SIKIŞTIRMA (COMPRESS) ................................................................................. 38
SQL SERVER’DA BİLİNÇLİ İNDEXLEME ............................................................................................................................... 39
SQL SERVER DATABASE MAİL VE GMAİL İLE KULLANIMI ..................................................................................................... 41
SQL SERVER ‘ I RESTART ETMEK DOĞRU BİR DAVRANIŞ MI ? ............................................................................................. 41
SQL SERVER’DA SUSPECT MODE’A DÜŞEN BİR DATABASE KURTARMA ............................................................................... 41
DONANIMLARIN SQL SERVER PERFORMANSI ÜZERİNE ETKİSİ ............................................................................................ 42
SQL DATABASELERİNİN AYLIK NE KADAR BÜYÜDÜĞÜNÜ GÖSTEREN SORGU ...................................................................... 42
SQL SERVER’DA CHANGE DATA CAPTURE İLE DEĞİŞEN VE SİLİNEN KAYITLARIN LOGLANMASI ............................................. 43
SQL Server Change Data Capture ile Değişiklik Yapılan Kayıtların Loglanması ...................................................................... 43
SQLSERVER’DA HANGİ DB LER KULLANILIYOR?HANGİSİ KULLANILMIYOR ?................................................................................ 45
NOT IN .............................................................................................................................................................................. 46
XMLMETHODLARI ............................................................................................................................................................. 46
ERRORLARIN KULANIMI...................................................................................................................................................... 46
KAYNAKÇA ....................................................................................................................................................................... 47
HAZIRLAYAN..................................................................................................................................................................... 47
SQL - T-SQL
Kelime açılımı, “Structered Query Language” SQL, Türkçe ’ye “yapısal sorgulama dili” olarak geçmiştir. Temel
olarak SQL’e bir sorgulama dili demek mümkün. Veri tabanı işlemlerini hızlı bir şekilde yapmak için kullanılan
bir alt dil diye ifade edebiliriz. SQL ifadesi bir nevi veri tabanı yönetimi kavramını ifade etmektir.
T-SQL : SQL, düzeltilmesi veya değiştirilmesi istenen bilgileri açıkça belirtmeye izin veren ve yerine
getirilebilecek başlıca işlemleri tanımlamamızı sağlayan bir komut takımıdır. Bu komutların oluşturduğu
yapıya T-SQL dili denir. T-SQL ile veri ve sorgulara erişebilir, güncelleyebilir ve ilişkisel veri tabanı sistemi
yönetilebilir. T-SQL komutları kullanım amaçlarına göre üç genel kategoriye ayrılır.
SELECT KOMUTU
SQL de veri seçme işlemi sağlamaktadır. SELECT AGE FROM CUSTOMER
ALİAS KULLANIMI
Takma isim oluşturmak için kullanılır tablo başlığını yazdıktan sonra AS ya da BOŞLUK ’tan sonra geçici olarak
tanımlayacağımız tablo başlığı yazılır
USE KOMUTU
Kullanacağımız veri tabanını çağırmamızı sağlar USE ETRADE
PRINT KOMUTU
ÖR: İnt tipindeki bir veriyi nvarchar veri ile yan yana yazmak istiyorum fakat int ile nvarchar data typelarından
dolayı yan yana gelememektedir. Bunun için int tipindeki verimi sadece o sorgumda olmak şartıyla geçici
olarak data type’ı değiştiririz.
Where şartında “%” operatörü ile metinsel aramalarda % işaretinin yerine göre kelimenin başlangıcı bitişi
ya da kelimenin içinde aramamızı sağlayabilmektedir.
WHERE NAMESURNAME > 'C%' İLK HARFİ C DEN ALFABETİK SIRA İLE BÜYÜK OLANLARI GETİRİR.
WHERE NAMESURNAME LIKE N'SERKA%' -> N HARFİ TÜM DİLLERE ALGILA ANLAMINA GELİR.
STRİNG SORGULAMALARINDA YA DA STRİNG İÇİNDE KARAKTER ARAMALARINDA LIKE OPERATÖRÜ
KULLANILIR.
WHERE AGE BETWEEN 18 AND 40 -> BETWEEN ARASINDA ANLAMINA GELMEKTEDİR. YAŞI 18 İLE 40
ARASINDA OLAN DEĞERLERİ GETİRİR.
WHERE AGE “ (=)”Age’e eşit değerleri getirir. “(>)”Age’den küçük olan değerleri getirir. “ (<)” Age’den küçük olan
değerleri getirir”
Eşit değildir için (<>) YA DA (!=) kullanırız.
ÖR: WHERE AGE > 40 AGE DEĞERİ 40DAN BÜYÜK OLAN DEĞERLERİ GETİRİR.
WHERE NAMESURNAME LIKE N'R%T' ->İSMİNİN İLK HARFİ R SON HARFİ T
WHERE CITY = 'TOKYO' AND AGE > 18 -> ŞEHRİ TOKYO VE YAŞI 18 DEN BÜYÜK OLAN DEĞERLERİ
GETİRİR.
WHERE CITY = 'TOKYO' OR AGE > 18 ŞEHRİ TOKYO YA DA YAŞI 18 DEN BÜYÜK OLAN DEĞERLERİ
GETİRİR.
WHERE ADI LIKE '[NMR]%' İSMİNİN İLK HARFLERİ N,M YA DA R İLE BAŞLAYAN DEĞERLERİ GETİRİR.
[ ] İÇİNE ALINAN DEĞERLERİ AYRI AYRI SORGULAYARAK GETİRMEKTEDİR.
WHERE ADI LIKE '[^A]%' “ ^ “ İŞARETİ İLE BAŞ HARFİ A OLMAYAN DEĞERLER GETİRİLİR.
WHERE NAMESURNAME LIKE '[H]%AN%' WHERE İLE BAŞ HARFİ H OLUP İÇİNDE AN OLANLARI BUL
WHERE AGE NOT BETWEEN 25 AND 45 NOT BETWEEN İLE ARASINDA OLMAYAN DEĞERLERİ GETİRİR.
T-SQL sorgularımızda bir dizi değer üzerinde hesaplama yaparak sonuç değere ulaştıran fonksiyonlara
Aggregate fonksiyonları denir.
Aggregate Fonksiyonlar:
GROUP BY KULLANIMI
Aggregate fonksiyonlarını tablo sorgularımız için kullandığımda group by kullanmam zorunludur.
HAVING AGGREGATE FONKSİYONLARIN WHERE ŞARTI SAĞLAYICISIDIR. GROUP BY DAN SONRA GELİR.
NOT: Group by kullanımında yazılacak tablo başlıkları Aggregate fonksiyonu dışında kalan tablo başlıkları
yazılır.
DISTINCT KOMUTU
LEFT, RIGHT, UPPER, LOWER, SUBSTRING, LTRIM, RTRIM, REVERSE, REPLACE, CHARINDEX gibi fonksiyonlar
metinsel değerler üzerinde işlem yapmamızı sağlar.
SAYISAL FONKSİYONLAR
TARİHSEL FONKSİYONLAR
SELECT DATENAME (WEEKDAY (YA DA MONTH),GETDATE()) AYIN HAFTANIN GÜNÜN ADINI GETİRME
DML KOMUTLARI
SELECT, UPDATE, DELETE, INSERT (VERİ ÜZERİNDE YAPILAN İŞLEMLER İÇİN KULLANILIR.)
Veri tabanına nesnelerini manipüle etmemizi sağlar
INSERT işlemi tablolara veri kayıt etmek için kullanılır. İlk olarak tablo ve kolon başlıklarımı yazarım daha
sonra values fonksiyonu ile ilgili başlıkların sırasına göre değer ataması yaparım.
INSERT CUSTOMER (NAMESURNAME, AGE) VALUES ('SERKAN COŞKUN' , 24)
CUSTOMER tablosuna bu değerlerimizi kaydetmiş oluruz.
DDL KOMUTLARI
CREATE, ALTER, DROP (TABLO ÜZERİNDE YAPILAN İŞLEMLER İÇİN KULLANILIR.)
DDL komutları veri tabanına nesneleri oluşturmamızı sağlar. Bu nesne üzerinde değişiklik ve silme
işlemleri yapmamızı sağlamaktadır.
DROP Create ile oluşturulanı silmemizi sağlamaktadır. Tabloyu kaldırmadan sadece satırlarını boşaltmak
istiyorsanız DELETE kullanın. DROP TABLE daima hedef tablonun içerdiği indeksleri, kuralları, tetikleri ve kısıtları
kaldıracaktır.
DROP TABLE CUSTOMER
WITH KOMUTU
WITH NOLOCK
SQL serverda kullanıcı tablo’da bir kaydı açıp üzerinde işlem yapıyorsa o kayıt SQL server tarafından
kilitlenmektedir. Aynı kayıt üzerinde işlem yapmak isteyen kullanıcılar diğer kullanıcının işleminin bitmesini
beklemek durumundadır. With nolock komutu tabloların kilitlenmesini engelleyen bir yapıdır. Bu sayede aynı
tablo üzerinde aynı anda birden fazla kullanıcı işlem yapabilmektedir.
Büyük ölçekli projelerde kullanılması tavsiye edilir.
WITH ROLLUP
Group by ile kümelenmiş veri kümesinde ara toplamı verir. Group by dan sonra gelir.
WITH CUBE
WITH TIES
Top N ile şart sağladığım satırlara sıralama yapar ancak bu sıralama eşit olan değerleri aynı sıraya ekler.
Karmaşık sorguları tek çatı altında toplamayı sağlar. As den sonra gelen sorgunun adı CTE dir.
WITH CTE
AS(
SELECT ID, ITEMNAME
, RN=ROW_NUMBER()OVER(ORDER BY ID)
FROM CUSTOMER
)
UPDATE CTE SET ID=RN
ID Kolonunu yeni baştan dizmek istersem ve ada göre sıralanmasını istersem With komutunda RN takma isim verdiğim
için update işleminde kullanmamı sağlamaktadır.
Bu tarz karmaşık sorgularda With ile oluşturacağımız tablolara vereceğimiz aliasları DDL ve DML işlemlerde
kullanabilmekteyiz.
SIRALAMA VE DÜZENLEME KOMUTLARI
ORDER BY
Sıralama işlemi yapmaktadır. Order by dan sonra sıralanacak kolon adı girilir ve eğer küçükten büyüğe sıralamak
istersek asc, Büyükten küçüğe sıralamak için desc kullanılır. Ancak kolon adından sonra bir şey yazmayıp kodu
girersek otomatik küçükten büyüğe sıralayacaktır.
ROW_NUMBER FONKSİYONU
PARTITION BY KOMUTU
Örnekte önce ada göre sıralayıp sonra yaşa göre sıralamış ve id değerlerini verir.
Yazılan sorguda offsetin yanına gelecek rakam kaçtan başlayacağı next in yanına gelen rakam ise kaç adet
alacağım anlamına gelir.
SELECT ID, NAMESURNAME
FROM CUSTOMER
ORDER BY ID
OFFSET 5 ROWS FETCH NEXT 20 ROWS ONLY;
ID değeri 5 den sonra olan 20 değeri getirmektedir.
NTILE
Parantez içinde rakama göre bölüm yapar ve sıra verir.
IDENTITY OLUŞTURMA
CREATE TABLE SERKAN (
ID INT IDENTITY(1,1) ) 1 ER 1 ER ARTSIN 1 DEN BAŞLASIN ANLAMLARINA GELİR
@@IDENTITY KOMUTU
INSERT CUSTOMER DEFAULT VALUES -> DEFAULT VALUES DEĞER YOK ANLAMINA GELİR
NAMESURNAME BIT DEFAULT '1' -> İÇİNE HANGİ DEĞERİ GİRERSEM GİREYİM 1 DEĞERİ GELİR
Trigger kullanılan sorgularda yanlış sonuç alma ihtimalinden dolayı kullanılması tavsiye edilmez.
IDENT_CURRENT
SELECT IDENT_CURRENT('CUSTOMER') İnsert işleminden sonra devam edecek id değerini sırasını verir.
DBCC CHECKIDENT (CUSTOMER, RESEED,78) -> Reseed sorgunun içinde bulunan parametredir.
“78 “ ise devam etmesini istediğim id değerimdir.
@@ROWCOUNT
Null değeri gelen sonuçları parantezin virgülden sonraki kısmına verilen değeri yazar.
SELECT ISNULL(CITY,'ŞEHİR BİLGİSİ YOK') FROM CUSTOMER
COALESCE
Mantık olarak isnull ile aynıdır. Null değeri yerine atayacağımız değeri getirir.
SELECT COALESCE(CITY,'ŞEHİR BİLGİSİ YOK') FROM CUSTOMER
DEĞİŞKEN TANIMLAMA
Değişkenleri Declare ile tanımlayabilirim.
Sonucu gelmektedir.
IF FONKSİYONU YAPISI
MS SQL’de T-SQL yapısında da koşullu sorgular oluşturma ihtiyacı duyabiliriz. Tıpkı programlama dillerinde
olduğu gibi koşul sonucu TRUE ve FALSE mantıksal yapısına göre işlemler ele alınırlar.
ÖR: Değişkene direkt olarak değer atayıp where şartında bu değeri döndürürsem birden fazla değer
gelmektedir.
Aratılan sorguda değer geliyorsa TRUE gelmiyorsa FALSE olarak bilgi döner.
IF EXISTS (SELECT * FROM CUSTOMER)
PRINT ' DOLU'
ELSE
PRINT 'BOS'
[Link]
IIF FONKSİYONU
Mantık olarak Exceldeki eğer mantığıyla aynıdır. Eğer yapısı, doğruysa, yanlışsa olarak dizilmektedir.
DECLARE @X INT = 10
SELECT IIF(@X>5,'5 TEN BÜYÜK','5 TEN KÜÇÜK') 5 TEN BÜYÜKTÜR DEĞERİ GELİR.
CASE WHEN ELSE END FONKSİYONU
Mevcut bir veri satırında yer alan değerin daha sonra istediğimiz şekilde görüntülenmesini sağlayabiliriz.
Ör. Şirketimizin Türkiye’nin farklı bölgelerde mağazaları var ve çalışanlarımızın hangi bölgelerde ne kadar satış
yaptığını görmek istediğimiz bir tablo oluşturmamızı istiyor.
Raporumuzun anlamlılığı açısından BRANCH ları birer sütun olarak almak istiyorsak bu kısımda PİVOT komutu
devreye girmektedir. Pivot komutu sayesinde branch ları sütun olarak getirebiliriz.
Önemli: Pivot fonksiyonu büyük boyutlu verilerde performans açısından oldukça maliyetli olabilir. Eğer ki
performans söz konusu olan ama bir yandan da milyonlarca veri üzerinde işlem yapmanızı gerektiren raporsal
çalışmalarınızda bu maliyeti göz önünde tutarak hareket etmenizi tavsiye ederim.
JOINLER
SQL de birbiri ile ilişkili tablolardan veri çekmek için JOIN komutlarını kullanarak ilişkili tabloları tek çatı
altında toplarız. Joinler bire bir, Bire çok, Çoka çok olarak ilişkilenmektedir.
[Link]
1. INNER JOIN: Her iki tablodaki eşleşen kayıtlar yalnızca geriye döner. Bunu şöyle düşünün a ve b kümesi
olsun iki kümenin birleşimi inner joindir.
2. LEFT JOIN: İki tablo içerisinde solda yer alan tablonun kayıtları ve sağdaki tabloda eşleşen kayıtlar döner.
3. RIGHT JOIN: İki tablo içerisinde sağda yer alan tablonun kayıtları ve soldaki tabloda eşleşen kayıtlar döner.
[Link]
[Link]
[Link]
ayrilmasi/
[Link]
SUBQUERY (İÇ İÇE OLAN SORGULAR)
Karmaşık sorgular için kullanacağımız sorgu içinde sorgulardır.
Subquery i kullanmamızın en doğru yöntemi önce parantez içinde oluşturduğumuz sorgunun çalışıp hangi
değerleri getirdiğine bakarız daha sonra bu değer ile etkilenen sorgu ya da sorguların sonuçlarına bakarız.
Subquery i sorgularında önemli olan en alt sorgudan üst sorguya giderek kontrol sağlamamızdır.
SUBQUERY ÖRNKERLERİ
[Link]
SUBQUERY VE JOINLER
SELECT NAMESURNAME, SAYI FROM CUSTOMER WHERE ID IN
( SELECT ID FROM CUSTOMERYEDEK WHERE SAYI IS NULL)
[Link]
“UNION İLE UNION ALL ARASINDAKİ FARK UNION ALL İKİ TABLOLDA DA OLAN DEĞERİ TEK BİR SEFER
GETİRİR. UNION ALL TEKRAR EDEN DEĞERLERİ GETİRMEZ.”
MERGE KULLANIMI
SQL Serverda merge komutu iki tablo arasındaki farklı gördüğü alanı insert edip aynı gördüğü
alanı güncelleyip, farklı alanı ise silebileceğimiz bir yapı oluşturur. İki tablo arası eşitleme gibide düşünebiliriz.
Eğer kayıt var ise güncelle, yok ise ekle mantığıyla çalışmaktadır.
Her iki tabloya da kaydı ekledi eğer birinde bu kayıt olsaydı diğerine ekleyecekti sadece.
[Link]
GEÇİCİ TABLOLAR # VE ##
Birden fazla kişini çalıştığı durumlarda ya da verilerin test amaçlı geçici bir yerlerde tutulması işlenmesi amacıyla kullanılan
yapılardır.
Geçici tablolar Temp db’de toplanmaktadır.
# ile belleğe geçici olarak kaydedilir ve sql ya da PC kapatıldığında tablom silinir.
## ile geçici tablo oluşturmanın farkı bu tabloya 3. şahıs bağlanabilir ve 3. Şahıs oturumu kapattığında tablom silinir.
UNIQUEIDENTIFIER
Benzersiz bir değer oluşturur. Tablolarımda Uniq bir kolon ekleyeceksek bu değer ile o kolona değer ekleyebilirim.
SELECT NEWID()
INSERT CUSTOMER(OZEL) VALUES (NEWID())
DENY
GRANT komutunun tersidir. Yetkileri engeller. Yukarıdaki örnekle aynı şekilde kullanılabilir.
REVOKE
GRANT ile değiştirdiğimiz hakları eski haline döndürmek için kullanılır. Bir nesneyi oluşturan kullanıcının
REVOKE ile nesne üzerindeki yetkilendirme ve kullanma hakkı yok edilemez.
REVOKE ALL ON REGION TO BAYRAKTAR
DYNAMIC DATA MASKING (SAKLAMA GÜVENLİK)
Select sorgusuyla gelen verilerin fiziksel halini maskeleme işlemi yapmamızı sağlar.
CHECK CONSTRAINT
Check constraint: Girilecek verinin şartlara uygun olmasını ister aksi halde kayıt yaptırmaz.
ALTER TABLE CUSTOMER
WITH NOCHECK
ADD CONSTRAINT CS_KNTRL CHECK (AGE>18) BU SAYEDE AGE KOLONUNA 18 YAŞ VE ALTI GİRİLEMEYECEK
UNIQUE CONSTRAINT
Tek amacı belirtilen kolondaki değerleri tekil olmasını sağlar. Tekrar edecek değerleri insert etmez.
İlgili database i seçtikten sonra alt başlığında Database Diagramsları mevcuttur. New diyerek yeni
diyagram ekleyebilirim. Diyagramları birbirlerine bağlamam için bağlayacak tablonun primary key
olması gerekmektedir.
Tablonun ilişkili başlığına sürüklerim. Anahtar işareti bir , ∞ işareti ise çok anlamına gelmektedir. Bire
çok bir ilişki olduğunu
Artık tablolar arasında bir ilişki mevcuttur bu sayede ilişkili tabloda silme işlemleri yapamayız. Bu ilişkili
tablolarda join ile tablolar arasında bağlama yapabiliriz.
VIEW
Karmaşık sorguları tek bir sorguya indirmeyi sağlar. Raporlama ve güvenlikte gerekir. Komplikeyi
sadeleştirir.
Herhangi bir sorgunun sonucu tablo olarak ele alır ve bu oluşturulan tablodan sorgu çekebiliriz.
Fiziksel bir yapıdır. Veri tabanına kaydolur.
View da içeri insert update delete gibi işlemler ana tablomda etki etmektedir.
Viewlar normal sorgudan daha yavaş çalışır.
Fazla sayıda view olması SQL için sağlıklı değildir.
Sorgu uzun sürerse view’ın içine bakarız ve scriptleri hangi sorgunun yavaşlattığını bulmak için silerek
deneriz
View desing kısmında detaylı bir şekilde ayarlama yaparım.
View’ın New view(sihirbaz kullanımı) ile ilgili tablolarda karmaşık sorguları çoklu joinli
sorgularını kolaylıkla yapabiliriz. Where şartlarını kolaylıkla sağlayabiliriz. Sıralamalar
oluşturabiliriz. Hatta karmaşık join sorgularını bu pencereden bile yapabiliriz.
CREATE VIEW VW_CUS
AS
SELECT * FROM CUSTOMER WHERE CITY LIKE 'KARABÜK%'
SELECT * FROM DBO. VW_CUS
View içerisinde order by kullanılmaz. Kullanmak istiyorsak sorgumda TOP N kullanarak sonuna order by
kullanılmalıdır.
SELECT TOP 100 PERCENT * FROM DBO. VW_CUS ORDER BY AGE
View kaynak koduna ulaşmak için database adına tıklanarak view a tıklanır ve ilgili view a design’a tıklanır.
WITH ENCRYPTION KOMUTU
View sorgusundaki where şartına göre kayıt ekletir eğer şarta uymuyorsa kayıt ekleyemez.
İki çeşit fonksiyon vardır. Scalar ve Inline fonksiyonlarıdır. Scalar fonksiyonlar geriye istediğimiz tipte değer gönderir. Inline
fonksiyonlar geriye tablo döndürür.
Herhangi bir kolonda fonksiyon kullanarak otomatik hesaplanabilir kolonlar oluşturmak mümkündür.
SCALAR FONKSİYONLAR
CREATE FUNCTION TOPLA. ÇARPIM(@SATIŞADEDİ INT ,@SATIŞTUTARI INT ) RETURNS INT(SCALAR
OLDUĞU GERİYE DÖNDÜRMESİNİ İSTEDİĞİMİZ DEĞER INT GELİR)
AS
BEGIN
RETURN @SATIŞADEDİ*@SATIŞTUTARI
END
Bu şemayı çağırırken Dbo. topla.çarpım olarak çağırabiliriz.
--KULLANIMI
SELECT URUNADI, DBO. TOPLA. ÇARPIM(SATIŞADEDİ, SATIŞTUTARI) AS HESAPLANMIŞ FROM URUNLER
--KULLANIMI
SELECT * FROM DBO. FC_GONDER('NANCY','DAVOLİO')
RETURN GERİYE TEK DEĞER DÖNDÜRMEDE YARAR, RETURNS GERİYE GÖNDÜRÜLECEK VERİNİN
TİPİNİ BELİRLER.
Normal sorgulardan daha hızlı sorgu yapmamızı sağlar. Güvenlidir kritik raporlar için sp bazında yetkiler verir.
Ram hızında çalışırız. Vıew a göre daha güvenlidir.
Select, Delete, Update, İnsert işlemleri yapabiliriz. TSQL in tüm komutlarını yazabiliriz.
Execute plan işlemi yapılır. Exec komutu ile çağırırız.
SQL injection saldırılarına karşı koruyabilir.
Programmability -> stored procedurs de bulunur
Stored procedureleri birbirleri içerisinde çağırabiliriz.
Stored procedurelerin değişkenleri aksi söylenmedikçe inputtur.
SP_SPACEISER tablonun boyutunu söyler. SP_SPACEUSED CUSTOMER
END
TRIGGERS(TETİKLEYİCİLER)
Tetikleyici (Trigger) yapısı, ilişkisel veri tabanı yönetim sistemlerinde, bir tabloda belirli olaylar meydana geldiğinde veya gelmeden
önce otomatik olarak çalışan özel bir store procedure türüdür. Bir tabloda ekleme, güncelleme ve silme işlemlerinden biri
gerçekleştiğinde veya gerçekleşmeden önce, aynı tabloda veya başka bir tabloda belirli işlemlerin yapılmasını istediğimizde, trigger
yapısını kullanırız. Örnek verecek olursak, satış tablosunda satış işlemi gerçekleştiğinde ürünün stok miktarının eksiltilmesi, banka
hesabında işlem gerçekleştikten sonra otomatik olarak email gönderilmesi gibi örnekler verilebilir.
DML TRIGGER
INSERT, UPDATE ve DELETE gibi veri okuma ve işleme için kullanılan DML ifadeleridir. DML tetikleyicileri, INSERT, UPDATE
ve DELETE olayları kullanılarak veriler her değiştirildiğinde tetiklenir. DML tetikleyicileri iki tip olarak sınıflandırılır.
Commit işlemi işlemler doğruysa işlemi başarılı sonlandırır. Eğer bir hata alınırsa Rollback yapar ve tüm işlemleri geriye
sardırarak başa gelir.
DDL TRIGGER
CREATE, ALTER, DROP gibi veritabanı ve tablo ile ilgili işlemler DDL ifadeleridir. DDL tetikleyicisinin amacı, bir DDL nesnesi
oluşturmaya (create), değiştirmeye (alter) veya düşürmeye (drop) çalışan kullanıcılara kısıtlama getirilmesini sağlamaktadır.
CREATE, ALTER ve DROP ifadeleri kullanıldığında devreye giren tetikleyici türüdür
Update işleminin mantığı ilk deleted tablosu daha sonra inserted tablosunda olur.
Customer tablosunda update gerçekleştiği anda yapılacak güncelleştirme yerine bir rapor tablosuna
( 'ADI VE SOYADI ' + @ADI+' OLAN KULLANICI ' + SUSER_NAME()+ ' TARAFINDAN '+
CONVERT(NVARCHAR(MAX),GETDATE())+'TARİHİNDE DEĞİŞTİRİLMEK İSTENDİ.') kalıbında bir rapor yazan trigger yazalım.
Bir telefon rehberinde düzensiz halde 1000 kişi varsa SQL aramada 1000 pagelik sorgu gelir ancak indexlerin ikiye böl bul
metoduyla 1000 pagelik sorguyu 9, 2000 i 10 adımda bulur 1 milyar pagelik değeri 29 adımda bulabilir. Buda sorguyu hızlı
çekmemi sağlar. İndexler bu telefon rehberinde sıralama yapmayı sağlar.
Karmaşık sorgumu çalıştırdığımda ve CTRL+L ile execution plan penceresi gelir. Burada işlem okumasını neyle yaptığını
söyler.
Table scan ile okumuş olması sorguyu teker teker okuduğu anlamına gelmektedir.
Clustred index scan ise index ile okuma yaptığı anlamına gelmektedir.
Database -> Tables -> ilgili tablo başlığının altında indeksleri görebiliriz.
Karmaşık sorgularda içinde Where ve order by olan sorgularda. Execution planı açtığımızda sağ tık yaptığımızda missing
index(ınpact.) olarak bize en uygun index yapısını verir.
Clustered index primary key olan indextir tablomda sadece 1 adet olabilir.
Büyük databaselerde örneğin barkod okutma sistemli bir firmada indexlerin ikiye böl bul metodu ile saniyeler içinde sorguma
ulaşabilirim.
SP_UPDATESTATS ile index frekanslarına bakarım index frekansı kaç tane olduğunu söyler.
INDEX OLUŞTURMA
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]ON [dbo].[USER_]
([NAMESURNAME])
CREATE CLUSTERED INDEX CUSTOMER ON CUSTOMER(ID)
[Link]
Managemnet -> Maintance Plans -> New Maintance -> Name: Index Rebuild
Sol kenardan Toolboxtan -> rebuilld index task a çift tıklarım düzletecek indexleri seçerim.
İSTATİSTİK GÜNCELLEME
BELİRLEMİŞ OLDUĞUMUZ BİR TAKIM İŞLERİ İSTEDİĞİMİZ ARALIKLARDA YAPAN KOMUT KÜMELERİDİR.
JOB SAYESİNDE DÜZENLİ YEDEKLEMELER ALINABİLİR.
JOB OLUŞTURMA:
SQL SERVER AGENT -> sağ klik ile start a tıklarız-> Yes ve artık aktifleştirdik.
Database de Etrade databasesinde JOBS adında bir tablo oluştururum ve ID ve Metin adında kolonlar
oluştururum.
Örneğin yapacağım her yedeklemede bana zaman bilgisi ve başarılı bilgisi vermesini isterim.
SQL SERVER AGENT->JOBS->NEW JOB -> JOB 1 ADI VERİRİM -> SOL SÜTUN BAŞLIKLARINDAN STEPS E
TIKLARIM.
NEW-> STEPNAME VERİRİM(DENEME)-> DATABASES KISMINDAN İLGİLİ DATABASE İ SEÇERİM. COMMAND
KISMINA
NEW->NAME GİRİLİR ->FREQUENCY DEN ZAMANLAMA SEÇİLİR. DAİLY İ SEÇTİM -> OCCURS EVERY DEN
SAATTE
DAKİKADA YA DA SANİYEDE KAÇ DEFA YAPILMASI GEREKTİĞİNİ AYARLARIZ. VE DİĞER TÜM İŞLEMLERE OK
DİYEREK
JOBIMIZI OLUŞTURURUZ.
EĞER JOB KLASÖRÜNDE DEĞİŞİKLİK YA DA SİLME İŞLEMİ YAPMAK İSTİYORSAK JOBS + YA TIKLAYARAK
İLGİLİ JOB I
SEÇERİZ VE DÜZENLEMELERİ YAPARIZ.
KARIŞIK SQL BİLGİLERİ - TSQL SORGULARI
DBCC CHECKDB İLE DATA BASE SAĞLAMLIK KONTROLÜ
DB SAĞTIK -> TASKS -> RESTORE -> PAGE -> CHECK DATABASES buradan bozuk olan sayfalar gelir.
Sorguyu istenilen süre sonra çalıştırır, time ise verilen zamanda çalıştırır.
BULK INSERT
Harici bir kaynaktan veri ekleme. Önceden fiziksel bir tablom olmalıdır!
BULK INSERT KISILER
FROM 'D:\KİSİLER. TXT'
WITH /*BULK INSERT E ÖZEL BİR WITH*/
(FIELDTERMINATOR ='\T' -> SÜTUN İÇİN
ROWTERMINATOR ='\N' -> SATIR İÇİN )
SELECT @@LANGUAGE
SELECT @@VERSION
LİNKED SERVER
Bu işlem uzak sunucu bağlantılarını tek çatı altında kendi PC’mi de toplamamı sağlar.
MASTER DB: Master database, Sistem üzerinde kullanıcıların açmış olduğu database’lerin listesini, yine kullanıcı tarafından
veya sistem tarafından belirlenen login bilgileri gibi birçok veriyi saklar ve yönetir.
Master kopyalanıp şifresi değiştirilirse diğer kullanıcılar eski şifreyle giremez. Bu işlem için SQL in kapalı olması gerekir.
MODEL DB: Boş DB dir yeni oluşturulan DB’lerin veri tablolarını almaktadır.
MSDB: Periyodik olarak çalıştırılan her türlü işlemler ( joblar,schedulelar,alerttes) burada tutar.
New Job -> ad verilir. Steps -> steps name -> Database seçilir ve altına ilgili komut yazılır. Ok denir.
SCHEDULE -> name -> altında istenilen aralık tanımlanmış jobları aktarmak istiyorsam MSBD’yi kopyalamam yeterli ancak
SQL versiyonlarım aynı olmak şartı vardır.
TEMP DB: Geçici Tablolar bu db de tutulur. Aggregate fonksiyonları, join ile olan tablolar arka planda bunu yapan tablolar
kullanılır # ve ##
SELECT * INTO #TempDB1 FROM CUSTOMER
SQL YEDEK ALMA
BACKUP İLE YEDEK ALMA
İlgili database seçilir. Tasks -> Backup -> Varsayılan C ye aktar Ok ile alınır.
Advancedd -> typses of data to script kısmında schema and data seçilir. Üç noktayı … Seçerek kaydolacak yeri
ayarlarız ve finishleriz.
Birçok kişi bu eksiklik sebebiyle ya sistem yedeğini hiç almıyor, ya manuel olarak alıyor, ya da Veeam tarzı
uygulamalar ile günde bir kez tüm sistemin yedeğini alıyor. Oysa gün içerisinde gerçekleşebilecek bir
problemde bir gün önceki yedek yeterli olmayabilir.
Şimdi hadi gelin bu sorunu çözmek için çok pratik bir işlem yapalım.
Öncelikle veri tabanımızın bir yedeğini almamız gerekiyor. Tabi birden fazla veri tabanı varsa her biri için de bu
işlemin otomatik olarak gerçeklemesi gerekiyor.
Bir sonraki aşamada bu yedekleri rar ile sıkıştırıp başka bir yere de kopyalamak isteyebiliriz. Onu da sadece sql
scripti kullanarak yapabiliriz. Tabi makinemizde winrar kurulu olması gerekiyor.
Aşağıdaki script işte tam olarak bu işe yarıyor. Yani otomatik olarak belirlediğimiz tüm database lerin
yedeklerini alıyor. Şimdi bu scripti master db seçili iken çalıştıralım.
Tabi buradaki klasörler bilgisayarınızda yoksa oluşturmalısınız.
SQL SERVER’DA BACKUP STRATEJİŞERİ FULL BACKUP VE DIFFERENTIAL BACKUP
1- [Link]
2- [Link]
3- [Link]
kullanimi/
4- [Link]
5- [Link]
plani-olusturma/
Bu yazımızda SQL Server’daki bir tabloyu sıkıştırma yani Compress özelliğinden bahsediyor olacağım.
Birçoğumuz veri tabanlarında text veriler kullanıyoruz. Bu verilerde ise gerek veri tabanı mimarisi sebebiyle ya
da gerekse içerisindeki veriler sebebiyle boşluklar bulunmakta. Bu boşluklar ise gereksiz yer teşkil etmekte.
Tablo-> sağ tık ile storage -> manage compression -> next -> row -> calculate -> tekrar page seçilir -> calculate
burada ne kadar sıkışacağı bilgisini veriyor. -> next dediğimde sorguyu veriyor
USE [ETRADE2]
ALTER TABLE [dbo].[SALESA] REBUILD PARTITION = ALL
WITH
(DATA_COMPRESSION = PAGE)
[Link]
SQL SERVER’DA BİLİNÇLİ İNDEXLEME
Indexler yaşayan varlıklar. Yeni kayıtlar eklendiğinde, kayıtlar silindiğinde ya da güncelleme işlemi
yapıldığında haliyle bu indexler bozuluyor ve belli zaman aralıklarında bunları güncellemek gerekiyor. Bunun
yolu da çok basit. 2 dakikada bu işi yapacak bir planı kod yazmadan oluşturabilirsiniz.
Bu düzeltme işlemi bazen uzun sürüyor ve sistemi kilitliyor ve durdurmak zorunda kalıyorsunuz. Siz hangi
tablonun indexlerinin yapıldığını hangi tablonun yapılmadığını bilemiyorsunuz.
Ayrıca hangi tablo indexten önce ne kadar bozuktu, indexten sonra ne kadar düzeldi onu da bilmiyorsunuz.
Yine hangi tablodaki index düzeltme işleminin ne kadar sürdüğünü de bilmiyorsunuz.
İşte bu sorunlara çözüm olması amacı ile bir stored procedure yazdım ve onu burada paylaşmak istiyorum.
Bunun için index işlemini loglamak amacı ile bir veri tabanı ve bir tablo oluşturuyoruz.
Örneğin ben burada database i BT diye oluşturdum.
Siz de aşağıdaki script ile oluşturabilirsiniz.
use BT
CREATE TABLE [dbo].[TBLINDEXLOG](
[ID] [int] IDENTITY(1,1) NOT NULL,
[SEQID] [int] NULL,
[DBNAME] [varchar](50) NULL,
[TABLENAME] [varchar](250) NULL,
[BEGDATE] [datetime] NOT NULL,
[ENDDATE] [datetime] NULL,
[DURATION] [int] NULL,
[FRAGMANTATIONBEFORE] [float] NULL,
[FRAGMANTATIONAFTER] [nchar](10) NULL,
[ROWCOUNT_] [int] NULL,
[DATASIZEBEFORE] [int] NULL,
[INDEXSIZEBEFORE] [int] NULL,
[TABLESIZEBEFORE] [int] NULL,
[DATASIZEAFTER] [int] NULL,
[INDEXSIZEAFTER] [int] NULL,
[TABLESIZEAFTER] [int] NULL,
CONSTRAINT [PK_TBLINDEXLOG] PRIMARY KEY CLUSTERED
(
[ID] ASC
) )
SELECT @ROWCOUNT=ROWS
,@TABLESIZEBEFORE=CONVERT(INT,REPLACE(RESERVED,' KB',''))
,@DATASIZEBEFORE=CONVERT(INT,REPLACE(DATA,' KB',''))
,@INDEXSIZEBEFORE=CONVERT(INT,REPLACE(INDEX_SIZE,' KB',''))
FROM #T
SET @ID=@@IDENTITY
TRUNCATE TABLE #T
INSERT INTO #T
EXEC SP_SPACEUSED @TABLENAME2
SELECT @ROWCOUNT=ROWS
,@TABLESIZEAFTER=CONVERT(INT,REPLACE(RESERVED,' KB',''))
,@DATASIZEAFTER=CONVERT(INT,REPLACE(DATA,' KB',''))
,@INDEXSIZEAFTER=CONVERT(INT,REPLACE(INDEX_SIZE,' KB',''))
FROM #T
SET @ENDDATE=GETDATE()
SET @DURATION=DATEDIFF(SECOND,@BEGDATE,@ENDDATE)
EXEC [Link]
Çıkan sonuç: en çok satır sayıları olan tabloları incelememizi sağlıyor. Örneğin burada LG_217_01_STLINE
tablosunu inceleyelim
%31 fragmante olmuş yani indexler %31 oranında bozuk.
159.469 satır var
Index süresi 42 Sn. sürmüş.
Tablo boyutu indexten sonra 409.368 KB’tan 492.056’a çıkmış. Bu büyüme Fill factor değerinden
kaynaklanıyor.
SQL SERVER DATABASE MAİL VE GMAİL İLE KULLANIMI
EXEC [Link].SP_SEND_DBMAİL
@PROFİLE_NAME='SQL MAİL'
@RECİPİENTS = 'serkancoskun@[Link]'
@BODY = 'Bu bir test mailidir.'
@SUBJECT= 'TEST MAİL'
EXECUTE İLE SQL SERVER BİZE MAİL GÖNDEREBİLİR.
[Link]
Windows bakımı;
Ağ protokollerinin yapılandırmasını etkinleştirme/devre dışı bırakma veya değiştirme (SQL Server
Configuration Manager kullanarak);
Düzeltmeler/Yamalar/Hizmet paketlerinin uygulanması;
Dosyanın yeniden oluşturulmasıyla giderilen tempdb sorunları;
İzleme bayrakları gibi başlangıç parametrelerinin uygulanması;
Sunucu kimlik doğrulama modu değişiklikleri.
Yukarıdaki nedenler dışında, bakımlı ve sağlıklı bir SQL Server sonsuza kadar mutlu bir şekilde çevrimiçi
kalabilir.
Bana göre, sunucunun yeniden başlatılması muhtemelen performansa en çok zarar veren şeylerden biri! SQL
sunucusunu yeniden başlattığımızda, tüm belleği sunucu işletim sistemine geri alıyoruz, plan önbelleğini
tamamen temizliyoruz ve tüm tempdb'leri siliyoruz. Bu şu anlama gelir:
Belleği Windows işletim sisteminden geri almak biraz zaman alacaktır. Bu süre boyunca, SQL sunucusu
diskten çok fazla veri okuyacak ve verileri belleğe geri yükleyecektir.
SQL Server'ın Plan Önbelleği, sıklıkla yürütülen sorgular için önceden derlenmiş yürütme planını
saklar. Yürütme planlarını oluşturma ve tekrar tekrar derleme maliyetini azaltarak sorgu performansını
artırır.
Önbelleğe alınmış tüm sorgu planları kaybolur ve SQL sunucusunun onu yeniden derlemesi
gerekir. Sunucunun iş yüküne bağlı olarak, SQL sunucusunun tüm yürütme planlarını oluşturup önbelleğe
geri yüklemesi biraz zaman alacaktır. "Yeni Plan Önbelleği", muhtemelen nadiren yürütülen prosedürleri
içermeyecektir, çünkü hizmet sona erdiği için tüm planlar "anında" oluşturulacaktır. Ek olarak, kötü bir
yürütme planı “alma” riskini alıyoruz.
[Link]
CPU değerimin 20-25 olmasını beklerim. Ram büyüklüğü sorgu çekmemi kolaylaştırır.
Ram in bus hızı önemlidir. Doğrusal anlamda etkilidir. Ancak sadece ram in yüksek olması bir çözüm değildir.
[Link]
Sizin yazdığınız trigger ticari programın kendisinin hata vermesine sebep olabilir ve kayıtların
yapılmamasına sebep olabilir. Zira triggerlar transactionların bir parçasıdır ve trigger da gerçekleşen hata
tüm transaction ı rollback yapar.
Özellikle mevzuat değişimi gereği sıklıkla versiyon geçişi söz konusudur ve bu versiyon geçişlerinde
database düzenlemesi yapıldığı için büyük ihtimal triggerlarınız silinir ve her seferinde yeniden oluşturacak
scriptler oluşturmanız gerekecektir.
Genel olarak Türkiye şartlarında dönem mali dönem bağımlı çalışmak tercih edildiği için her yılbaşında
fizikken yeni tablolar oluşturulmaktadır ve bunlar için de triggerlar yeniden yazılmalıdır.
Anlaşılacağı üzere trigger meselesi etkin bir çözümdür fakat biraz zahmetlidir.
Peki, bizim yazımızın da konusu olan bu durum için bir çözüm yok mu? Birim fiyatı 5000 TL olan bir
malzemenin satış faturasındaki fiyatını 50 TL olarak değiştiren bir kişiyi tespit etmenin pratik bir yolu yok
mudur?
Bu noktada imdadımıza SQL Server Change Data Capture (CDC) dediğimiz özellik yetişiyor. Bu arkadaş
yetenekli bir arkadaş. SQL Server’da bildiğiniz üzere tüm manipülasyon işlemleri önce Log dosyasına sonra
Data dosyasına yazılır. Burada log dosyası diye bahsettiğim SQL server’ın sistem log dosyası değil database’in
Log dosyasıdır (LDF).
İşte CDC sistem üzerinde Log dosyasını izler ve olan değişiklikleri hızlı bir şekilde kayıt altına alır.
Örnek olarak siz aşağıdaki gibi bir UPDATE cümlesi çalıştırdınız.
UPDATE CUSTOMERS SET ACTIVE=1
CUSTOMERS tablosunun 20 alandan oluştuğunu varsayalım oysa biz sadece bir alanı update ettik. Dolayısıyla
SQL Server transaction log üzerinde sadece bir alanlık işlem hacmi söz konusu.
İşte Change Data Capture sadece bu bilgiyi okuyarak arka planda veriyi logluyor.
Siz CDC yi configure ederken belli bir süreliğine dataları loglayıp belli bir tarihten öncesini sildirebiliyorsunuz.
Burada yazacağınız bir script ile önce bu datalara herhangi bir warehouse ortamına alıp daha sonra sistemden
temizleyebilirsini
EXEC sp_cdc_enable_db
-- Tablomuzda CDC yi enable yapalım.
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'CS',
@role_name = NULL,
@filegroup_name = N''
--@supports_net_changes = 1
2) CDC yi enable ettikten sonra system tables altında aşağıdaki tablolar oluşur.
4)Tablolarımıza bakalım.
/* Log kayıtlarını ulaşmak istediğimizde eğer tablonun tamamına ulaşmak istiyor isek
Select burada tablo formatı cdc.<schema>_<tablename>_CT şeklinde.*/
SQL Server Change Data Capture ile Değişiklik Yapılan Kayıtların Loglanması – Ömer Çolakoğlu ([Link])
Sonuç:
CDC gerçekten çok ihtiyaç duyulan ve çok kullanışlı bir araç.
Sistemdeki insert, update ve delete leri loglayabiliyor.
Eğer update cümlesinde kayıt değişmiyor ise gereksiz yer teşkil etmiyor.
Örneğin: UPDATE CUSTOMERS SET NAME=NAME cümlesini çalıştırdığımızda herhangi bir loglama
yapmıyor çünkü değişen bir şey yok.
Sistemin çalışıyor olması için SQL Server Agent’ın mutlaka çalışması gerekir. Çünkü loğları okuyan bir
job bu işleri yerine getirmektedir.
Yazacağımız bir script ile istediğimiz tablolarda çalıştırıp istemediklerimizde çalıştırmayabiliriz. Hatta
çok fazla kolon olan bir tabloda istediğimiz kolonlar için aktif hale getirirken istemediklerimizi es
geçebiliriz.
SQL Server’da birçok database iniz var. Hangisi aktif kullanılıyor, hangisi kullanılmıyor görmek istiyorsunuz. En
son ne zaman erişildiğini görmek için aşağıdaki scripti görebilirsiniz.
CREATE TABLE #T (dbName varchar(100),last_user_seek datetime,last_user_scan datetime,last_user_lookup
datetime,last_user_update datetime)
declare @dbId as int
declare @dbname as varchar(100)
declare crs cursor for select dbid,name from sysdatabases
open crs
fetch next from crs into @dbId,@dbname
while @@FETCH_STATUS=0
begin
Insert Into #T
Select @dbname,
last_user_seek = MAX(last_user_seek),
last_user_scan = MAX(last_user_scan),
last_user_lookup = MAX(last_user_lookup),
last_user_update = MAX(last_user_update)
From
sys.dm_db_index_usage_stats
WHERE
database_id=@dbId
select * from #t
drop table #t
NOT IN
Verimde dışarda kalan kısımlar için kullanırım. Hangi müşteri bizimle hiç işlem yapmadı?
Son günlerde satılmayan ürünler hangileri?
Satış yapmayan personeller hangisi?
SELECT * FROM CUSTOMER WHERE CUSTOMER ID NOT IN (SELECT PERSONELID FROM SALES )
[Link]
XML METHODLARI
ERRORLARIN KULANIMI
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]