www.aliosmangokcan.com

Değerli öğrencilerim merhaba. Veritabanı dersinde yazdığımız örneklerin tamamını burada paylaşıyorum. Kendi notlarınızla karşılaştırır, defterlerinize yazdığınız notlarda hatalar varsa aşağıdaki örneklere bakarak gerekli düzenlemeleri yaparsınız.

Sorumlu öğrenciliğin doğası gereği derse gelip, örnekleri yapıp, örneklerin üzerine kendi ifadelerinizle notlar almış olmalısınız. Yazılan ifadelerin ne işe yaradığını, gerekli açıklamaları kendiniz yazmış olmalısınız. Yine de yazdığım bu örneklerin üzerine müsait oldukça daha ayrıntılı açıklamalar yazmaya çalışacağım.  Hepinize başarılar dilerim...  

SQL - YAPISAL SORGULAMA DİLİ

  • 1983’de IBM tarafından SQL standartları belirlenmiştir.
  • 1987’de ISO ve ardından ANSI tarafından bir standart olarak kabul edilmiştir.
  • Programlama dillernin neredeyse tamamı SQL komutlarını destekler.
  • Program geliştirme aşamasında SQL komutları tek başına yeterli olmadığından ayrıca programlama dilleri kullanılır.
  • Standart SQL ifadelerinde fonksiyon, karşılaştırma ve döngü ifadeleri gibi programlamaya yönelik ifadeler olmadığı için Pl/SQL ve T-SQL sorgulama dilleri geliştirilmiştir.

PL/SQL (Procedural Language): Oracle tarafından geliştirilen ve oracle veritabanlarında kullanılan dildir.SQL komutlarına ek olarak akış kontrolleri ve değişken kullanımına imkan sağlar.

T-SQL (Transact): Microsoft ve Sysbase tarafından geliştirilmiştir. SQL komutlarına ek olarak akış kontrolleri ve değişken kullanımına imkan sağlar.

SQL ifadeleri yapısal olarak 3 gruba ayrılır:

  • DDL (Data Defination Language / Veri Tanımlama Dili)

CREATE – ALTER – DROP 

  • DML (Data Manipulation Language / Veri İşleme Dili)

SELECT – INSERT – UPDATE – DELETE 

  • DCL (Data Control Language / Veri Kontrol Dili)

GRANT – DENY - REVOKE

 

-- bu yeşil yazılar açıklama/yorum durumunda

 

/* bu alana

yorum

yazılır

www.aliosmangokcan.com

*/

 

CREATE ile veritabanı ve tablo oluşturma

 

create database veritabanı_adı

ON

(Name=dosya_adı,

filename=fiziki_dosya_adı,                    ---- takma ad

size=dosya_boyutu,                            ---- MB / Default 2240 KB  

maxsize=maksimum_boyut,                       ---- MB

filegrowth=dosya_artım_miktarı)               ---- Default 1MB

LOG ON

(name=dosya_adı,

filename=fiziki_dosya_adı,

size=dosya_boyutu,

maxsize=maksimum_boyut,

filegrowth=dosya_artım_miktarı)

 

-- ÖRNEK 1:

create database okul

PRIMARY ON

(Name=okul_dat,

filename='d:\okuldat.mdf',

size=10,

maxsize=50,

filegrowth=5)

LOG ON

(name='okul_log',

filename='d:\okullog.ldf',

size=5MB,

maxsize=25MB,

filegrowth=2MB)

 

-- ÖRNEK 2:

use okul

create table ogrenci (

ogr_no int NOT NULL Primary Key,

ogr_adi varchar(25),

bolum varchar (50))

 

-- ÖRNEK 3:

create table personel(

pers_id int not nul,

soyad varchar (50) not null,

adi varchar (50),

adres varchar(100),

sehir varchar (50),

unique(pers_id) )

 

-- ÖRNEK 4:

 

create table ogrenciler(

ogr_no int identity(1,3) Not null,

ad nchar(10))

 

-- ÖRNEK 5:

 

create table ogrencilerimiz(

ogr_no int not null,

ad nchar(35),

sehir nchar(50) DEFAULT 'Afyon')

 

-- ÖRNEK 6:

 

create table notlar(

ogr_no int not null,

ders_kodu varchar(25) not null,

vize int,

final int,

CONSTRAINT birlesikPK PRIMARY KEY (ogr_no,ders_kodu)

)

 

-- ÖRNEK 7:

 

create table notlarim(

ogr_no int not null,

ders_kodu varchar(20) not null,

vize int CHECK (vize>=0),

final int CHECK (final>=0))

 

-- ÖRNEK 8:

 

create table notlar2(

ogr_no int not null,

vize int,

final int,

constraint chkvize CHECK (vize>=0 AND vize<=100),

constraint chkfinal CHECK (final>=0 AND final<=100))

 

IN, NOT IN ve LIKE

IN ---> yerine OR  

NOT IN----> yerine AND

 

LIKE

% birden fazla karakter

_ (alt çizgi) tek bir karakter yerine geçer

[HARF] herhangi bir karakter - kendisini ifade eder

[^HARF] herhangi bir karakter yerine gelmeyecek karakter

[A-Z] a ile z arası bir karakter gelecek demektir

 

-- ÖRNEKLER 9:

 

ÖRN1: LIKE '%A%'  içinde A harfi geçen

ÖRN2: LIKE 'A%' baş harfi A devamı önemli değil

ÖRN3: LIKE '_ _ A' 3 harfli ve son harfi A olmalı

ÖRN4: LIKE '[BD]%' ilk harfi B veya D olmalı/olacak

ÖRN5: LIKE '[A-K]%'  ilk harfi A ile K arasında olanlar

ÖRN6: LIKE '[7-8][0-9]'   70 ile 89 arasındaki sayıları ifade eder

ÖRN7: LIKE '[^B-M][^MOZ][A-Z]'

3 harften oluşan, ilk harfi B ile M arasında olmayan,

2.harfi M, O, Z içermeyen,

3.harfi A ile Z arasında olanlar

 

-- ÖRNEK 10:

 

create table urunler(

urun_kodu varchar(4) not null,

urun_adi varchar(25) not null,

constraint chkkod CHECK (urun_kodu IN('A089','A090','A010',

'A100') OR urun_kodu LIKE 'A9[0-9][0-9]'))

 

A089, A090, A010, A100 --> in'den dolayı ya bu girişler olacak ya da…

A900-A999 --> like'dan dolayı da bu aralık arasında olacak.

 

-- ÖRNEK 11:

 

create database araba

 

create table musteri(

Mkod int not null Primary Key,

mad varchar(50) not null,

msoyad varchar (50) not null,

madres varchar(255),

mtel varchar(11),

mail varchar(100))

 

create table arac(

aracno int not null primary key,

model int not null,

marka varchar (50),

plaka varchar (15),

fiyat int,

constraint chkfiyat CHECK (fiyat>=0 AND fiyat<=100000),

tarih smalldatetime) 

constraint chkmodel CHECK (model LIKE '[1-2][9-0][0-2][0-1]'))

 

create table kiralama(

mkod int not null,

aracno int not null,

tarih smalldatetime(20), (AY.GÜN.YIL)

constraint fk_mkod FOREIGN KEY (mkod) REFERENCES musteri (mkod) ,

constraint fk_aracno FOREIGN KEY (aracno) REFERENCES arac(aracno),

constraint pk_key PRIMARY KEY(mkod,aracno))

 

/* Referans tabloda silinen satırlar silindiğinde diğer tablolardan da silinmesi veya referans tabloda veriler güncellendiğinde diğer tablolarda da güncellenmesi için: ON DELETE CASCADE, ON UPDATE CASCADE */

 

-- ÖRNEK 12:

 

constraint fk_mkod foreign key (mkod) references musteri(mkod)

ON UPDATE CASCADE ON DELETE CASCADE,

constraint fk_aracno foreign key (aracno) references arac(aracno)

ON UPDATE CASCADE ON DELETE CASCADE,

constraint pk_key PRIMARY KEY(mkod,aracno)

 

 

