Aylık arşivler: Temmuz 2012

Identity Değerini Güncellemek – CHECKIDENT

Üzerinde IDENTITY alanı bulunan bir tabloda o alandaki sayılar verilmiş ritmik değere göre ardışık gider. Her yeni kayıtta bu sayı artar. Bu kayıtlardan biri silindiği zaman o satıra ait IDENTITY değeri bir daha kullanılmaz. Dolayısıyla bir süre sonra silmelerden dolayı bu sayı dizisinde çok fazla atlamalar söz konusu olur. Bazı durumlarda bu alanı baştan numaralandırma durumumuz olabilir mi. Bu tablonun başka bir tabloyla ilişkili olması da göz önünde bulundurularak bir güncelleme işlemi yapılabilir.

Veya bir tablodaki kayıtları başka bir tabloya aktardığımızda yeni tablodaki IDENTITY alanını yeniden düzenlemek isteyebiliriz. DBCC CHECKIDENT komutu bu işlemi yapmamızı sağlar.

DBCC CHECKIDENT (‘Tablo Adı’,RESEED, Başlangıç Sayısı)

Aşağıdaki örnekte üzerinde IDENTITY alanı bulunan geçici bir tablo oluşturulmuş ve içerisine sysobjects tablosundaki kayıtlar aktarılmış ardından tablodaki satırların çoğunluğu silinmiş. ID alanı 10 üzerinde olan tüm kayıtlar silindiği için yeni bir kayıt eklendiğinde bu numara

-- IDENTITY bulunan bir tablo oluşturalım
SELECT 
     ID = IDENTITY(INT,1,1)
    ,name
INTO ##T
FROM dbo.sysobjects 
-- 87 kayıt eklendi

-- 10 üzerindeki tüm satırları silelim
DELETE FROM ##T WHERE ID > 10
--77 kayıt silindi

--Tablodaki identity kolonundaki en yüksek değeri okuyalım
SELECT IDENT_CURRENT('##T')
--Bu örnek için 87 döndü. Yani yeni bir kayıt ekleyecek olursa ona 88 değeri verilecek. 
--Oysa tabloda şu anda 10 kayıt var ve 11 ile başlaması daha mantıklı olacaktır.

-- Tabloyu table scan yapıp max identity değerini alalım. Tablodaki en yüsek ID'yi bir değişkene atayalım
DECLARE @maxIdentityValue INT = (SELECT MAX(ID) FROM ##T)
--Bu sorgu 10 değerini döndürecek

-- IDENTITY kolonunun başlangıcını 10 olarak set edeli
DBCC CHECKIDENT('##T', RESEED, @maxIdentityValue)

-- Test amaçlı yeni kayıt ekleyelim. Bu kaydın değeri 11 olarak oluşturulacak
INSERT INTO ##T VALUES('Yeni Kayıt')

SQL Server CONTEXT_INFO Kullanımı

SQL Server ile programlamada bazı durumlarda oturuma özel bir yönlendirme yapma ihtiyacı doğabilir. Bunu yapabilmek için oturumun tekilliğini sağlamak gerekiyor. Bunun yapmanın en basit mantığı o oturumu özelleştirmek için bir parametre gibi bir alan kullanılabilir. Ardından SQL Server tarafında o parametrenin değerine göre koşul yazılabilir. Fakat bunu yapabilmek için her kod parçacığında bu şekilde ek bir parametre veya alan oluşturmak gerekiyor. İşte bu noktada SQL Server’in sunduğu Session Context Information alanı kolaylık sağlamaktadır. Session context information, 128 byte boyutunda bir değer tanımlanmasına izin vererek aynı oturumda multiple batche, stored procedure, triggers veya user-defined function gibi objeler tarafından bu değere otomatik olarak erişilmesini sağlar. O an bu değeri oluşturmak için SET CONTEXT_INFO ifadesi kullanılır. Bu değere o oturumda erişmek için CONTEXT_INFO() fonksiyonu kullanılır. Ayrıca sys.dm_exec_requests, sys.sysprocesses ve sys.dm_exec_sessions DMV’lerde session context’in binary değeri okunabilir. Böylece bu değere göre arama yaparak o oturuma ait talebin yürütülme durumu takip edilebilir.
Okumaya devam et

Tüm Veri Tabanlarından Erişilebilen Prosedür

Tüm veri tabanlarından erişilebilen prosedür yazmak için küçük bir düzenleme yapılması yeterlidir.

Birçok makalede SQL Server’de Stored Procedure isimlendirilmesinden “sp_” ile başlamaması tavsiye edilir. Bunun temel sebebi bu ön ek ile başlayan bir prosedür tam path bilgisiyle çalıştırılmadığı zaman öncelikle sisteme ait bir prosedürmüş gibi aranılır yani master veritabanının altında arama yapılır. Bu da zaman kaybı olduğu için “sp_” ile başlamaması tavsiye edilir.

Bu küçük detayı kendimiz için bir avantaja dönüştürebiliriz. Tüm veri tabanlarından erisilebilecek bir prosedür hazırlamak istersek master veritabanının altında “sp_” ile başlayacak şekilde isimlendirip CREATE etmemiz yeterli olacaktır.