27 Nisan 2017 Perşembe

SQL Server da Tabloların Şemasını Değiştirme



SQL Server da nadirde olsa tabloların şemasının değiştirme durumu ile karşılaşılabiliniyor. Bunun aslında çok basit bir T-SQL kodu bulunmakta.

Alter Schema HedefSema Transfer KaynakSema.TabloAd;

Eğer bir şema içerisindeki bütün tabloları farklı bir şemaya aktarmak istiyorsanız SQL Server'ın system Sp'leri içinde bulunan Sp_MsForEachTable bütün kullanıcı tabloların içinde dönerek işlem yapmanızı sağlar. Bu kodun kullanımı ise aşağıdaki gibidir.

exec SP_MsForEachTable  'Alter Schema HedefSchema Transfer ?'

SP_MsForEachTable Sp'nin kullanımı sonucunda db de bulunan bütün kullanıcı tabloların şemaları transfer Hedef olarak belirlediğiniz şemaya aktarılacaktır.




26 Nisan 2017 Çarşamba

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations Hatası

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations hatası T-sql de bir değişkene aynı anda birden fazla değer atanmaya çalışıldığı zaman alınır. Bundan emin olmak için sorguyu top 1 olarak çalıştırmayı deneyin hata almıyorsanız değişkene atama yaparken ki işlemi kontrol ediniz.

Örnek Kullanım:

Select top 1 @degisken=kolon 
from TabloAd
Where Id=@Id





25 Nisan 2017 Salı

The query processor ran out of internal resources and could not produce a query plan with WHERE in and several thousand values Hatası



Where  statement da kullandığınız IN ifadesi içerisine limitinin dışında değer girmenizden dolayı SQL Server dan 
"The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information." 
hatasını almaktasınız. Hem bu hatayı almamak hemde daha iyi bir performans için bu noktada temp tablo yada subquery kullanarak hem hatadan kurtulabilir hemde daha iyi bir performans elde edebilirsiniz. Konu ile ilgili bu sayfada yorum kısmında Microsoft durumu açıklayıcı bir anlatımda da bulunmuş. Umarım faydalı olur.

24 Nisan 2017 Pazartesi

Transaction, Rollback, Commit Kullanımı

   SQL Server'da bir sorgu çalıştırdığımız zaman default olarak SQL Server hemen sonuç
döndürür.

   Eğer çalıştırılacak sorgunun başına begin transaction (yada begin tran) ifadesi kullanırsak otomatik olarak transaction explict uygulanır ve tablo üzerinde lock konulur. Bu lock transaction commit yada rollback olana kadar tablo üzerinde kalır.

   Örneğin kritik update ve  delete işlemlerinde begin tran ifadesi kullanılarak yapılan işlemin doğruluğundan emin olduktan sonra eğer bir sıkıntı yoksa commit yazarak çalıştırırsanız işlem yaptığınız en son şekilde kalacaktır. Fakat işlemi yaptıktan sonra bir problem olduğunu fark ettiniz ve geri dönmek istiyorsanız ROLLBACK yazarak bunu çalıştırırsanız veriler önceki haline gelecektir. Ama unutmayın kontrol yaparken aynı session üzerinden sadece verilere ulaşabilirsiniz. Farklı bir session üzerinden datalara ulaşmak istediğinizde tablo üzerinde lock olduğundan dolayı verilere gelmeyecektir.

  Ayrıca session üzerinde açıkta olan transaction var mı ? Varsa bunun sayısını görebilmek için
SELECT @@TRANCOUNT ifadesi ile görebilirsiniz.

 

SQL Sever Login ve Şifrelerini Farklı Server'a Taşıma


   Eğer mevcutta olan Server'ı farklı bir server'a taşıyacaksanız sadece DB'lerin full-backup ve retore işlemi ile kurtulmanız mümkün değil. Çünkü server kullanıcıları aldığnızı full-backup' a dahil edilmiyor. Herhangi bir login'e sağ tıklayarak create script dediğiniz zamansa güvenlik amaçlı SQL Server mevcut loginin şifresini rastgele olarak yeniden oluşturmaktadır. Yani mevcut şifre ile taşımanız mümkün değil. Tabi bu söylediklerim Windows Authentication için geçerli değil. Sisteminizdeki SQL Server Loginler için geçerli.

   Neyse ki mevcut şifreleri koruyarak taşıma işlemini yapabilmeniz için Microsoft'un yayınlamış olduğu bir Stored Procedure var. Bu Sp sayesinde mevcuttaki SQL Server login'leri mevcut şifreleri ile taşıyabilirsiniz.Bu Stored Procedure kullanıcıların scriptlerini oluştururken şifreleri güvenlik amaçlı hashlemektedir. Bu sayede server'ı taşıdıktan sonra kullanıcılar aynı şifreleri ile login olabilmektedirler.

Scriptin en güncel halini buradan indirip Db'de oluşturabilirsiniz.

Aynı zamanda SQL Server 2005 ile 2012 arasındaki versiyonları destekleyen halini buradan temin edebilirsiniz.


Daha sonra istediğiniz login'nin create scriptini  aşağıdaki örnek kullanım şekliyle elde etmeniz mümkün.