ALTER ile veritabanı nesnesinin özelliğini değiştirme

 

1- Tabloya sonradan sütun eklemek için:

 

ALTER TABLE tabloadı ADD sütunadı özellikler

 

-- ÖRNEK 13:

 

ALTER TABLE kiralama

ADD testtarih smalldatetime(20) NOT NULL  

 

2- Tabloda istenen sütunu silmek için:

 

ALTER TABLE tabloadı DROP COLUMN sütunadı

 

-- ÖRNEK 14:

 

ALTER TABLE kiralama DROP COLUMN testtarih

 

3- Tabloda sütun özelliklerini değiştirmek için:

 

ALTER TABLE tabloadı ALTER COLUMN sütunadı özellikler

 

 

-- ÖRNEKLER 15:

 

ALTER TABLE arac ALTER COLUMN  plaka  nvarchar (20)  NULL

 

alter table musteri add myasi int

 

alter table musteri add check (myasi>0)

 

-- ÖRNEK 16: (constraint tanımlı sütun güncelleme)

 

alter table arac drop chkfiyat

 

alter table arac alter column fiyat float

 

Alter table arac ADD constraint chkfiyat CHECK (fiyat>=0 AND fiyat<=100000)

 

DROP ile tablo veya veritabanı silmek

 

NOT1: DROP ile ALTER ifadesiyle kullanılan DROP farklıdır. ALTER DROP ile veri tabanı nesnesinin Özelliği silinir.

 

-- ÖRNEK 17:

 

drop table abcd

 

drop database okulum

 

NOT2: DELETE de tüm kayıtları siler ama TRUNCATE en garantili siler.   

 

-- ÖRNEK 18:

 

TRUNCATE TABLE ogrenci

 

 

DML – veri işleme dili

SELECT – INSERT – UPDATE – DELETE

 

select sütunadı from tabloadı where koşul

 

-- ÖRNEK 19:  (SELECT örnekleri ilerideki kısımda ayrıntılı olarak gösterilecektir)

select * from sat_al

 

INSERT ile veri girişi

 

INSERT INTO tablo VALUES (deger1,deger2,deger3,...)

 

INSERT INTO tablo_adı (sütun1,sütun2,sütun3,...)

VALUES (deger1,deger2,deger3,...)

1- insert into tabloadı values (deger1, deger2, deger3...)

 

2- insert into tabloadı (sütun1,sütun2...) values (deger1, deger2...)

 

 

-- ÖRNEK 20:

 

