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ı'