EXEC dbo.sp_help_revlogin @login_name = 'Kullanici'





14 Nisan 2017 Cuma

SQL Server Unable to open Step output file. The step failed Hatası

Job'ı çalıştırdığınız zaman job'ın loglarında Unable to open Step output file  hatasını alıyorsanız büyük ihtimalle job'ın hata alması durumunda log'ları yazacak olan klasörde erişim yetkisi problemi yaşamaktasınız. Bunu test etmek için sorun yaşadığınız ilgili job'a sağ tıklayarak

  • Properties seçeneğine gelin. 
  • Açılan pencerede Step seçeneğini tıklayın.
  • Açılan pencerede Edit butonuna basın.
  • Advance Sekmesinden OutputFile alanını tamamen silin ve tekrar deneyin.

6 Nisan 2017 Perşembe

Job History Temizleme


Bunu GUI'den (SQL SERVER Management Studio)'dan yapabileceğiniz gibi aynı zamanda script'le de yazmanız mümkün. Mesela çok sık aralıklarla çalıştırdığınız bir Job'ınız varsa bu LOG'ların çok fazla şişmesine sebep olacaktır. Bunun için belli aralıklarla bu hob'ın history'sinin silme işlemini sağlayacak başka bir job tanımlayabilirsiniz.


EXEC dbo.sp_purge_jobhistory @job_name = NULL,
    @job_id = NULL,
    @oldest_date = '2017-04-06 12:14:42'

@job_name=  işlem yapılacak olan Job'ın ismi yazılır.
@job_Id=işlem yapılacak olan Job'ın Id'si yazılır ki bu Id uniqueidentifier'dır.
@oldest_date= kalması gereken en eski tarihi belirtirsiniz. Eğer bunu yazmazsanız history'nin tamamı silinir.

SQL Server 2016 KB2919355 Hatası



      SQL Server 2016 kurulumunda sıkça karşılaşılan hatalardan biri olan KB2919355 No'lu hatayı aşmak aslında oldukça kolay. Denetim Masasından işletim sisteminin güncellemelerini kontrol edin. Yaklaşık 800.00 Mb kb2919355 isimli bir update göreceksiniz. Makineyi update edip yeniden başlattıktan sonra SQL Server'ı kurmayı yeniden deneyin. Sorun giderilmiş olacaktır. Kolay gelsin.

4 Nisan 2017 Salı

Saving Changes is not Permitted Hatası


SQL Server da mevcut bir tablo üzerinde şemasal bir değişiklik yapıldığı zaman arka planda SQL Server tablonun içerisindeki veriyi boşalttıktan sonra ilgili değişikliği yapar ardından tekrardan veriyi tabloya yazar. Güvenlik sebebiyle siz kapatmadığınız sürece buna SQL Server izin vermez ve Saving Changes is not permitted. The changes you have either made changes to a table that can't be re-created or enabled the option Prevent saving changes theh require the table to be re-created bildirimini alırsınız. 

      Bunu aşabilmek için SQL Server'da üst menüde bulunan Tools menüsünden Options'ı tıkladıktan sonra karşınıza gelen pencerenin sol menüsünden altlarda bulunan Designers'ı seçin. Karşınıza gelen seçeneklerden altta bulunan Prevent saving changes that require table re-creation'nın seçeneğini kaldırırsanız SQL Server tablo üzerinde şemasal değişiklikler yapmanıza izin verecektir. Fakat production ortamlarında sistem çalışırken bunun kullanılması data kaybınıza sebebiyet verebileceği için dikkatli olunması gerekmektedir.







3 Nisan 2017 Pazartesi

Windowed functions can only appear in the SELECT or ORDER BY clauses Hatası


Windowed functions can only appear in the SELECT or ORDER BY clauses hatası alıyorsanız büyük ihtimalle windowed function lardan birini yanlış kullanımı ile karşı karşıyasınız. Windowed Function'lar ANSI standatları tarafından belirlenmiş group by, having, where ifadeleri işlendikten sonra çalıştırılırlar. Bundan dolayı Select ve Order BY ifadeleri içinde kullanılmalıdır. Ama ihtiyaç doğrultusunda Where ifadesi içinde de kullanılması gerekir. Bu durumda benim en çok kullandığım yöntem CTE  ile kullanım şeklidir.  Böylede Windowed Function kısmı sanki bir kolonmuş gibi davranabilir.

Aşağıda AdventureWorks database'inde bulunan Customer tablosunda tekrar eden StoreID'leri tespit edelim. Kullandığımız windowed function'ı where cümlesinde kullandığımız zaman -aşağıdaki gibi-
Windowed functions can only appear in the SELECT or ORDER BY clauses hatası alınacaktır.

select distinct
StoreID,
count(StoreID) over (partition by StoreID) as a
from Sales.Customer
where count(StoreID) over (partition by StoreID)>1 --  Where cümlesinde kullanımına izin verilmez.

Bunun yerine scrpiti CTE içinde kullanarak bu hatayı aşabiliriz. Kullanımı aşağıdaki gibidir.


with c as
(
select distinct
StoreID,
count(StoreID) over (partition by StoreID) as a
from Sales.Customer
)
select * from c
where a >1