SQL Server'daki yerel ve genel geçici tablolar arasındaki fark nedir?
SQL Server'daki yerel ve genel geçici tablolar arasındaki fark nedir?
Yanıtlar:
Bu açıklamayı oldukça net buluyorum ( Technet'in saf kopyası ):
İki tür geçici tablo vardır: yerel ve küresel. Yerel geçici tablolar, tabloların ilk oluşturulduğu veya başvurulduğu zamanla aynı SQL Server örneğiyle bağlantı sırasında yalnızca yaratıcıları tarafından görülebilir. Yerel geçici tablolar, kullanıcının SQL Server örneğiyle bağlantısı kesildikten sonra silinir. Genel geçici tablolar oluşturulduktan sonra herhangi bir kullanıcı ve herhangi bir bağlantı tarafından görülebilir ve tabloya başvuran tüm kullanıcıların SQL Server örneğiyle bağlantısı kesildiğinde silinir.
Tablo değişkenleri ( DECLARE @t TABLE
) yalnızca onu oluşturan bağlantı tarafından görülebilir ve toplu iş veya saklı yordam sona erdiğinde silinir.
Yerel geçici tablolar ( CREATE TABLE #t
) yalnızca onu oluşturan bağlantı tarafından görülebilir ve bağlantı kapatıldığında silinir.
Genel geçici tablolar ( CREATE TABLE ##t
) herkes tarafından görülebilir ve bunlara başvuran tüm bağlantılar kapatıldığında silinir.
Tempdb kalıcı tabloları ( USE tempdb CREATE TABLE t
) herkes tarafından görülebilir ve sunucu yeniden başlatıldığında silinir.
1.) Yerel geçici bir tablo yalnızca bir bağlantının süresi boyunca veya bir bileşik ifadesinde tanımlanırsa, bileşik ifadesinin süresi boyunca mevcuttur.
Yerel geçici tablolar, yalnızca tabloları oluşturan SQL Server oturumu veya bağlantısı (tek kullanıcı anlamına gelir) tarafından kullanılabilir. Tabloları oluşturan oturum kapatıldığında bunlar otomatik olarak silinir. Yerel geçici tablo adı tek kare ("#") işaretiyle görüntülenir.
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
Yerel geçici tablonun kapsamı, geçerli sorgu penceresindeki geçerli kullanıcının geçerli oturumunda mevcuttur. Geçerli sorgu penceresini kapatırsanız veya yeni bir sorgu penceresi açarsanız ve yukarıda oluşturulan geçici tabloyu bulmaya çalışırsanız, hata verir.
2.) Genel bir geçici tablo veritabanında kalıcı olarak kalır, ancak satırlar yalnızca belirli bir bağlantıda bulunur. Bağlantı kapatıldığında, genel geçici tablodaki veriler kaybolur. Ancak, bir dahaki sefere veritabanı açıldığında tablo tanımı erişim için veritabanında kalır.
Genel geçici tablolar tüm SQL Server oturumları veya bağlantıları için kullanılabilir (tüm kullanıcı anlamına gelir). Bunlar herhangi bir SQL Server bağlantısı kullanıcısı tarafından oluşturulabilir ve tüm SQL Server bağlantıları kapatıldığında bunlar otomatik olarak silinir. Genel geçici tablo adı çift karma ("##") işareti ile işaretlenir.
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
Genel geçici tablolar tüm SQL Server bağlantıları için görünürken, yerel geçici tablolar yalnızca geçerli SQL Server bağlantısı tarafından görülebilir.
Çevrimiçi Kitaplardan Alıntı:
Yerel geçici tablolar yalnızca geçerli oturumda görünür; genel geçici tablolar tüm oturumlar tarafından görülebilir.
Geçici tablolar, DROP TABLE kullanılarak açıkça düşürülmedikçe kapsam dışına çıktıklarında otomatik olarak bırakılır:
Yerel geçici tablolar : yerel geçici tablolar oluşturup başka bir bağlantı açar ve sorguyu denerseniz, aşağıdaki hatayı alırsınız.
geçici tablolara yalnızca bunları oluşturan oturumda erişilebilir.
Genel geçici tablolar : Bazen, diğer bağlantılara erişilebilen geçici bir tablo oluşturmak isteyebilirsiniz. Bu durumda, genel geçici tabloları kullanabilirsiniz.
Genel geçici tablolar, yalnızca ilgili tüm oturumlar kapatıldığında yok edilir.
Ayrıca şunu da belirtmek gerekir: veritabanı kapsamındaki genel geçici tablolar (şu anda yalnızca Azure SQL Veritabanı tarafından desteklenmektedir).
(## tablo adı ile başlatılan) SQL Server için Küresel geçici tablolar tempdb saklanır ve tüm SQL Server örneği genelinde tüm kullanıcıların oturumları arasında paylaştı.
Azure SQL Veritabanı, tempdb'de depolanan ve veritabanı düzeyine dahil edilen genel geçici tabloları destekler. Bu, genel geçici tabloların aynı Azure SQL Veritabanı'ndaki tüm kullanıcıların oturumları için paylaşıldığı anlamına gelir. Diğer veritabanlarındaki kullanıcı oturumları genel geçici tablolara erişemez.
-- Session A creates a global temp table ##test in Azure SQL Database testdb1 -- and adds 1 row CREATE TABLE ##test ( a int, b int); INSERT INTO ##test values (1,1); -- Session B connects to Azure SQL Database testdb1 -- and can access table ##test created by session A SELECT * FROM ##test ---Results 1,1 -- Session C connects to another database in Azure SQL Database testdb2 -- and wants to access ##test created in testdb1. -- This select fails due to the database scope for the global temp tables SELECT * FROM ##test ---Results Msg 208, Level 16, State 0, Line 1 Invalid object name '##test'
ALTER VERİTABANI KAPSAMLI YAPILANDIRMA
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
UYGULAMALAR: Azure SQL Veritabanı (özellik genel önizlemede)
Genel geçici tablolar için otomatik bırakma işlevinin ayarlanmasına izin verir. Varsayılan AÇIK, yani herhangi bir oturum tarafından kullanılmadığında genel geçici tabloların otomatik olarak bırakıldığı anlamına gelir. KAPALI olarak ayarlandığında, genel geçici tabloların DROP TABLE ifadesi kullanılarak açıkça bırakılması veya sunucunun yeniden başlatılmasında otomatik olarak bırakılması gerekir.
Azure SQL Veritabanı tek veritabanları ve elastik havuzlar ile bu seçenek, SQL Veritabanı sunucusunun bireysel kullanıcı veritabanlarında ayarlanabilir. SQL Server ve Azure SQL Veritabanı yönetilen örneğinde, bu seçenek TempDB'de ayarlanır ve tek tek kullanıcı veritabanlarının ayarının hiçbir etkisi yoktur.
Kullanıcılara Global Temp tablosunu nerede bulabileceğimizi gösteren hiçbir yanıt görmedim. SSMS içinde gezinirken Yerel ve Global geçici tabloları aynı konumda görüntüleyebilirsiniz. Aşağıdaki ekran görüntüsü bu bağlantıdan alınmıştır .
Veritabanları -> Sistem Veritabanları -> tempdb -> Geçici Tablolar