-

Sql Server’da Linked Server

Linked server ile belirli veri kaynaklarını Sql Server’a bağlayarak iki ortamın haberleşmesini sağlayabiliriz.Bu veri kaynakları text dosyaları, excel gibi dosya türleri olabildiği gibi access ve oracle gibi veri tabanları da olabilir.

Aşağıda linked server konfigürasyonunu görebiliriz:

IC62068

Linked server  kullanarak bağlantı kurmak için önceden eklenmiş linked serverlarımız olmalıdır.Linked server eklerken object explorer penceresinde “linked server” a sağ tıklayıp “add  new linked server” diyerek ekleyebiliriz.Yeni linked server eklerken karşımıza gelen ekranlar aşağıdaki gibidir:

linkedServer1

Provider:Sql serverı bağlayacağımız veri tabanı

Product name:Oracle veri tabanına bağlanılacaksa “Oracle”,sqle bağlanılacaksa “Sql” yazılır.

Datasource:Bağlacak server adı ya da Ip si

Catalog:Bağlanıcak serverdaki veritabanı  dır.

Security tabı:

LinkedServer2

Aynı serverda işlem yapılacaksa “Be made using the login’s current security context” seçilebilir başka bir servera bağlanılacaksa “be made using the security contex” seçilerek kullanıcı adı ve şifre girilir.

Bu işlemleri tamamladıktan sonra linked serverı eklemiş oluruz.

İkinci yol olarak sp_addlinkedserver stored proc ile gerekli parametreleri vererek de linked server ekleyebiliriz.

Linked server ekledikten sonra uzaktaki sunucuya bağlanıp sorgu çalıştırabiliriz.Openquery kullanarak uzaktaki sunucu üzerinde işlem gerçekleştirebiliriz.

Syntax:

OPENQUERY ( linked_server ,’query’ ) şeklindedir.

linked_server:eklediğimiz linked serverın adı

‘query’:sunucuya bağlandıktan sonra veritabanı üzerinde yapmak istediğimiz işlemdir.

Örnek update işlemi:

UPDATE OPENQUERY (OracleSvr, ‘SELECT name FROM joe.titles WHERE id = 101′)

SET name = ‘ADifferentName’;

Örnek insert işlemi:

INSERT OPENQUERY (OracleSvr, ‘SELECT name FROM joe.titles’)
VALUES (‘NewTitle’);

Örnek delete işlemi:

DELETE OPENQUERY (OracleSvr, ‘SELECT name FROM joe.titles WHERE name = ”NewTitle”’);

Aşağıdaki örnekte oracle daki bir metoda parametre vererek nasıl kullanabileceğimizi görebiliriz:

DECLARE @AccountCode NVARCHAR(30)
declare @UserName NVARCHAR(30)

SET @AccountCode = ’123′ ;
SET @UserName = ‘der’;

DECLARE @TSQL varchar(255)
SELECT @TSQL = ‘SELECT * FROM OPENQUERY(linkedserverName,”SELECT OracleFunction(””’ + @AccountCode + ””’, ””’ + @UserName + ””’) from dual”)’
EXEC (@TSQL)

Kaynaklar:

[1]  http://technet.microsoft.com

[2]  http://sqlserverplanet.com

Sql Server’da Job Oluşturma

Microsoft Sql server üzerinde otomatik  yapılmasını istediğimiz yedekleme, sorgu çalıştırma tarzı operasyonları programlayıp gerçekleştirebiliriz.Sql Server’da bu işlemleri  Sql server agent modülü yapar.

Object explorer->Sql Server Agent->New->Job  şeklinde ilerlediğimizde yeni bir job ekleriz.

Yeni bir job eklediğimizde karşımıza aşağıdaki gibi bir ekran gelir.Bu ekranda birkaç adımla job oluşturmuş oluruz.

job1

General tabında  job’ın adı gibi bilgileri doldurmalıyız.

Steps tabında.Job’a adım ekleriz.Bu adımlarda hangi veri tabanını kullanacağını “Database” bölümünde seçiyoruz, hangi işlemi yapacağını “Command” bölümünde belirliyoruz.

job2

 

