iki veritabanı arasında olmayan sp(stored procedure), FN(function), V(view), U(Table) bulunması
Böyle bir yazı yazmamın amacı;
2009 yılına ait bir veritabanı kullanıyorsunuz ve 2010 yılında bu veritananını yeniden oluşturyorsunuz. Ama kullandığınız program (ERP, MRP, vs.) bunları otomatik olarak yapıyor. Fakat siz 2009 yılında bir takım P(stored procedure), FN (function), V(view), U(Table) oluşturdunuz ve bunları yeni açılan veri tabanında olup olmadığının kontrolünü yapıp yeni veritabanına aktarmak istiyorsunuz.
Bu makalemde sizlere bunu anlatacağım. şimdiyekadar muhtemelen kullanmadığınız değişik bir yöntemle yapacağız. EXCEL kullanarak hem iki veritabanındaki farklılıkları bulacağız hemde bu farklılıkları otomatik oluşturacağız.
Sırasıyla Yapmamız gerekenler;
- Öncelikle iki veri tanabı arasında olmayan stored procedure yada function' ları bulan ve table donduren bir function yazacağız.
-
Bunları excel'de listeliyeceğiz
-
Bu stored procedure, function'ların sahip olduğu komut satırlarını bulan bir kod yazağız.
-
Bu kodları EXCEL'de ilgili storedProcedure'un karşılığı olarak getittireceğiz.
-
Saha sonra bir komut satırıyla bunları olmayan veri tabanımızda oluşturacağız.
- SQL programımıza girerek Fonksiyonumuzu hazırlayalım
--ilk veritabanımızdaki tüm kayıtlar getireleceğinden
--ikinci veritabanında karşılığı olmayan stored procedure'ler
--null değer alacaktır. LEFT OUTER JOIN ile iki veritabanını
--ilişkilendiriyoruz.
create function SH_iki_veritabani_arasinda_olmayan_veriler_TABLE (@verininCinsi nvarchar (5))
returns table as
return
(
select
ilkVeriTabani.name as ilkVeriTabani_NAME
,ilkVeriTabani.id as ilkVeriTabani_ID
,ikinciVeriTabani.NAME as ikinciVeriTabani_NAME
,ikinciVeriTabani.id as ikinciVeriTabani_ID from byhasanusta.dbo.Sysobjects as ilkVeriTabani
left OUTER join byhasanustayedek.dbo.Sysobjects as ikinciVeriTabani
ON ilkVeriTabani.name = ikinciVeriTabani.name
where ilkVeriTabani.Xtype = @verininCinsi
)
Burada Sysobjects tablosundan bilgi aldık. Daha önceki dersimizde bu tablonun içeriğini incelemiştik.
-
Şimdi gelelim Excel'e. Bir excel dosyası açalım.
 |
