Oca 18
Özellikle bazı raporlarda veri satırlarının yanına kendinden önceki satılardaki bir alanın toplamını yazma ihtiyacı duyabiliyoruz. Aşağıdaki gibi Satis isimli bir tablo olduğunu düşünelim.

Bu tabloda her dönemin karşısında o döneme ait ciro bulunmaktadır. Bu tablodaki verilere dayalı olarak aşağıdaki gibi bir sonuç elde etmek istiyoruz.

Read the rest of this entry »
Oca 10
SQL Server’deki bir sorgunun hangi yöntemle çalıştırılacağını SQL Server’in ürettiği Execution Plan’a bakarak anlayabiliriz. SQL Server’in sunduğu gösterim planı ifadelerini (Showplan SET statements) kullanarak o anki Execution Plan hakkında daha geniş bilgi alabiliriz. Sorguya ait execution plan’ı görmek için temel olarak aşağıdaki deyimler kullanılır.
SET SHOWPLAN_ALL ON
SET SHOWPLAN_TEXT ON
SET SHOWPLAN_XML ON
SET STATISTICS XML ON
SET STATISTICS PROFILE ON
SET STATISTICS IO ON
SET STATISTICS TIME ON Read the rest of this entry »
Oca 04
SQL Server 2005 ile birlikte “Surface Area Configuration” isimli ayrı bir programcık kurulur. Bu araç aracılığıyla SQL Server ve Analysis Services, SQL Server Agent, Full-Text Search, Integration Services, SQL Server Browser gibi SQL Server üzerinde çalışan alt servislerin yönetimi sağlanır. Ayrıca Ad Hod Remote Queries, CLR Integration, DAC, Database Mail, xp_cmdshell gibi veritabanı tarafında SQL dünyası dışındaki özelliklerin aktif veya pasifleştirilmesi sağlanır. Bu araca Start » Programs » Microsoft SQL Server 2005 altındaki Configuration Tools bölümden ulaşılır.

SQL Server 2008′te bu araç ayrı bir program olarak kurulmayıp Policy Based Management kapsamında sunulmaktadır. Policy Based Management, SQL Server üzerinde oluşturulmuş olan kuralların yönetildiği alandır. Policy Based Management altında yeni policy (kural) oluşturulabilir veya mevcut policy’ler yönetilebilir. PBM altındaki Facet bölümü policy oluştururken kullanabileceğimiz temel özellikleri içermektedir. “Facet” kavramını SQL Server üzerinde veritabanı yöneticisi tarafında yönetebilecek özellikler olarak tanımlayabiliriz.

Konuya geri dönecek olursak “Surface Area Configuration” yönetimini SQL Server 2008′de Facets bölümü altında yapabiliyoruz.