Hangi veritabanı üzerinde işlem yapılması gerektiğini seçtikten sonra command böümüne sql sorguları ekleyebiliriz. Aşağıdaki örnek ekranda backup tablosunun belirli zamanlarda silinmesi ile ilgili komutu görebiliriz. Ayrıca birden fazla komut da ekleyebiliriz.

jo3Yapılması gereken komutu belirledikten sonra işlemin programını belirlemeliyiz. İstediğimiz işlem ne kadar sürede bir tekrarlanmalı,ne zaman başlayıp bitmeli gibi işlemleri Schedule tabında belirleriz. Aşağıdaki örnekte backup tablosunu temizleme işlemini ayda bir kere saat 3:00 da gerçekleşmesini istiyoruz.

job4

Bunlara ek olarak  Alerts tabı ile job’a alarm verdirebiliriz,Notifications tabı ile belirli zamanlarda e-mail atmasını isteyebiliriz.

Ayrıca Job’ın nezaman çalıştığı başarılı olup olmadığı gibi bilgileri Job’ın view history bölümünden takip edebiliriz.

job5

 

İki Primary Key’li Olan Tablolar Arasındaki Relationlar

Eğer İki Primary Key’i olan tablo ile başka bir tablo arasında realtion kuracaksanız(bu iki primary keyi olan tablodaki primary keylerden biri diğerine foreign key olacaksa),direk bir tanesini alıp bağlamaya çalışırsanız hata ile karşılaşırsınız.
Senaryomuz şu şekilde:

Aslında siz iki sadece isyeri bilgisini bağlamak istiyorsunuz.Bunu denerseniz şöyle bir hata alırsınız:

Bunun içinde foreign key olacak tabloda da iki alanın olması gerek(isyeri ve sirket alanları).İkisini birden bağlamak gerekecek.
Aşağıdaki gib bağladıktan sonra hata almayacaksinizdır:

DERYA GÜNDÜZ

Microsoft Sql’de “Collasion” Hatasının Giderilmesi

Merhaba Arkadaşlar,
Üzerinde çalıştığım bir projede karşılaştığım bir problem ve nasıl giderildiğini sizlerle paylaşmak  istiyorum.Siz de aynı hata ile karşılaşırsanız,çözmeniz kolaylaşır.
Aldığım hata “Collasion” Hatası idi.Tablolar arasında relationyaparken relation kurmaya izin vermeyip aşağıdaki gibi bir hata aldım.

Hata dil ile ilgiliymiş.Tablodaki bağlamak istediğimiz alanlardaki dil seçeneklerinin aynı olması gerekiyor.Tablo1 deki kolonun dil seçeneği(bağlamak istediğimiz kolonlardan biri) aşağıdaki gibi ise:

Tablo2 deki kolonun dil seçeneği(bağlamak istediğimiz kolonlardan biri) aşağıdaki gibi ise:

Collasionun nedeni bu iki dil seçeneğinin aynı olamamasıdır.
Bu hatayı düzeltmek için ise ikisnin dil seçeneği aynı yapılmalıdır.
Collasion seçeneğinin yanındaki 3 nokta tıklanarak dil seçilir.

Böylelikle bu hatayı gidermiş oluyoruz.Umarım faydalı olmuştur.

DERYA GÜNDÜZ

Microsoft Yaz Okulu Sona Ererken Bana Kalanlar…..