INSERT INTO musteri values (1,'Muhammed', 'Talha', 'Izmir', '05358900718', This email address is being protected from spambots. You need JavaScript enabled to view it.', 20)

 

INSERT INTO musteri values (2,'Doğuakan', 'Eroğlu', 'Adana', '05312300718', This email address is being protected from spambots. You need JavaScript enabled to view it.', 22)

 

select * from musteri

 

-- ÖRNEK 21:

 

INSERT INTO musteri (mkod, mad, msoyad) VALUES (3, 'Ali', 'Yılmaz')

 

 

UPDATE ile veri güncelleme

 

update tabloadı SET sütun1=deger, sütun2=deger... where koşul

 

-- ÖRNEK 22:

 

select * from musteri

 

update musteri SET madres='Muğla',mtel='0545454', mail=This email address is being protected from spambots. You need JavaScript enabled to view it.'

where mad='Ali'

 

-- ÖRNEK 23:

 

update musteri SET madres='Adıyaman' where mkod>5 AND msoyad LIKE '%an'

 

-- ÖRNEK 24:

 

update musteri set mail=This email address is being protected from spambots. You need JavaScript enabled to view it.' where not mail like '%@%'

 

-- ÖRNEK 25:

mail adresi NULL olanlara This email address is being protected from spambots. You need JavaScript enabled to view it.' adresini atayın

yaşı NULL olanları 25 yaşında yapın  ;-)

 

 

 

DELETE ile veri silme

 

Delete from tabloadı where koşul

 

-- ÖRNEK 26:

 

Delete from musteri where mtel LIKE '%7'

 

-- ÖRNEK 27:

 

delete from musteri

 

------ SELECT ÖRNEKLERİ ------

 

-- ÖRNEK 28:

 

select * from products

 

-- ÖRNEK 29:

 

select orderID, shipname from orders

 

-- ÖRNEK 30:

 

SELECT orders.Shipname, customers.city from orders, customers

 

--ÖRNEK 31:

select UnitPrice,ProductID from products where ProductID>10

 

--ÖRNEK 32:

select * from orders

 

select shipName, orderID from orders

where orderID >10500 and orderID <10600

 

veya

 

select shipName, orderID from orders

where orderID Between (10500 and 10600)

 

-- ÖRNEK 33:

 

select * from customers where city LIKE 'London'

 

veya

 

SELECT * FROM Customers WHERE city='London'

 

veya

 

SELECT * FROM Customers WHERE city IN 'London'

 

 

-- ÖRNEK 34:

 

select * from customers where city='Madrid' OR region is NULL

 

-- ÖRNEK 35:

 

select customerID, address from customers where  address LIKE '%er%'

 

-- ÖRNEK 36:

 

select * from customers where customerID LIKE 'FR%'

AND country IN ('Italy','Germany')

 

-- ÖRNEK 37:

 

select * from customers where customerId LIKE 'N_R%'

 

-- ÖRNEK 38:

 

select * from customers where country='Germany' OR country='Italy'

 

--ÖRNEK 39:

 

select * from orders where customerId != 'VINET'

 

veya

 

select * from orders where customerId<>'VINET'

 

veya

 

select * from orders where customerId not like 'VINET'

 

veya

 

select * from orders where not customerId like 'VINET'

 

--ÖRNEK 40:

 

select address,phone,city from customers where phone like '0%5'

AND city<>'London'

 

veya

 

select address,phone,city from customers where phone like '0%'

and phone like '%5' and city not like 'London'

 

                 

------ distinct: tekrarlı satırları önlemek ------

 

-- ÖRNEK 41:

 

select distinct madres from musteri

 

------ Order By ile sıralama – ASC(Default), DESC  ------

 

select * from tabloadı order by referanssütun ASC --(artan)

 

veya

 

select * from tabloadı order by referanssütun  -- (artan)

 

-- ÖRNEK 42:

 

select * from musteri order by myasi

 

-- ÖRNEK 43:

 

select * from musteri order by 3 DESC

 

-- ÖRNEK 44:

 

select mkod,mad,msoyad from musteri order by 3 DESC

 

 

------ order by ile birden fazla referans sütuna göre listeleme ------

 

-- ÖRNEK 45:

 

select * from musteri order by myasi,madres DESC

 

-- ÖRNEK 46:

 

select * from customers order by country ASC,contactname DESC

 

-- ÖRNEK 47:

 

select * from customers order by 9 ASC,3 DESC

 

 

------ sütunlar için takma isim kullanma (AS) ------

 

-- ÖRNEK 48:

 

select companyname AS "şirket",city AS "şehir" from customers

 

veya

 

select companyname "şirket",city AS "şehir" from customers

 

veya

 

select companyname ‘şirket’,city AS "şehir" from customers

 

 

-- ÖRNEK 49:

select mad "AD", myasi+5 "YENI YAŞ",mail from musteri

 

-- ÖRNEK 50:

 

select mad 'AD', msoyad "SOYAD",myasi*0.5 "YARIM" from musteri

 

-- ÖRNEK 51:

 

select mad 'AD', msoyad "SOYAD",(myasi/2)+3 "YARIM" from musteri

 

-- ÖRNEK 52:

 

select mad 'AD', msoyad "SOYAD",myasi+((myasi*50)/100) "ZAMLI YAŞ"

from musteri

 

-- ÖRNEK 53:

 

select mad+'     '+msoyad AS "BILGILER" from musteri

 

-- ÖRNEK 54: (msoyad artan olsun)

 

select * from musteri

where myasi>=23 AND myasi<=28 AND madres='Ağrı' AND mkod>2 order by 3  

 

-- ÖRNEK 55:

 

select madres from musteri where madres NOT IN ('Ağrı') order by 1 DESC

 

veya

 

select madres from musteri where madres!='Ağrı'

 

 

-- ÖRNEKLER 56:

 

create table urunler2(

urun_no int identity(1,1) not null,

urun_adi varchar(100),

urun_fiyati float,

constraint chkfiyatt CHECK (urun_fiyati>=0 AND urun_fiyati<=1000),

urun_adedi int,

constraint chkadet CHECK (urun_adedi>=0 AND urun_adedi<=100),

islem_tarihi smalldatetime,

sevk_adresi varchar(50))

 

 

insert into urunler2 values ('Salça',3.25,100,'07.01.2019','Izmir')

insert into urunler2 values ('Pirinç',5.75,100,'06.02.2019','Izmir')

insert into urunler2 values ('Bulgur',3.30,90,'05.03.2019','Afyon')

insert into urunler2 values ('Zeytin Yağı',24.75,85,'04.04.2019','Konya')

insert into urunler2 values ('Ayçiçek Yağı',17.25,99,'03.05.2019','Aksaray')

insert into urunler2 values ('Makarna',1.77,98,'02.06.2019','Hakkari')

insert into urunler2 values ('Şehriye',1.22,100,'01.11.2019','Bursa')

 

select 3*5,3+5

 

select 3*5 "ÇARPIM",3+5 AS "TOPLAM"

 

select urun_fiyati+(urun_fiyati*0.25) AS "Yeni Fiyat" from urunler2

 

select * from urunler2

 

 

-- ÖRNEK 57:

 

select SUBSTRING (urun_adi,2,3) AS 'Kısaltma' from urunler2

 

-- ÖRNEK 58:

 

select SUBSTRING(sevk_adresi,1,1)+'.'+urun_adi "A.Soyad" from urunler2

 

-- ÖRNEK 59:

 

select RIGHT (sevk_adresi,1)+'.'+urun_adi AS 'Ad Soyad' from urunler2

 

-- ÖRNEK 60:

 

select UPPER (sevk_adresi) from urunler2

 

-- ÖRNEK 61:

 

select LOWER (urun_adi), UPPER(sevk_adresi) "Adres" from urunler2

 

-- ÖRNEK 62:

 

select urun_adi,LEN(urun_adi) As "uzunluk1",

urun_adedi,LEN(urun_adedi) as "uzunluk2" from urunler2

 

 

-- ÖRNEK 63:

 

select urun_adi,REPLACE(urun_adi,'Salça','baharat') 'Yeni' from urunler2

 

-- ÖRNEK 64:

 

select REVERSE(urun_adi) as 'ters isim' from urunler2

 

-- ÖRNEK 65:

 

select ABS(-0.45) as mutlak

 

-- ÖRNEK 66:

 

select urun_adi,ROUND(urun_fiyati,1) as "yuvarlanmış" from urunler2

 

-- ÖRNEK 67:

select POWER (2,3) as "küp alma"

 

-- ÖRNEK 68:

 

select SQRT(64)

 

-- ÖRNEK 69:

 

select SUM(urun_adedi) 'Toplam Ürün' from urunler2

 

-- ÖRNEK 70:

 

select SUM(urun_fiyati) "Toplam" from urunler2

where islem_tarihi>='3.3.2019'

 

 

-- ÖRNEK 71:

 

select SUM(urun_adedi) "Toplam Ürün" from urunler2

where urun_no>2 AND urun_no<=7 AND sevk_adresi like '%a' OR sevk_adresi like '%i'

 

-- ÖRNEK 72:

 

select ROUND(AVG(urun_fiyati),2) as "ortalama fiyat" from urunler2

 

-- ÖRNEK 73:

 

select MAX(urun_Adedi),MIN(urun_fiyati) from urunler2

 

-- ÖRNEK 74:

 

select MAX(islem_tarihi) from urunler2

 

-- ÖRNEK 75:

 

select COUNT(urun_adi) as "Çeşit sayısı" from urunler2

 

-- ÖRNEK 76:

 

select COUNT(distinct sevk_adresi) from urunler2

 

 

DCL – veri kontrol dili

GRANT – DENY - REVOKE

 

 

GRANT: kullanıcının kayıt yapmasına ve SQL çalıştırmasına izin verir.

 

DENY: kullanıcıyı kısıtlar

 

REVOKE: izin ve kısıtlamaları kaldırır.

 

--Grant {ALL veya izinler} ON {izin alanı} TO {kullanıcılar}

--- On ifadesi tablo için kullanılır

---- veritabnı düzeyinde işlem için TO yeterli

 

-- veritabanı için: create database, create table, backup database, create view

--- tablo için: select, update, insert, delete

------- yordam için: execute

 

-- ÖRNEKLER 77:

 

GRANT select ON musteri TO taylan

 

GRANT ALL ON kiralama TO ergul, dogukan

 

grant create database TO ibrahim

 

-- ÖRNEK 78:

 

deny create table TO ali

 

-- ÖRNEKLER 79:

 

revoke update ON musteri FROM ali

 

revoke ALL from ali,veli

 

------ SERVER SEVİYESİ ROLLER ------

 

Bulkadmin: Bu role sahip kullanıcılar BULK INSERT deyimini çalıştırabilir. Genelde başka bir veri kaynağından ya da Excel’den veri çekme işlemleri için kullanılır.

Dbcreator: Bu role sahip olan kullanıcı herhangi bir veritabanı Create edebilir, Alter edip düzenleyebilir, Drop edebilir veya herhangi bir veritabanını Restore edebilir.

ServerRole

Permission

dbcreator

Add member to dbcreator

dbcreator

ALTER DATABASE

dbcreator

CREATE DATABASE

dbcreator

DROP DATABASE

dbcreator

Extend database

dbcreator

RESTORE DATABASE

dbcreator

RESTORE LOG

dbcreator

sp_renamedb

Diskadmin: Bu role sahip kullanıcılar disk dosyalarını yönetebilir.

ServerRole

Permission

diskadmin

Add member to diskadmin

diskadmin

DISK INIT

diskadmin

sp_addumpdevice

diskadmin

sp_diskdefault

diskadmin

sp_dropdevice

 

Processadmin: Bu role sahip kullanıcılar tüm processleri görebilir, yönetebilir ve Kill komutuyla istediği tüm processleri sonlandırabilir.

Public: Tüm SQL Server kullanıcıları, gruplarına vs. varsayılan olarak public rolü atanır. Bu rol ile sadece SQL Server’a bağlanabilir ancak herhangi bir işlem yapamaz.

Securityadmin: Bu role sahip kullanıcıların girişleri ve özelliklerini yönetir. GRANT, DENY ve REVOKE sunucu düzeyinde izinleri atayabilirler. Ayrıca GRANT, DENY ve REVOKE veritabanı düzeyinde izinleri de atayabilirler.  SQL Server girişleri için şifreleri sıfırlayabilirler ve SQL Server hesabı oluşturup silebilirler. Rol oluşturamazlar. Kısacası SQL Server login bilgilerini yönetir.

ServerRole

Permission

securityadmin

Add member to securityadmin

securityadmin

Grant/deny/revoke CREATE DATABASE

securityadmin

Read the error log

securityadmin

sp_addlinkedsrvlogin

securityadmin

sp_addlogin

securityadmin

sp_defaultdb

securityadmin

sp_defaultlanguage

securityadmin

sp_denylogin

securityadmin

sp_droplinkedsrvlogin

securityadmin

sp_droplogin

securityadmin

sp_dropremotelogin

securityadmin

sp_grantlogin

securityadmin

sp_helplogins

securityadmin

sp_password

securityadmin

sp_remoteoption (update)

securityadmin

sp_revokelogin

 

Serveradmin: Bu role sahip kullanıcılar sunucu genelinde yapılandırma seçeneklerini değiştirebilir ve sunucuyu kapatabilir.

ServerRole

Permission

serveradmin

Add member to serveradmin

serveradmin

dbcc freeproccache

serveradmin

RECONFIGURE

serveradmin

SHUTDOWN

serveradmin

sp_configure

serveradmin

sp_fulltext_service

serveradmin

sp_tableoption

 

Setupadmin: Bu role sahip kullanıcılar linked server ekleyebilir, kaldırabilir ve bazı sistem stored procedure lerini yürütebilir.

ServerRole

Permission

setupadmin

Add member to setupadmin

setupadmin

Add/drop/configure linked servers

setupadmin

Mark a stored procedure as startup

 

Sysadmin: En yetkin rolümüz system admindir. Bu role sahip kullanıcılar her işlemi gerçekleştirebilme yetkisine sahiptir. Bu yetkinin database adminleri dışında diğer kullanıcılarda bulunması önerilmez.

 

------ VERİTABANI SEVİYESİ ROLLER ------

 

db_owner: Veritabanı düzeyinde verilebilecek en kapsamlı roldür Bu role sahip kullanıcılar veritabanındaki tüm yapılandırma ve bakım etkinliklerini gerçekleştirebilir.

 

db_securityadmin: Bu role sahip kullanıcılar, yalnızca özel roller için rol üyeliğini değiştirebilir ve izinleri yönetebilir. Bu rolün üyeleri potansiyel olarak ayrıcalıklarını yükseltebilir ve eylemleri izlenmelidir.

 

DbFixedRole

Permission

db_securityadmin

DENY

db_securityadmin

GRANT

db_securityadmin

REVOKE

db_securityadmin

sp_addapprole

db_securityadmin

sp_addrole

db_securityadmin

sp_addrolemember

db_securityadmin

sp_approlepassword

db_securityadmin

sp_changeobjectowner

db_securityadmin

sp_dropapprole

db_securityadmin

sp_droprole

db_securityadmin

sp_droprolemember

 

db_accessadmin: Bu role sahip kullanıcılar, Windows oturum açma işlemleri, Windows grupları ve SQL Server oturum açma işlemleri için veritabanına erişim ekleyebilir veya bu veritabanına erişimi kaldırabilir.

 

DbFixedRole

Permission

db_accessadmin

sp_dropuser

db_accessadmin

sp_grantdbaccess

db_accessadmin

sp_revokedbaccess

 

db_backupoperator: Bu role sahip kullanıcılar, veritabanını yedekleyebilir.

 

db_ddladmin: Bu role sahip kullanıcılar, bir veritabanındaki herhangi bir Veri Tanımlama Dili (DDL) komutunu çalıştırabilir.

 

db_datawriter: Bu role sahip kullanıcılar, tüm kullanıcı tablolarındaki verileri ekleyebilir, silebilir veya değiştirebilir.

 

DbFixedRole

Permission

db_datawriter

DELETE permission on any object

db_datawriter

INSERT permission on any object

db_datawriter

UPDATE permission on any object

 

db_datareader: Bu role sahip kullanıcılar, tüm kullanıcı tablolarından tüm verileri okuyabilir.

 

------ TRANSACTION ------

 

Bir veya daha fazla SQL ifadesinden meydana gelen  tek bir işlemdir. SQL ifadesi bir bütün olarak düşünülür, parçalara ayrılmaz. Ya hep ya hiç mantığıyla çalışır.

  • Uzun tansaction ifadeleri SAVEPOINT noktaları ile kendi içinde parçalara ayrılabilir.
  • Select gibi, İç içe transactionlar kullanılabilir.
  • Tek başına kullanımı çok fazla avataj sağlamaz ancak STORED PROCEDURE ve programlama ifadeleri (T-SQl, PL/SQL) ile kullanımı hatta hata denetimli kullanımı daha verimli olacaktır.

 

Update hesaplar set bakiye=bakiye-1453 where hesap_no=1071

 

Update hesaplar set bakiye=bakiye+1453 where hesap_no=1072

 

 

Commit: Gerçekleşen işlemi veritabanına kalıcı olarak işler

Rollback: Yapılan işlemleri geri alır.

Transaction Log: Trancastion ile yapılan işlemleri sırası ile kaydeder.

 

Mssql server veritabanlarında BEGIN TRANSACTION ile başlar

Mysql veritabanlarında START TRANSACTION ile başlar

 

-- ÖRNEK 80:

 

Begin transaction

Update Customers set ContactName='Ali' Where City='London'

update Customers set City='Izmir' where ContactName='ali'

select * from Customers where City='Izmir'

Rollback

---------------

SAVE TRANSACTION noktaismi

 

COMMIT / ROLLBACK TRANSACTION noktaismi

 

-- ÖRNEK 81:

 

Begin transaction

     Save transaction point1

Update Customers set ContactName='veli' Where City='Izmir'

update Customers set City='Londra' where ContactName='veli'

select * from Customers where City='Londra'

     Rollback transaction point1

Update Customers set Country='Türkiye' Where City='London'

select * from Customers   

     Rollback

 

 

------ t-SQL Değişken Tanımlama ------

 

yerel değişken önüne @ işareti konur.

 

declare @sayi int

 

declare @karakter varchar(15)

 

declare @sayi int, @karakter varchar(15)

 

set/select @degisken=atanan_deger

 

-- ÖRNEK 82:

 

declare @sayi1 int, @sayi2 int, @toplam int

set @sayi1=10

set @sayi2=20

set @toplam=@sayi1+@sayi2

select @toplam as TOPLAM

 

-- ÖRNEK 83:

 

select * from kitap

 

declare @pahali money

select @pahali=max(fiyat) from kitap

select @pahali as "En Yuksek Fiyat"

 

------ SISTEM FONKSIYONLARI ------

 

Veritabanına bağlantı kuran her bir kullanıcıya özel değişkenlere YEREL DEGISKEN denir. Tüm kullanıcılar için geçerli olan işlemler için de SISTEM FONKSIYONLARI kullanılır.

DB server hakkında bilgi almak için kullanılan fonksiyonlardır.

 

sistem fonksiyonlarının önüne @@ işareti konur. Yerel değişkenleri kullanıcılar tanımlar, sistem fonksiyonları ise SQL SERVER tarafından tanımlanmıştır.

 

@@error, @@servicename, @@servername, @@version, @@language, @@langid, @@max_connections, @@datefirst, @@rowcount, @@idle (cpu boş kalma süresi milisaniye),

 

-- ÖRNEK 84:

 

select 10/0

select @@ERROR

 

----- Sql server'da tanımlı hata mesajı kodları ve anlamları:

 

-- ÖRNEK 85:

 

select * from sys.messages

 

Bunlar master veritabanında tanımlı view dir.

 

view: sorguları basitleştirmek, erişim izinlerini düzenlemek,

farklı sunuculardaki eşdeğer verileri karşılaştırmak veya

bazı durumlarda sorgu süresini kısaltmak için kullanılan,

gerçekte olmayan Select ifadeleri ile tanımlanmış sanal tablolardır

 

-- ÖRNEK 86:

 

select 10/0

select * from master.dbo.sysmessages where error=@@ERROR

 

-- ÖRNEK 87: sql serverin sistem üzerindeki ismi:

 

select @@SERVICENAME

 

-- ÖRNEK 88: sql serverin local serverdeki ismi

 

select @@SERVERNAME

 

-- ÖRNEK 89: sql server versiyonu

 

select @@VERSION

 

-- ÖRNEK 90: sql serveri kulanmış olduğu dil

 

select @@LANGUAGE as 'Kullanılan Dil'

 

-- ÖRNEK 91: dilin kodu

 

select @@LANGID

 

-- ÖRNEK 92: servera izin verilen max bağlantı sayısı

 

select @@MAX_CONNECTIONS

 

-- ÖRNEK 93: işlemden etkilenen kayıt sayısı

 

delete from personel where adi like '%a'

select @@ROWCOUNT

 

------ GO ILE YIĞIN YÖNETIMI ------

 

SQL serverda aynı anda birden fazla SQL ifadesi kullanılabilir.

Bunun için yığın (batch) yapılır. Kod parçalarının sonuna GO yazılarak yığın sonlandırılır.

tanımlanan değişken kendi yığınında geçerlidir

 

 

T-SQL ifadeler

...

GO -- YIĞIN 1

T-SQL ifadeler

....

GO -- YIĞIN 2

 

-- ÖRNEK 94:

 

declare @deger int

set @deger=20

go

select @deger

 

------ PRINT ifadesi ile ekrana mesaj yazdırma ------

 

--ÖRNEK 95:

 

select 'deneme deneme'

 

print 'deneme deneme'

 

-- ÖRNEK 96:

 

declare @sayi1 int, @sayi2 int, @toplam int

set @sayi1=10

set @sayi2=20

set @toplam=@sayi1+@sayi2

print 'Toplam'

print '------'

print @toplam

 

------ TABLO TIPI DEĞIŞKENLER ------

 

declare @degiskenismi TABLE (değişken1 veritipi, değişken2 veritipi)

 

-- ÖRNEK 97:

 

declare @personel table(

no int identity(1,1),

adsoyad varchar(50) not null,

telefon varchar(15))

insert into @personel values ('Ali Can','3579')

insert into @personel values ('Veli Koş','2468')

select * from @personel order by adsoyad

 

-- ÖRNEK 98:

 

select * from kitap

 

declare @yazar table(yazar_no int)

insert into @yazar values (2)

insert into @yazar values (4)

insert into @yazar values (6)

 

select yazar_adi,yazar_soyadi from kitap

where ktp_id IN (select * from @yazar)

 

------ OUTPUT işlemi ------

 

@@rowcount ile etkilenen kayıtların sayısı bulunurken output ile bu kayıtların hangileri olduğu

bilinebilir ve istenen bir tabloya aktarılabilir.

 

inserted --> insert, update

deleted --> delete, update

 

output alınacak_sütunlar into aktarılacak_yer

 

 

-- ÖRNEK 99:

 

declare @eklenenler table(

ad varchar(25),

soyad varchar(25),

fiyat money)

 

insert into kitap output inserted.yazar_adi, inserted.yazar_soyadi,inserted.fiyat

into @eklenenler values (11,'veri tabanı',455,35,250,'ali','cancan')

 

select * from @eklenenler

 

-- ÖRNEK 100:

 

declare @silinenler table(

ad varchar(25),

soyad varchar(25),

fiyat money)

 

delete from kitap output deleted.yazar_adi, deleted.yazar_soyadi,deleted.fiyat

into @silinenler where ktp_id>10

 

select * from @silinenler

 

------ IF ...ELSE Yapısı  ------

 

if ile belirtilen koşul gerçekleşirse TRUE değeri döner ve if içideki kod bloğu çalışır,

koşul sağlanmazsa eğer ELSe varsa else içi kodlar çalışır. Yoksa hiçbir şey olmaz.

 

if içinde parantez içinde SELect kullanılabilir, sorgudan tek değer dönmelidir.

 

çalıştırılacak kodlar birden fazla ise BEGIN-END arasına yazılmalıdır.

 

--

IF koşul

     koşula bağlı kodlar

ELSE IF koşul

     koşula bağlı kodlar

..

ELSE

     kodlar

 

 

-- ÖRNEK 101:

 

IF EXISTS (select * from kitap where ktp_id>10)

     PRINT 'Kayıt sayısı 10 dan fazladır'

ELSE

     select ktp_id,ktp_adi from kitap where ktp_id<=10

    PRINT 'Kayıt sayısı 10 veya 10 dan azdır'

 

 

-- ÖRNEK 102:

declare @ktp_sayisi varchar(20)

select @ktp_sayisi=COUNT(*) from kitap

 

if (@ktp_sayisi<=5)

begin

     print 'Kitap sayısı: '+ @ktp_sayisi

     print 'Kitap sayısı az'

end

 

else if (@ktp_sayisi>5 and @ktp_sayisi<=10)

begin

     print 'Kitap sayısı: '+ @ktp_sayisi

     print 'Yeni kitaplar gerekli'

end

 

else

begin

     print 'Kitap sayısı: '+ @ktp_sayisi

     Print 'Kitap sayısı yeterli'

end

    

 

------ CASE... WHEN THEN Yapısı ------

 

Birden fazla koşul gerektiren durumlarda if-else yerine kullanılır.

 

Örneğin cinsiyet sütunundan 1-0 değerleri dönüyorsa, 1 yerine erkek, 0 yerine

 

--1

case kontrol_edilecek_değer

     when aldığı_değer1 then sonuç1

     when aldığı_değer2 then sonuç2

     ..

     ELSE sonuç_n

end

 

--2

case

     when karşılaştırma1 then sonuç1

     when karşılaştırma2 then sonuç2

     ..

     else sonuç_n

end

 

 

-- ÖRNEK 103:

 

select * from kitap order by fiyat

 

15den küçük BEDAVA

15-20 UCUZ

20-30 NORMAL

30dan büyük PAHALI

 

select ktp_adi,sayfa_sayisi, fiyat, 'GÖRÜŞ'=

case

     when fiyat>30 then 'PAHALI'

     when fiyat>20 and fiyat<30 then 'NORMAL'

     when fiyat>15 and fiyat<20 then 'UCUZ'

     ELSE 'BEDAVA'

end

from kitap

 

 

::--::--::--:: WHILE döngüsü BREAK, CONTINUE yapısı ::--::--::--::

 

Koşul sağlandığı sürece (True değeri sağlandıkça) kod/kodlar çalıştırılır.

 

WHILE koşul

BEGIN

     kodlar

END

 

Tekrarlanması istenen işlem tek komutsa Begin-End olmasa da olur.

Break      : istenilen işlem basamağında döngüden çıkar

Continue   : bulunulan işlem basamağını atlayıp sonraki basamaktan devam eder

 

CAST – CONVERT: String ile diğer veri tiplerini birleştirme/dönüştürme

 

select 5 + 5

 

select 5 +'3'

 

select '5'+'5'

 

select '5'+'B'

 

select 5+'B'  ("VarChar tipindeki B değeri int tipine dönüştürülmeye çalışılırken hata alındı")

 

-Kullanım Şekilleri:

 

CAST(deger AS yeniVeriTipi)


CONVERT(yeniVeriTipi, deger)

 

 

-- ÖRNEK 104 : 

1den 5e kadar sayıların karesi

 

declare @sayac int

SET @sayac=1

 

While @sayac<=5

Begin

     Print cast(@sayac as varchar(10))+ ' karesi : '+

     cast (@sayac*@sayac as varchar(10))

     SET @sayac=@sayac+1

End

    

    

-- ÖRNEK 105:

Kitap fiyatlarının ortalaması 25TL veya üzeri olana kadar kitap fiyatlarını %5 artıralım

 

select * from kitap

 

select 'ortalama fiyat =' +CAST(avg(fiyat) as varchar(20)) from kitap

while (select avg(fiyat) from kitap)<=25

Begin

     update kitap set fiyat=fiyat*5/100+fiyat

     select ktp_adi, fiyat from kitap

End

Select 'Yeni Fiyat ='+ CAST(avg(fiyat) as varchar(20)) from kitap

    

 

 

-- ÖRNEK 106:

1den 10e kadar sayıların karesi 8 hariç (break komutu)

 

declare @sayac int

SET @sayac=1

 

While @sayac<=10

Begin

     if @sayac=8

     Begin

     set @sayac=@sayac+1

     BREAK

     end 

Print cast(@sayac as varchar(10))+ ' karesi : '+

cast (@sayac*@sayac as varchar(10))

SET @sayac=@sayac+1

End

 

::--::--::--::  GOTO ::--::--::--::

koşulsuz dallanma için kullanılır

 

Etiket:

..

goto etiket

 

::--::--::--::  RETURN ::--::--::--::

koşulsuz olarak kodların çalışmasını sonlandırır.

 

::--::--::--::  WAITFOR ::--::--::--::

 

Delay : belirlenen zamana kadar erterler çalışmayı

Time : belirlenen zamanda kodları çalıştırır.

 

 

-- ÖRNEKLER 107:

 

waitfor time '18:45:00' kodlar 18:45 te çalışır

 

waitfor delay '18:45:00'  kodlar 18 saat 45dk sonra çalışır

 

waitfor delay '00:00:20'

select * from kitap

 

::--::--::--::  STORED PROCEDURE (YORDAMLAR) ::--::--::--::

 

System Stored Procedure

Extended Stored Pr.

Local Stored Pr.

 

::--::--::--::  1- SYSTEM stored procedure ::--::--::--::

 

sp_ ön eki ile tanımlı olan procedurler

 

 

-- ÖRNEK 108:

select * from sys.messages

 

sp_addmessage 50001,16,'Otomatik artan sütun için değer girilmiş'

 

50001 hata koduna ve 16 öncelik değerine sahip yeni bir  hata tanımlandı.

 

-- ÖRNEK 109:

 

sp_addmessage 50001, 16, 'hello', @with_log = true, @replace = 'REPLACE'

 

-- ÖRNEK 110:

 

sp_addtype sayisal,int,'null'

 

aktif veri tabanı için sayısal isminde ve int türünde yeni veri türü eklenir

 

-- ÖRNEK 111:

sp_configure 'user options',10

 

sql servera aynı anda bağlanacak kullanıcı sayısı

 

-- ÖRNEK 112:

sp_configure 'remote access',0

 

uzaktan bağlantı kuran kullanıcıların Local procedureleri kullanmasını engeller.

 

-- ÖRNEK 113:

 

sp_addlogin 'deneme5',12345

GO

sp_adduser 'deneme5','myo'

 

deneme5 oturum bilgisi ve myo kullanıcısı oluşturuluyor

 

::--::--::--::  3- LOCAL stored procedure ::--::--::--::

 

çalıştırmak için --> exec / execute

güncelleme için--> alter

silmek için--> drop

 

-- ÖRNEK 114:

 

use kutuphane

create procedure listele1

as

select * from kitap where yazar_adi like '%e%'

 

exec listele1

listele1

 

-- ÖRNEK 115:

alter procedure listele1

as

select * from kitap where yazar_adi like '%c%'

 

-- ÖRNEK 116:

drop procedure listele1

                   ---

-- ÖRNEK 117:

set nocount off / on

 

-- ÖRNEK 118:

create procedure listele2

as

select model,marka from arac a1 inner join

kiralama k1 on a1.tarih=k1.tarih

           

listele2

 

::- STORED PROCEDURE'LERDE ÇIKIŞ PARAMETRESİ KULLANMAK ::--::--::--::

 

Yordamlar istenilen işlemleri yaptıktan sonra elde ettiği sonucu yordamın çağrıldığı yere göndermek

için çıkış parametreleri kullanılır. (Yani yordamdan dönen değer)

Yordamlar geriye değer döndürmek için RETURN ve OUTPUT ifadelerini kullanır.

 

OUTPUT, yordamdan dönen değeri parametre olarak çağrıldğı yere gönderir. Yordam için yazılan

parametreler ve veri tiplerinden sonra OUTPUT ifadesi kullanılmalıdır. (--Bkz: ÖRNEK 119 ve 120)

 

 

-- ÖRNEK 119:

 

create procedure topla(@sayi1 int,@sayi2 int,@sonuc int output)

as

set @sonuc=@sayi1+@sayi2

 

declare @a int

exec topla 5,6,@a output

print @a

 

-- ÖRNEK 120:

 

create procedure carpim(@s1 int,@s2 int,@s3 int,@sonuc int output)

as

set @sonuc=@s1*@s2*@s3

print 'Sonuç= '+cast(@sonuc as varchar(5))

 

declare @a int

exec carpim 3,4,5,@a output

 

 

-- ÖRNEK 121:

 

select * from kitap

 

create procedure kitapbul(@yazar varchar(25))

as

select * from kitap where yazar_adi=@yazar

 

kitapbul 'Cemil'

 

-- ÖRNEK 122:

 

create procedure kitap_ekle(

@id int,

@kitap_adi varchar(30)=NULL)

 

declare @ktp_id int

set @ktp_id=NULL

select @ktp_id=ktp_id from kitap where ktp_adi=@kitap_adi

 

if @kitap_adi is null or @id is null

     RETURN 0

else if @ktp_id is null or not exist(select * from kitap where ktp_id=@id)

begin

print 'Belirtilen kitap bulunamadı'

return 0

end

 

else if exist(select * from kitap where ktp_id=@id and ktp_adi=@kitap_adi)

update kitap set ktp_id=ktp_id+1 where ktp_adi=@kitap_adi and ktp_id=@id

else

insert into kitap values (@kitap_id,@kitap_adi,1)

 

 

::--::--::--::  KULLANICI TANIMLI FONKSIYONLAR ::--::--::--::

 

Standart tanımlı fonksiyonlar--> sum, max, count...

 

K.T.F lar 1 veya daha fazla değeri (tablo) geri döndürebilir.

Yordamlarda olduğu gibi dışarıdan, birden fazla değer alabilir.

 

KTF’lar view ve procedure lere benzer ama çok farklıdır.

 

Örneğin view dışarıdan değer almaz ama fonksiyonlar değer alır.

Veya fonksiyon  ve procedure değer alır ve geri döndürebilir ama fonksiyonlar SQL ifadeleri içinde yer alabilirken  yordamlar kullanılamaz (istisnaslar var)

 

 

 

 

::--::--::--::  SCALAR-VALUED FUNCTION::--::--::--::

 

 Geriye tek değer döndüren fonksiyonlar (Getdate() gibi)

 

 READONLY: /*fonksyiona gelen değerin fonksiyon içerisinde değiştirilmesini önler.

 Yani gelen değerin sadece okunabilir olmasını sağlar. */

 

 RETURNS: --skaler fonksiyondan dönecek değerin veri tipini belirler

 

 WITH ENCRYPTION dönen bilgiyi gizler / WITH SCHEMABINDING tablolardaki yapısal

 değişikliği önler

 

 

-- ÖRNEK 123:

 

create function buyuk_harf(@gelen varchar(max))

Returns varchar(max)

AS

Begin

     Return UPPER(@gelen)

End

 

--test

select dbo.buyuk_harf(ktp_adi),yazar_adi from kitap

 

 

-- ÖRNEK 124:

 

girilen soyada göre kitap adedi

 

create function top_fiyat(@gelen_soyad varchar(max))

returns int

as

begin

     declare @toplam int

     select @toplam=SUM(fiyat) from kitap where yazar_soyadi=@gelen_soyad

     return @toplam

end

 

--test-1

select dbo.top_fiyat('Meriç')

 

--test-2

select dbo.top_fiyat('pala')

 

 

::--::--::--::  TABLE-VALUED FUNCTIONS ::--::--::--::

 

Geriye tablo içeriği döndüren fonksyionlar

Bu tür fonksiyonlarda begin-end bloğuna gerek yoktur

 

ANCAK Multistatement Table-Valued Functions olursa bunlarda begin-end gerekli.

(Çoklu ifade ile tablo sonuçlu fonksiyonlarda geri döndürülecek tablo sonucu

fonksiyon içerisinde düzenlenebilir)

 

 

-- ÖRNEK 125:

belirtilen sayfa sayısından daha fazla sayfası olan kitapları listele

 

-- select * from kitap where sayfa_sayisi>250

 

create function kitap_sayfa(@sayfa int)

returns table

as

return (select * from kitap where sayfa_sayisi>@sayfa)

 

--test

select ktp_adi from dbo.kitap_sayfa(350)

 

 

::--::--::--::  CURSOR (IMLEÇ) KULLANIMI  ::--::--::--::

 

Imleç hangi satırda ise o satırda işlem yapılmasını sağlar. Yani elde edilen kayıt kümesinde satır satır işlem yaptırır.

 

SQL serveri aşırı derecede yavaşlattığı için veritabanlarında tavsiye edilmez. Bunlar yerine fonksiyonlar veya procedurler kullanılmalıdır.

 

T-SQL veri tipi olarak tanımlanmıştır ve SELECT ile birlikte kullanılır.

 

-- Kullanım Şekli

 

DECLARE imleç_ismi CURSOR

[forward_only / scroll] -- imleç türleri

[static / keyset / dynamic / fast_forward] -- imleç türleri

[read_only / scroll_locks / optimistic] -- imleç türleri

FOR select ifadesi

 

 

OPEN imleç_ismi -- veri kümesinde gezinmek için

fetch next      : bir sonraki satıra geçer

fetch prior     : bir önceki satıra geçer

fetch last      : en son satıra geçer

fetch first     : ilk satıra geçer

fetch absolute n: n.satıra geçer

fetch relative n: son gidilen satırdan n satır sonraya geçer

CLOSE --veri kümesinde yapılacak işlemler bitince kapatılır

 

Not: kapatılan imleç hafızadan silinmez. DEALLOCATE ile sil.

 

  

::--::--::--::  TRIGGER (TETIKLEYICI) KULLANIMI ::--::--::--::

 

Bir işlem gerçekleştiğinde başka bir işlemin yapılması istendiğinde kullanılır.

insert, update, delete için olur ama select tabloda değişiklik yapmadığı için olmaz

 

Tetikleyici ve gerçekleşen işlem transaction olarak kabul görür. Işlemi reddetmek yani geri almak için ROLLBACK kullanılır. Işlemi onaylamak için bir şey yapmaya gerek yoktur.

 

--3 tür trigger var:

1-DDL tetikleyiciler

2-DML tetikleyiciler

3-Logon tetikleyiciler (SQL Server 2005 SP2 ile kullanılabilir)

 

::--::--::--::  DDL TRIGGERS ::--::--::--::

 

Create trigger triggerismi

ON (ALL SERVER / DATABASE)

[WITH ENCRYPTION]

(FOR / AFTER)

(create / alter / drop/grant/deny/revoke)

AS

(sql ifade)

 

-- FOR sonrası ifade _ (alt çizgi) ile yazılır

create_table / alter_table / drop_function / create_funtion

 

 

-- ÖRNEK 126:

 

create trigger silme_engeli

ON DATABASE

FOR DROP_TABLE

AS

BEGIN

Print 'Tablo silme işlemi yasaktır'

END

 

--test

drop table urunler

 

 

 

-- ÖRNEK 127:

 

create trigger silme_ikaz

on database

for drop_table,alter_table

AS

BEGIN

declare @mesaj Varchar(max)

Set @mesaj='araba1x veritabanın elden gidiğğğ' +

select EVENTDATA().value('(/event_instance/tsqlcommand/commandtext)[1]','nvarchar(max)')

exec xp_sendmail This email address is being protected from spambots. You need JavaScript enabled to view it.',@mesaj

end

 

Not: Gerçekleşmesi için SQL mailin (database mailin) kurulu olması gerek

 

 

-- ÖRNEK 128:

 

create trigger db_engeli

on all server

for create_database

as

     print 'Veritabanı oluşturmaya izin verilmiyor'

     ROLLBACK

GO

 

 

--test

create database denedene

 

 

::--::--::--::  DML TRIGGERS ::--::--::--::

 

Tablo ya da view üzerinde insert,update,delete işlemleri gerçekleşince

devreye girerler. AFTER (FOR) ya da INSTEAD OF türünde olabilirler.

 

AFTER Tetikleyiciler: ilgili işlem gerçekleştikten sonra devreye girer.

insert,update,delete sonrası işlemler için oluşturulabilir.

SADECE tablolar için tanımlanabilirler.

 

INSTEAD OF Tetikleyiciler: belirlenen işlem gerçekleşeceği sırada

devreye girerler. Mesela yeni kayıt eklerken girilen bilginin kontrolü...

 

DML tetikleyiciler gerçekleşen işlemleri kontrol etmek için inserted/deleted geçici tablolarını kullanır. Tablodaki etkilenen sütunlarla aynı bilgilere sahiptirler.

 

 

--Kullanım Şekli:

create trigger trigger_ismi

on (table/view)

[with encryption]

(for / after / instead of)

(insert / update / delete)

AS (sql ifadesi)

 

--NOT:

Tetikleyici içerisinde alter database, create database, drop database,

disk resize, load database, load log, restore database, restore log

ifadeleri kullanılamaz

 

 

-- ÖRNEK 129:

create trigger kontrol

on kitap

for insert

as

declare @kitap_adi varchar(255)

select @kitap_adi=ktp_adi from inserted

if exists(select * from kitap where ktp_adi=@kitap_adi)

begin

     print 'Aynı isimde kitap var zaten'

     rollback

end

 

--test

select * from kitap

insert into kitap values (15,'Şah ve Sultan',200,20,20,'cemil','meriç')

 

::--::--::--::  Tetikleyiciler Hakkında Bilgi Alma ::--::--::--::

Bu iş için çeşitli system procedurleri var:

 

sp_helptext: tetikleyicinin içeriğini gösterir

(with_encryption kullanılmamışsa)

 

-- ÖRNEK 130:

sp_helptext kontrol

 

sp_helptrigger: tablo üzerinde tanımlı tetikleyicileri gösterir

 

-- ÖRNEK 131:

sp_helptrigger kitap

 

sp_depends: tetikleyicinin etkilediği sütun ve tablo bilgilerini verir

 

-- ÖRNEK 132:

sp_depends kontrol

 

::--::--::--::  INSERT Tetikleyiciler ::--::--::--::

 

-- ÖRNEK 133:

Bir alşveriş sitesinin veritabanındaki URUNLER tablosu verilmiştir.

Ayrıca müşterilerin almış olduğu ürünler

SATISLAR (urun_kodu,miktar,musteri,tarih) tablosunda ve

firmanın aldığı ürünler ALIMLAR (urun_kodu,miktar, cari,tarih)

tablosunda tutulmaktadır.

 

Ürün satışı olunca satılan ürün miktarı URUNLER tablosunun toplam

miktarından düşülmeli, alım yapıldığında alım miktarı URUNLER

tablosunun miktarına eklenmelidir. Ayrıca satışı yapılan miktar

ürün miktarından fazla ise satışa izin vermeyecek tetikleyici oluştur.

 

 

 

create table urunler(

urun_kodu int identity(1,1) primary key,

urun_adi nvarchar(50),

fiyat money,miktar bigint)

 

create table satislar(

urun_kodu int, miktar bigint,

musteri nvarchar(50),tarih smalldatetime)

 

create table alimlar(

urun_kodu int,miktar bigint,

cari nvarchar(50), tarih smalldatetime)

 

--

insert into urunler values ('A',15,150)

insert into urunler values ('B',50,80)

insert into urunler values ('C',25,125)

 

--ALIMLAR tablosu için trigger

 

create trigger stok_kontrol

on alimlar

after insert

as

declare @a_miktar bigint

declare @u_kod int

     select @a_miktar=miktar,@u_kod=urun_kodu from inserted

     update urunler set miktar=miktar+@a_miktar

     where urun_kodu=@u_kod

    

--test

 

insert into alimlar values (1,5,'C1','01.01.2021')

go

select * from urunler

go

    

--SATIŞLAR tablosu için trigger

create trigger stok_kontrol_satis

on satislar

after insert

as

declare @satis_miktar bigint

declare @stok_miktar bigint

declare @u_kod int

 

select @satis_miktar=miktar, @u_kod=urun_kodu from inserted

select @stok_miktar=miktar from urunler where urun_kodu=@u_kod

 

if (@satis_miktar>@stok_miktar)

begin

     print 'Yetersiz stok miktarı'

     rollback

end

else

     update urunler set miktar=miktar-@satis_miktar where urun_kodu=@u_kod

    

--test1:

 

insert into satislar values (2,10,'M1','01.01.2021')

go

select * from urunler

go

 

--test2:  

insert into satislar values (2,75,'M1','01.01.2021')

go

select * from  alimlar urunler

go

 

::--::--::--::  DELETE Tetikleyiciler ::--::--::--:: 

Bir tablodan satır silinince devreye girerler. Silinen satırlar DELETED

geçici tablosunda tutulduğu için kontroller bu tablo üzerinden yapılır.

TRUNCATE ile silinenler bu tabloya yansımayacağı için ROLLBACK kullanılır.

 

ON DELETE CASCADE kulanılmışsa bu tetikleyiciye gerek yok.(BKZ: ÖRNEK11 ve ÖRNEK12)

 

Tablolar arası referans ilişki varsa çalışmaz. Önce referans ilişkiler kaldırılmalı.

 

-- ÖRNEK 134:

URUNLER tablosunda tanımlı urun_kodu bilgisi

ALIMLAR ve SATIŞLAR tablolarında da kullanılmaktadır.

 

URUNLER tablosundan silinen ürünün ürün kodunu bularak

diğer tablolarda da silen tetikleciyi yazın.

 

 

create trigger urun_kodu_sil

on urunler

after delete

as

declare @urun_kod int

if @@ROWCOUNT>0

begin

     select @urun_kod=urun_kodu from deleted

     delete from alimlar where urun_kodu=@urun_kod

     delete from satislar where urun_kodu=@urun_kod

end

 

-- test

select * from urunler

select * from alimlar

select * from satislar

 

delete from urunler where urun_kodu=1

 

::--::--::--::  UPDATE Tetikleyiciler ::--::--::--::

 

Bir tablonun içerdiği satırlar üzerinde değişiklik yapıldığında

devreye girmektedir. Update işlemi için hem INSERTED hem de

DELETED geçici tabloları kullanılır. Güncellenen satırın eski

durumu DELETED tablosunda, yeni durumu INSERTED tablosunda yer alır.

 

Update tetikleyiciler özellikle birbiriyle ilişkili tablolardaki

güncellemelerde kullanılır.

 

Update tetikleyici herhangi bir sütunda güncelleme yapıldığında

devreye girmektedir. Eğer BELIRLI SÜTUNLARDA yapılan güncellemeler

için işlem yapılması isteniyorsa IF UPDATE(sütun_ismi) kullanılır.

 

-- ÖRNEK 135:

/*KITAPLAR talosundaki ISBN bilgisi değiştirildiğinde ilişkili olduğu

tablolarda da ISBN bilgisini değiştirecek tetikleyicinin yazılması.*/

 

Create Trigger ISBN_guncelle

ON Kitaplar

After Update

AS

Declare @eski_ISBN varchar(255)

declare @yeni_ISBN varchar(255)

IF @@ROWCOUNT>0

begin

--IF UPDATE(ISBN)

--BEGIN

     select @eski_ISBN=ISBN from deleted

     select @yeni_ISBN=ISBN from inserted

     update kategori set ISBN=@yeni_ISBN where ISBN=@eski_ISBN

     update yazarlar set ISBN=@yeni_ISBN where ISBN=@eski_ISBN

end

--END

 

/*Yazılan trigger kitaplar tablosunda yapılan tüm güncellemeler

için çalışacaktır. Sadece ISBN bilgisinin güncelleştirmesinde

tetikleme yapmak için IF UPDATE (ISBN) ifade kullanılmalı.*/

 

Create Trigger ISBN_guncelle

ON Kitaplar

After Update

AS

Declare @eski_ISBN varchar(255)

declare @yeni_ISBN varchar(255)

IF @@ROWCOUNT>0

begin

IF UPDATE(ISBN)-- ilave satır

BEGIN --ilave satır

     select @eski_ISBN=ISBN from deleted

     select @yeni_ISBN=ISBN from inserted

     update kategori set ISBN=@yeni_ISBN where ISBN=@eski_ISBN

     update yazarlar set ISBN=@yeni_ISBN where ISBN=@eski_ISBN

END --ilave satır

end

 

 

::--::--::--::  INSTEAD OF Tetikleyiciler ::--::--::--::

 

Bu tetikleyiciler insert,delete ve UPDATE işlemleri tabloya

yansıtılmadan önce ve constraint ifadeler devreye girmeden

önce tetiklenir. Ama tablo üzerinde yapılan değişiklikler

INSERTED ve DELETED geçici tablolarına yansır. Tablodaki

değişiklik öncesi yapılacak işlemler için kullanılır.

 

AFTEr tetikleyicilerde olduğu gibi CASCADE UPDATE / DELETE

türü ilişkiler varsa tetikleyiciler çalışmaz.

 

 

::--::--::--::  Tetikleyicinin Düzenlenmesi ::--::--::--::

 

-- ÖRNEK 136:

(BKZ: ÖRNEK 125)

--db_engeli isimli tetikleyicinin güncellenmesi/düzenlenmesi

 

alter trigger db_engeli

on all server

for create_database

as

     print 'Veritabanı oluşturmak yasaktır'

     ROLLBACK

GO

 

-- SP_RENAME: sql server üzerinde tanımlı nesnelerin adını değiştirmek için kullanılan procedure, tetikleyici ismi değiştirmek için de kullanılır.

 

-- ÖRNEK 137:

--kontrol isimli tetikleyicinin kontrol_var olarak değiştirilmesi

 

exec sp_rename kontrol,kontrol_var

 

 

::--::--::--::  Tetikleyicinin Silinmesi ::--::--::--::

 

-- ÖRNEK 138:

--kontrol isimli tetikleyicinin silinmesi

 

drop trigger kontrol

  

-- ÖRNEK 139:

-- aktif veritabanındaki silme_engeli isimli tetikleyicinin silinmesi

 

drop trigger silme_engeli ON DATABASE

 

-- ÖRNEK 140:

--sql sunucudaki db_engeli isimli tetikleyicinin silinmesi

 

drop trigger db_engeli ON ALL SERVER

 

 

::--::  Tetikleyicinin Pasifleştirilmesi / Aktifleştirilmesi ::--::

 

-- ÖRNEK 141:

--kitap tablosundaki tüm tetikleyicilerin pasifleştirilmesi

alter table kitap

disable trigger all

 

-- ÖRNEK 142:

--kitap tablosundaki kontrol isimli tetikleyicinin pasifleştirilmesi

 

alter table kitap

disable trigger kontrol

 

-- ÖRNEK 143:

--kitap tablosundaki kontrol isimli tetikleyicinin aktifleştirilmesi

 

alter table kitap

enable trigger kontrol

Sınavda sormalık örnekler:  

Veri tabanı sınavı yapıyor olsak aşağıdaki örnekleri de sormak isterdim sizlere. Her biri 5 puan olsa 20 puan cepte olurdu :-)

