SQL Server - IDENTITY
@@IDENTITY yöntemi, geleneksek olarak, ID’yi öğrenme yöntemi olarak kullanılır. Bu makalede, alternatif yöntemler üzerinde durulacaktır.
IDENT_CURRENT (‘table1’) fonksiyonu
Belirtilen tabloya,
- Herhangi bir veritabanı kullanıcısı tarafından
- Herhangi bir veritabanı bağlantısı (“connection”) içerisinde
- Herhangi bir oturumda (“session”)
- Herhangi bir scope’ta (Scope: TSQL alanı. Scope nedir?)
- Herhangi bir trigger tarafından (eğer kullanılıyorsa)
- Herhangi bir yolla (INSERT, SELECT INTO veya “bulk copy”)
…eklenmiş olan son IDENTITY değerini almak için,
SELECT IDENT_CURRENT (‘table1’) AS ID
...kullanılabilir.
@@IDENTITY değişkeni
Sistemde,
- Herhangi bir veritabanı kullanıcısı tarafından
- Herhangi bir veritabanı bağlantısında
- Herhangi bir oturumda
- Herhangi bir scope’ta
- Herhangi bir trigger tarafından (eğer kullanılıyorsa)
- Herhangi bir tabloya
- Herhangi bir yolla
…eklenmiş olan son IDENTITY değerini almak için,
SELECT @@IDENTITY AS ID
...kullanılabilir.
SCOPE_IDENTITY() fonksiyonu
- Geçerli veritabanı kullanıcısı tarafından
- Geçerli veritabanı bağlantısında
- Geçerli oturumda
- Geçerli scope’ta
- Herhangi bir tabloya
- Herhangi bir yolla
…eklenmiş olan son IDENTITY değerini almak için,
SELECT SCOPE_IDENTITY() AS ID
...kullanılabilir.
Dikkat: @@IDENTITY değişkeni NULL döndürebilir
Veritabanında herhangi bir yerde bir INSERT, SELECT INTO veya “bulk copy” işlemi yapılırsa ve o işlemde, herhangi bir IDENTITY alana değer atanmazsa, @@IDENTITY yöntemi, geriye NULL döndürür. Bu nedenle, sistemde farklı yerlerde seri halde IDENTITY alana değer atayıp-okuyan işlemler varsa ve sistemde arada bir yerlerde, yukarıda tarif edildiği gibi bir kayıt ekleme işlemi yapılırsa, sistemde bir yerlerde rutin devam eden ilk @@IDENTITY işlemi, geriye bir seferliğine NULL döndürebilir ve hata oluşabilir.
Geriye NULL döndürme ile ilgili olarak ayrıntılı bilgi, aşağıdaki Microsoft makalesinde bulunabilir:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ia-iz_82i1.asp
“After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL.”
Dikkat: Bağlantı paylaşımı ihtimalini dikkate alın
ColdFusion gibi bazı uygulama sunucuları, aynı veritabanı bağlantısını, duruma göre, birden fazla web sayfasına (veya istemci yazılıma) kullandırabilmektedir. Böyle bir durumda, sizinle aynı veritabanı bağlantısını kullanan diğer web sayfalarının yaptığı IDENTITY işlemlerinden etkilenmemek için, en garantili yöntem, SCOPE_IDENTITY() kullanmaktır. Böylece, başka scope’lardaki IDENTITY işlemlerinin sizin işlemlerinizi olumsuz etkilemesinin önüne geçmiş olursunuz, desem bile inanmayın... Çünkü, yapılan sınama ve denetimlerde, SCOPE_IDENTITY() fonksiyonunun, @@IDENTITY değişkeni gibi; sistemin biryerlerindeki trigger ve INSERT'lerden vs etkilendiği görülmektedir. Bu nedenle, eğer SCOPE_IDENTITY() fonksiyonu sizin sisteminizde bir şekilde NULL döndürmeye başlamışsa, tüm INSERT ifadelerinizi bir Saklı Yordam (Stored Procedure) içerisine taşıyın. Böyle yaptığınızda, SCOPE_IDENTITY() mutlaka sizin saklı yordamınızda çalıştırılan INSERT ifadelerini baz alacağından, artık SCOPE_IDENTITY fonksiyonu NULL döndürmeyecektir.
Sequence
Oracle ve PostgreSQL gibi bazı veritabanı sunucuları, yeni kayıtlar için ID üretirken, “sequence” isimli yöntemi/nesneyi kullanırlar. Bu yöntemde, bir nevi kalıcı değişken görevini gören bir veritabanı nesnesinin (sequence) tutmakta olduğu sayı, her yeni INSERT ifadesinde bir (“1”) artırılır. Elde edilen yeni sayı, ID alanına kaydedilir. Kural olarak; Sequence bir kez artırıldığında, artık geriye dönüş yoktur. Eğer aynı anda çalışmakta olan başka yerlerdeki SQL ifadeleri de sequence’i artırırsa, sequence, en son kaldığı yerden artmaya devam eder. Böylece, veritabanı çapında ortak olan bu sayı, her zaman için en son ve kararlı ID'yi tutan bir nesne olarak kullanılır. Sequence hakkında ayrıntılı bilgi yine bu sitede
SQL Server 2005 ile birlikte, sequence nesnesi/yöntemi, Microsoft SQL Server’a da eklenmiştir. Güvenle kullanılabilir.
0 yorum:
Yorum Gönder