18 Ağustos 12 Temmuz tarihleri arasında Tobb Etü’degerçekleşen Microsoft Yaz Okulu eğitimlerimiz  sona erdi. İlerikisenelerde yaz okuluna katılmak isteyen arkadaşlar için faydalı olabileceğinidüşündüğüm bir yazı olsun istiyorum.Nasıl başvurdum,ne gibi şartlararanıyor,eğitim boyunca neler yaptık,hangi eğitimleri aldık gibi sorularıncevaplarını bulabileceğiniz bir yazı olacak.
Nasıl Başvuru Yapılır ve Aranan Şartlar?
Nisan ayında  msakademik.com sitesinde Microsoft yaz okuluiçin başvuruların alındığı duyuruldu.Başvuruyu internet üzerinden yaptım,birform doldurdum.Formda bildiğim programa dilleri,yaptığım projeler,katıldığımeğitim ve seminerler,klüp-dernek etkinliklerim,organizasyonlarım,akademikreferanslarım,not ortalamam gibi bilgiler soruldu.Bence  seçerkenbaktıkları en kritik şeyler de bu saydıklarım.
Genelde her üniversiteden 1 ya da 2 kişiseçmişlerdi.Eğitimler İstanbul,Ankara ve İzmir olmak üzere 3 yerdegerçekleşti,genelde okunan şehire en yakın merkezlere göre şehir eşleşmesiyapılıyor.Bizim gruptaEskişehir OsmanGazi Üniv.,Hacettepe Üniv.,Çankaya Üniv.,Katü  ,Ankara Üniv.,
Tobb Etü Üniv.,Anadolu Üniv.,Selçuk Üniv.,Erciyes Üniv.,Fatih Üniv.,Bilkent Üniv.‘den arkadaşlar vardı(bunlar hatırlayabiklerim).
Eğitimler boyunca her 2-3 günde bir farklı bir eğitmengelip,farklı konularda eğitimler verdi.
Eğitmenlerimiz ve Eğitimlerimiz:
·         Daron Yöndem-Silverlight
·         Mahmut Temur-Sql
·         Pavel Slavov-Windows Azure
·         Sertay Halka-C#
·         Burak Batur-SharePoint
·         Engin Polat-Xna Game Studio
·         Ekin Özçiçekçiler-Windows Phone 7.1
Eğitim son haftasında da 
  • Buğra Karabey,Ulusal Teknoloji Politikaları Yöneticisi,Bulut Bilişim konusunda ve 
  • Umut Erkal,İmagine Cup’da dünyada ilk 6 ya giren ekip üyesi,Kinect Programlama ve Embedded Programlama ile ilgili seminer verdi.
ve Proje yapmamızı istediler.Ben de Windows Phoneuygulaması olarak Birim Çevirmece yaptım.Yaptığım uygulamada Bilgisayarbirimleri ve uzunluk ölçüleri birbirine çevirilebiliyor.
Laboratuarın çok sıcak olması ve bazı aksaklıklardışında eğitim verimli geçti,eksiklerimin ne kadar çok olduğunu(zatenöğrendikçe daha çok eksik olduğunu anlarsın hep zaten) gördüm.Yani çoookçalışmam gerek çooook:)))Sektör engin bir derya misali…..
Hiç bilmediğim teknolojiler konusunda en azından aşinaoldum,değerli hocalar tanıdım ve güzel arkadaşlar edindim.ÖrneğinSilverlight,XNA,Windows Phone,Azure ve SharePoint konusunda hemen  hiçbilgim yoktu,şuan ne oldukları,neler yapılabileceği konusunda fikrimvar.Gelişmekte ve popüler olan bu teknolojileri işin ehillerinden dinlemek de ayrı bir zevkti benim için:)
Eğitimden kalan Birkaç mutlu kare:)))))


SQL’de oluşturulan tablonun backupını(yedeğini) alma-restore(yeniden yükleme))

Sql de oluşturduğumuz database’i başka bir bilgisayarda açmak istersek ya da bilgisayardaki verilerin silinmesi tehlikesine karşı yedeğini almak isteyebiliriz.Çok kritik bir işlem olmasına karşı bu  işlem Sql’de çok kolay.Birkaç basit adımda ve resimlerle anlatmaya çalışacağım:

–oluşturduğumuz database adının yazıldığı yere terstıkla/tasks/backup seçilir

–açılan ekranda backupın kaydedildiği yerin yolu vardır,isterseniz başka bir yere de kaydedebilirsiniz.

–ok dedikten sonra oluştuğuna dair mesaj gelir,artık backup oluşturmuşsunuz demektir.

–bir de başka bir yerden almış olduğunuz backupı yükleme işlemi vardır,yani restore işlemi
–sql serverda herhangi bir proje adını ters tıkla/tasks/database

–Daha önce backupı alınmış projenin yeri nerede ise o bulunur onaydan sonra proje sql serverda çalışmaya hazırdır.

DERYA GÜNDÜZ

SQL DE TRİGGERLAR(TETİKLEYİCİLER)

Trigger nedir?
Trigger’ın kelime anlamı tetikleyicidir,
Sqldeki anlamı da  database tabloları üzerinde bir değişiklik olduğu zaman çalışan sql sorgularıdır.
Triggerlar ile insert,update,delete yapılabilir.