Örnek soru 1: Veritabanının mevcut durumunu Full Backup ile yedekleme için hangi satır yazılmalıdır?

BACKUP DATABASE hastane TO DISK='C:\yedek.bak'

 

Örnek soru 2: Veritabanına ait transaction logların yedeği hangi kod ile alınabilir?

BACKUP LOG hastane TO DISK='C:\log_yedek.bak'

 

Örnek soru 3: Full Backup Sonrası veritabanındaki değişiklikleri Differantial Backup ile yedeklemek için hangi satırlar yazılmalıdır? 

BACKUP DATABASE hastane TO DISK='C:\diff_yedek.bak' WITH DIFFERANTIAL

 

Örnek soru 4: Alınan Full Backup nasıl geri yüklenir?

RESTORE DATABASE hastane FORM DISK='C:\yedek.bak' WITH RECOVERY

 

TAGS: 'sql komutları','sql örnekleri','t-sql komutları','t-sql örnekleri', 'dml komutları', 'dcl komutları','data defination language', 'data maniplation language', 'data control language', 'select örnekleri', 'sql select komutu', 'sql create komutu', 'sql alter komutu', 'sql drop komutu', 'sql insert komutu','sql update komutu', 'sql delete komutu', 'sql revoke komutu', 'sql grant komutu', 'sql deny komutu', 'sql açıklama satırı', 'sql store procedure', 'sql triggers', 'sql yordamlar', 'sql tetikleyiciler', 'sql functions', 'sql fonksiyonlar', 'sql if-else yapısı', 'sql when-then yapısı'