Ara 09
SQL Server Data Replication içinde tanımlı abonelikler (subscription) belirlenmiş olan transaction saklama süresi (retention period) içinde senkronize edilmezse otomatik olarak pasif moda çekilebilir veya expire edilebilir. Transactional Replication yönteminde maximum distribution retention period (sp_adddistributiondb prosedürü için @max_distretention parametresi) ve publication retention period (sp_addpublication prosedürü için @retention parametresi) olmak üzere iki temel parametre kullanılır. Read the rest of this entry »
Ara 05
SQL Server replication uygulaması doğası gereği replikasyona dahil edilmiş nesneler üzerinde yapılan tüm değişiklikleri SQL ifadeleri olarak Log Reader Agent aracılığıyla Distribution veritabanına aktarır. Distribution Agent de bu komutları subscriber’lara gönderir. Yanlışlıkla yaptığımız bir Bulk Insert işlemi sonucu aktarılacak liste uzayacaktır. Bu da gerisinde gelen bazı önemli bilgilerin aboneye aktarılmasını geciktirebilir. Uzun listeyi yok etmek isteyebiliriz. SQL Server Replication İlgili Notlar makalesinde yazdığımız gibi eğer replicationda o anda bir hata oluşmuşsa ve o hatayı çözemiyorsak replicationun o hatayı atlayıp kuruktaki listeye devam etmesini sağlamak için -SkipErrors parametresini kullanabiliriz. Distribution Agent için tanımlanan bu parametre aracılığıyla sözkonusu hatadaki transactionlar aboneye gönderilmez. Örneğin o anda 2601 (Cannot insert duplicate key row in object ‘%.*ls’ with unique index ‘%.*ls’.) ve 2627 (Violation of %ls constraint ‘%.*ls’. Cannot insert duplicate key in object ‘%.*ls’.) hataların oluştuğunu düşünelim. Bu hataları aşağıdaki gibi atlayabiliriz.
-SkipErrors 2601;2627
Bu yönteme alternatif olarak SQL Server 2005 ile birlikte gelen sp_setsubscriptionxactseqno prosedürü de aynı amaç için kullanılabilir. Bu prosedürün ilk yöntemden farkı non-SQL Server Subscriber’lar için kullanılamıyor olması ve parametre olarak xact_seqno (transaction sequence number) değerini almasıdır. xact_seqno listedeki her transactiona ait
log sequence number (LSN) değerini belirtir. Distribution Agent, Subscriber tarafında en son hangi transaction setini COMMIT etmişse ona ait xact_seqno değerini MSdistribution_history tablosundaki xact_seqno alanına yazar. Bir sonraki transferde bu değerden büyük xact_seqno’lara ait transactionları aboneye gönderir. Veritabanı yöneticisi olarak replikasyonun en son hangi xact_seqno değerinde kaldığını sp_setsubscriptionxactseqno prosedürüyle güncelleyebiliriz.
sp_setsubscriptionxactseqno [ @publisher= ] ‘publisher’, [ @publisher_db= ] ‘publisher_db’, [ @publication= ] ‘publication’, [ @xact_seqno= ] xact_seqno
Bu prosedür sadece transactional replication türünde çalışır.
O andaki hatalı xact_seqno değerlerini bulmak için sp_helpsubscriptionerrors prosedürü kullanılabilir.
sp_setsubscriptionxactseqno yordamına alternatif olarak MSrepl_commands tablosundan kayıt silme yöntemi kullanılabilir. Distribution veritabanının altında bulunan bu tablo replike edilecek komutları içerir. Aşağıdaki gibi xact_seqno değeri verilerek bir transaction set silinebilir.
DELETE FROM MSrepl_commands
WHERE xact_seqno= 0x0008A2500000045A00DE
Kas 19
B sunucusu üzerinde linked server olarak tanımlanmış A sunucusunda DB1 isimli veritabanında oluşturduğumuz T1 tablosuna linked server konulu makalemizde anlattığımız gibi 4 parçalı tanımlayıcı (4-parts identifier) kullanarak aşağıdaki gibi ulaşabiliriz.
Linkedserver.database.schema_name.object_name
A.DB1.dbo.T1
Fakat A sunucu üzerinde oluşturduğumuz geçici tablolara (temporary tables) erişmek bu kadar kolay olmamaktadır. Örneğin sunucu üzerinde oluşturduğumuz ##T1 isimli global geçici tabloya erişmek için SELECT * FROM A.tempdb.dbo.##T1 yazım biçimiyle erişebileceğimizi düşünürken aşağıdaki hatayla karşılıyoruz.
Database name ‘tempdb’ ignored, referencing object in tempdb.
Oysa aşağıdaki gibi tempdb altındaki nesnelere baktığımızda tabloyu görebiliyoruz fakat tempdb’nin yapısından dolayı nesnelere erişemiyoruz.
SELECT * FROM A.tempdb.sys.sysobjects
WHERE type = 'U'
Bunun için en iyi yöntem OPENQUERY fonksiyonunu kullanmaktır.
SELECT * INTO #t1 FROM OPENQUERY(A, 'SELECT * FROM ##T')
OPENQUERY fonksiyonuyla ilgili daha geniş bilgi için SQL Server Linked Server (Bağlı Sunucu) yazısı okunabilir.
Kas 16
Önceki yazıda SQL Server’in desteklediği mantıksal tablo birleştirme işleminden (Table Join) bahsetmiştik. Bu yazıda da biraz işin mutafağına geçerek birleştirme işlemin hangi fiziksel yöntemlerle yapıldığını özetlemeye çalışacağız. Read the rest of this entry »
Kas 10
Bu makalede genelde ilişkisel veritabanı [Relational Database] sistemlerinin özelde SQL Server’in temel konularından biri olan JOIN seçeneklerini özetleyeceğiz. SQL Server ne tür JOIN seçenekleri sunuyor, bu seçeneklerin birbirinden farkı nedir, olay sadece syntax farklılığı mıdır, performans cephesinden neler oluyor . . . bu soruları yanıtlayacağız. Table veya view gibi kaynakları birbirine bağlayan JOIN ifadeleri bu kaynaklara uygulanmış SELECT, INSERT…SELECT, SELECT…INTO, UPDATE ve DELETE işlemlerinde FROM deyimiyle birlikte kullanılır. Read the rest of this entry »
Eki 05
SQL Server’in önemli özelliklerinden bir olan Linked Server (bağlı sunucu), SQL Server’in OLE DB/ODBC veri kaynakları aracılığıyla farklı kaynaklar (Oracle, Access, Excel, Text …) üzerindeki verilere erişmemize, onlar üzerinde komutlar çalıştırmasına, dağıtık sorguları yönetme imkan tanır. Bir linked server tanımlamak için bir OLE DB provider ve bir OLE DB data source belirtilir. OLE DB provider, Microsoft Data Access Components (MDAC)’ın bir bileşeni olup veri kaynağıyla iletişimi sağlayan ve onu yönetme imkanı sunan kütüphanedir (DLL dosyası). Data Source ise bağlantı kurulacak veri tabanını temsil eder. Her veritabanı için farklı OLE DB provider kullanılır. Örneğin SQL Server tabanlı bir veritabanına erişmek için Microsoft OLE DB Provider for SQL Server OLE DB provider kullanılır. Aynı şekilde .mdb dosyaları için Microsoft OLE DB Provider for Jet, Oracle veritabanına bağlanmak için Microsoft OLE DB Provider for Oracle veri sağlayıcısı kullanılır. Read the rest of this entry »
Eyl 15
Bağıntı/İlişki Sınıfları (Association Classes)
Bağıntı sınıfı, iki nesne arasında kurulmuş bağıntı ile başka bir sınıfın ilişkilendirilmesidir. Bu yöntem ana nesneler arasındaki bağıntının kendisine yeni nitelikler kazandırmak için kullanılır. Örneğin öğrenci-ders bağıntısında öğrencinin kayıt tarihi, kayıt ücreti ve kredisi gibi nitelikler ancak öğrenci o derse kayıt olduktan sonra anlam kazanır. Bu nitelikleri bağıntının kendisine tanımlamak gerekir. Diyagram üzerinde bağıntı sınıfları bağıntıya kesik çizgi ile bağlanır. Read the rest of this entry »
Recent Comments