Trigger oluşturmak
create trigger TriggerAdi
on TabloAdi
tetikleyici seçeneği(hangi olay olduğunda çalışsın)
as
select ….

creat trigger tg_KategoriSilindi
on Categories
for delete             –category silinmesini takip ediyor
as
select ‘biri bir tane kategori sildi’ as silme                  —verilecek mesaj

Yeni eklenecek olan çalışanın adını veoyadını ve aldığı ID değerini ekrana yazdıralım:

create trigger tg_CalisanEklendi
on Employees
for insert
as
declare @ad varchar(10)
declare @soyad varchar(10)
declare @id int
select @ad=FirstName,
@soyad=LastName,
@id=EmployeeID from inserted
declare @veri varchar(36)
set @veri=cast(@id as varchar(3))+’ ‘+@ad+’ ‘+@soyad
select @veri as veriyo

insert into  Employees(FirstName,LastName)
values(‘fulya’,’ayluf’)
–ekleme işlemini yapılacağı zaman trigger da çalışır ve ekleme işlemi

İnstead of Triggerlar
Triggerlar ile asıl yapılması gereken yerine başka bir iş yaptırmak istediğimizde instead of trigger kullanılır.
Bu örnekte silme işlemi yerine mesaj verdirtecez:

create trigger tg_KtegorileriKoruyalim
on Categories
instead of delete
as
select ‘Kategorileri silemezsin!!!’  as mesaj
delete from Categories where CategoryID=1

İnsead of triggerların önemli kullanım alanlarından bir tanesi de viewler ile birlikte kullanmaktır,birden fazla kaynak tablo ile oluşturulmuş viewlerde insert,update,delete  işlemleri yapılmak istendiğinde instead of trigger kullanmak zorunda kalınıyor,aksi halde hata verir.

DERYA GÜNDÜZ

SQL’DE VİEW(SANAL TABLO) OLUŞTURMAK

View ler hangi durumlarda kullanılır,faydaları nelerdir?
Yapacağınız sql işleminde birden fazla tabloyu ve onların farklı farklı colonlarını kullanacaksınız,hepsini birleştirmek ,gerekli tablodan sorgu yapmak biraz zahmetli bir iş olabilir,bunun yerine view denen sanal tablolardan oluşturup,gerekli colonları farklı tablolardan alıp sorguları tek bir tablo üzerinden yapmak işinizi kolaylaştırailir.Karmaşık sorgular kolay bir hale gelmiş  olur.Ayrıca view kullanmanın çok önemli nedenlerinden bir tanesi sağladığı güvelikler.Tablolarınızın tamanının görünmesini istemediğiniz zamanlarda  sanal tablo kullanıp tablolarınızın tamamının görünmesini engelleyebilirsiniz.
View ler üzerinde yapılan değişikler kendilerini oluşturan kaynak tabloları da etkiler,aynı değişiklikler kaynak tablolara da yansır.
Oluşturulan Viewler  resimde görüldüğü gibi  Object Explorer kısmında ana başlık altında toplanır

Viewler nasıl  oluşturulur?
create view vw_viewAdi
–tavsiye olunur ki oluşturulan view adları vw_ ile başlasın,böylece veri tabanınıza yeni bakan biri onun view olduğunu kolayca alsın

as
select kolonAdi from tabloAdi
where şart

with check option
view oluştururken with check point ifadesi yazılırsa,tanımlamadaki where şartı muhafaza edilmiş olur where şartı dışındaki insert,update,delete işlemleri yapılmaz hata verir
create view vw_DogruHazirlanmisView
as
select firstname,lastname
from Employees
where FirstName like ‘a%’
with check option

insert into vw_DogruHazirlanmisView values(‘derya’,’dd’)
–eklenme yapılmak istendiğinde hata verir
hata:The attempted insert or update failed because the target view either specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or more rows resulting from the operation did not qualify under the CHECK OPTION constraint.(with check pointten dolayı ‘a’ ile başlamayan bir ekleme yapılamaz)

with Schemabinding
Viewin oluşturulduğu kaynak tablo üzerinde değişiklik yapılmasına izin vermeyecek.