Burada dikkat ederseniz üst tarafta bir componentimiz mevcut. controls
adı altında. Eğer bu sizde ekli değilse, menü çubuğunda sağ tuşa basarak ekleyebilirsiniz.
|
Menü Çubuğunda sağ tuşa basın -> Customize Quick Access Tollbar' ı seçin. Aşağıdaki ekran gelecek ve buradan Controls tool'unu bulup Add' itıklayın. Ok 'e basarak ekranı kapatın.
Controls -> Insert -> ActiveX Controls' un altından bir adet button seçelim. Ve Excel'e ekleyelim. Aşağıdaki gibi bir görüntümüz olacak.
Şimdi Command Button1' i tıklayarak kod editörümüzde geçelim. Kodlamaya geçmeden önce yapmamız gereken EXCEL' e kütüphaneden bir kitaplık eklememiz.
Tools -> References tıklayalım. Burada bize kütüphane listesi açılacak.
Burada microsoft ActiveX Data Object 2.1 Library 'i işaretliyelim. Ve OK butonuna basalım.
Aşağıdaki gibi bir Sub oluşturalım. Ve butonumuzun Click olayına veritabanindaOlmayanSP yazalım.
Public Sub veritabanindaOlmayanSP(veriTabani As String)
'Bağlantı Nesnesi yaratıyoruz
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
'SQL Bağlantısı için string tanımlıyoruz
Dim connstr As String
'SQL Server OLE DB Provider' kullanıyoruz
connstr = "PROVIDER=SQLOLEDB;"
'SHASANUSTA Server'a bağlanıyoruz. Veritabanı olaraj firma değişkeni atadık.
connstr = connstr & "DATA SOURCE=SHASANUSTA;INITIAL CATALOG=" & veriTabani
'Bağlantıyı oluşturuyoruz.
connstr = connstr & "Integrated Security=SSPI;"
'Bağlantıyı açıyoruz.
conn.Open connstr
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim cmd As New ADODB.Command
cmd.CommandType = adCmdText
cmd.ActiveConnection = conn
'SQL cümlemizi yazıyoruz
cmd.CommandText = "select * from SH_iki_veritabani_arasinda_olmayan_veriler_TABLE('P') where ikinciVeriTabani_NAME is null"
'dönen satayı bir record sette tutuyoruz
Set rs = cmd.Execute
'bağlantıyı boşaltıyoruz.
Set conn = Nothing
'Record Set'in yapısı excel gibi olduğundan
'içerisindeki bilgiyi direkt istediğimiz
'bir hücreye yapıştırabiliyoruz
Sheet1.Cells(2, 1).CopyFromRecordset rs
End Sub
Private Sub CommandButton1_Click()
veritabanindaOlmayanSP ("byhasanusta;")
End Sub
çalıştırıp sonuca baktığımızda. Ilk veritabanımızda olupta ikinci veritabanında olmayan stored Procedure'ler listelenmiş oldu.
-
Şimdi Tekrar SQL programımıza gelelim ve aşağıdaki stored procedure yazalım ve oluşturalım.
create procedure SH_sp_F_komut_satirlari_getir
@sp_veya_F_ID nvarchar(100)
AS
select text from SysComments where id=@sp_veya_F_ID
-
Şimdi texrar Excel dosyamıza gelelim ve bir Command Button oluşturalım. Ayrıca aşağıdaki Sub'ı yazalım.
Public Sub veritabanindaOlmayanSPKomutsatiriGetir(veriTabani As String)
'Bağlantı Nesnesi yaratıyoruz
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
'SQL Bağlantısı için string tanımlıyoruz
Dim connstr As String
'SQL Server OLE DB Provider' kullanıyoruz
connstr = "PROVIDER=SQLOLEDB;"
'SHASANUSTA Server'a bağlanıyoruz. Veritabanı olaraj firma değişkeni atadık.
connstr = connstr & "DATA SOURCE=SHASANUSTA;INITIAL CATALOG=" & veriTabani
'Bağlantıyı oluşturyoruz.
connstr = connstr & "Integrated Security=SSPI;"
'Bağlantıyı açıyoruz.
conn.Open connstr
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim cmd As New ADODB.Command
'Bu sefer komut tipimizi stored procedure olarak değiştiriyoruz
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = conn
'SQL cümlemizi yazıyoruz
cmd.CommandText = "SH_sp_F_komut_satirlari_getir"
'Satırlar arasında döneceğimiz için
'Bir değişken tanımlıyoruz
Dim i As Integer
'storedProcedure atamak için değişkenimiz tanımlıyoruz.
'SQL' de tanımladığımız sp miz bizden parametre isteyecek
'Bu parametreyide Excel'deki satırlardan temin edeceğiz.
Dim spText As String
For i = 2 To 7
spText = Sheet1.Cells(i, 2).Value
cmd.Parameters.Append cmd.CreateParameter("@sp_veya_F_ID", adVarChar, adParamInput, 100, spText)
'dönen satayı bir record sette tutuyoruz
Set rs = cmd.Execute
'İçerisindeki bilgi teksatır döneceğinde ilgili satırın
'karşısına sql'deki kod bloğumuzu yapıştırıyoruz.
Sheet1.Cells(i, 5).Value = rs.GetString()
Set rs = Nothing
cmd.Parameters.Delete ("@sp_veya_F_ID")
Next i
'İşimiz bitince bağlantıyı boşaltıyoruz.
Set conn = Nothing
End Sub
Private Sub CommandButton2_Click()
veritabanindaOlmayanSPKomutsatiriGetir "byhasanusta;"
End Sub
ikinci butonumuza tıklayınca ilgili stored Procedure ait komut satırları sayfa1' de 5. kolona gelecektir. Bundan sonra geriye yapılacak tek bir işlem kalıyor bunları ikinci veritabanımızda oluşturmak.
excel görüntümüz aşağıdaki gibi olacaktır;
"E" sütununda ilgili stored Procedure ait komut satırları yer almaktadır.
-
Gelelim bunları ikinci veritabanımızda oluşturmaya.
Excel dosyamızda üçüncü bir Command Button oluşturalım ve aşağıdaki kodlamayı yapalım.
Public Sub komut_satiri_calistir(firma As String)
'Bağlantı Nesnesi yaratıyoruz
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
'SQL Bağlantısı için string tanımlıyoruz
Dim connstr As String
'SQL Server OLE DB Provider' kullanıyoruz
connstr = "PROVIDER=SQLOLEDB;"
'SHASANUSTA Server'a bağlanıyoruz. Veritabanı olarak firma değişkeni atadık.
connstr = connstr & "DATA SOURCE=SHASANUSTA;INITIAL CATALOG=" & veriTabani
'Bağlantıyı oluşturyoruz.
connstr = connstr & "Integrated Security=SSPI;"
'Bağlantıyı açıyoruz.
conn.Open connstr
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim cmd As New ADODB.Command
'komut tipimizi tekrat text olarak değiştiriyoruz
cmd.CommandType = adCmdText
cmd.ActiveConnection = conn
'Satırlar arasında döneceğimiz için
'Bir değişken tanımlıyoruz
Dim i As Integer
For i = 2 To 7
'SQL cümlemizi yazıyoruz. Bu sefer sql cümlemiz
'E kolonundaki cümlelerimiz olacak.
cmd.CommandText = Sheet1.Cells(i, 5).Value
Set rs = cmd.Execute
'Bilgi amaçlı 3. kolona "ok" yazdırıyorum.
Sheet1.Cells(i, 3).Value = "ok"
Set rs = Nothing
Next i
'İşimiz bitince bağlantıyı boşaltıyoruz.
Set conn = Nothing
End Sub
Private Sub CommandButton3_Click()
'Dikkat!!! stored procedur' leri oluşturacağım
'veri tabanını belirtiyorum.
komut_satiri_calistir "byhasanustayedek;"
End Sub
İşimiz bittiğinde görüntümüz aşağıdaki gibi olacaktır. SQL' de stored procedurlerinizi kontrol edebilirsiniz.
CommandButton1: İkinci veritabanında olmayan stored procedurleri getirdi.
CommandButton2: Bunlara ait komut satırlarını getirdi.
CommandButton3: İkinci veritabanında olmayan stored procedurleri oluşturdu.
Yapacaklarımızın hepsi bukadar. CommandButton1' de "P" parametresi gönderdik "P" parametresi çekeceğimiz verinin procedurlerden oluşacağını gösterir. Eğer function olsaydı "fn" yazardık. Bu şekilde istediğimiz verinin kontrolünü yaptırabiliriz.