create  view vw_CokUgrastim
with schemabinding          –sütunla ilgili bir değişiklik yapılamıyor
as
select firstname,lastname,city
from dbo.employees  –dbo. olmalı
drop table Employees          –yazıldığında hata verir
hata:Could not drop object ‘Employees’ because it is referenced by a FOREIGN KEY constraint.

with encription(gizli view)

Kaynekların  gizliliğini sağlayan koddur,kullanıcı sadece oluşturulan view ile ilgili verilere erişebiliyor,kaynak tablolarla ilgili hiç bir bilgiye ulaşamıyor.

create view vw_Benim
with encryption   –kaynak görmeme,design aktif değil
as
select * from products

Resimde de görüldüğü gibi gizli view kullanıldıktan sonra viewin üstünde kilit işareti olur ve ‘modify’ seçeneği aktiif değildir.

DERYA GÜNDÜZ

SQL C# BAĞLANTISI-C#DAN VERİTABANINA BİLGi EKLEME-SİLME

Sqlde tablolarımızı oluşturduktan sonra c#da  kodlar yardımıyla veritabanına bilgi ekleme ya da silme işlemlerini gerçekleştirebiliriz.
Bununla ilgili c#da yazılmış örnek kodu inceleyelim:
Öncelikle projede gerekli form dizaynını yapmalıyız,bir tane datagridview ve gerekli button textbox ve labelları eklememiz gerekir

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;                                 //sql bağlantısı için gerekli kütüphane
namespace Sql_komutları_deneme
{
public partial class Form1 : Form
{   //tanımlamaları public yapıyoruz ki hepsi için geçerli olsun
SqlConnection baglantim;
SqlDataReader reader;
SqlCommand komut;
SqlDataAdapter adaptör;
DataSet dataset;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

baglantim = new SqlConnection();    //sql ile bağlantı kurulmasını sağlar
baglantim.ConnectionString = “Integrated Security=True;  Initial Catalog=csaharptanbaglanma;  Data Source=DERYA-PC\SQLEXPRESS;”;     //database ve serverisimlerinin verilmesi gereken connectionstring
baglantim.Open();                      //bağlantıyı açmak gerekir

dataset = new DataSet();
SqlDataAdapter adaptör = new SqlDataAdapter(“select* from  Bilgiler    “, baglantim);   //bağlanılacak tablo belirlendi

adaptör.Fill(dataset, “Bilgiler”);          //dataadapterdaki bilgiler datasete aktarıldı

dataGridView1.DataSource = dataset.Tables[0];           //tablo datagridviewde görüntüleniyor

komut = new SqlCommand();
komut.Connection = baglantim;            //sql cümlelerinin yazıldığı yer

}

private void button_sil_Click(object sender, EventArgs e)
//silme  butonu,seçili olan satırın silinmesini sağlıyor
{

try
{

//komut.CommandText = “delete from Bilgiler where Ad=’abc’”;     //adı abc olanı siler
//seçili olanın silinmesi olayı
komut.CommandText = “delete from Bilgiler where Id=’” + dataGridView1.CurrentRow.Cells["Id"].Value.ToString() + ”  ‘  “;//seçili olanı siliyor
reader = komut.ExecuteReader();
reader.Close();
}
catch
{
MessageBox.Show(“secili alan yok!!!!!”);
}
finally
{
Form1_Load(sender, e);     //silme işlemini yaptıktan sonra formun güncellenmesini sağlıyor

}

}
//textboxlara yazılanların veri tabanına eklenemesini sağlıyor
private void button_ekle_Click(object sender, EventArgs e)
{
try
{

komut.CommandText = “insert into Bilgiler values(‘” + textBox1.Text + “‘,’” + textBox2.Text + “‘,’” + textBox3.Text + “‘,’” + textBox4.Text + “‘,’” + textBox5.Text + “‘)”;
reader = komut.ExecuteReader();   /

}
catch
{
MessageBox.Show(“ekleme islemi gecersiz!!!bosalan veya farklı id de eleman eklenmeli”);
}
finally
{
Form1_Load(sender, e);     //silme işlemini yaptıktan sonra formun güncellenmesini sağlıyor

}
}

}
}

     Yapmış olduğumuz bütün değişiklikler veritaanına da yansımış oluyor…………..

DERYA GÜNDÜZ