Merhaba,
SQL Server 2005 ten beri hayatımıza giren Management Studio (Daha önce farklı bir yapıdaydı) üzerinde 2008 ile beraber yapılan bazı değişiklikler bazı yeni başlayan kullanıcıları zora sokmaktadır. Bu noktada size yardımcı olacağını düşündüğüm bir kaç detayı sizle paylaşmak istiyorum.
Öncelikli olarak bazı kavramları yerine oturtmak lazım. Management Studio SQL Serverin bir hizmet parçası değildir. Bu uygulama yönetim ve development amaçlı özelleşmiş bir client uygulamadır. Bu uygulama normal şartlarda SQL Server üzerinde T-SQL kullanarak yapabildiğimiz bir çok şeyi kullanıcı açısından daha hızlı ve kolay yapmamıza imkan sağlamaktadır. Management Studionun amacı database üzerinden rapor almak,çıktı almak,günlük güncelleme ve veri girişi yapmak değildir.
Microsoft SQL Server 2005 ile hedeflerini büyütürken,2008 ile beraber gözünü çok daha yükseklere dikti. Daha önceleri managment studio üzerinde dikkat etmediği ve bilinçsiz kullanıcılar açısından çok tehlikleri olabilecek bazı ekranlardada düzenlemelere gitti.
Şimdi bu konuda 2 yere dikkatinizi çekeceğim ve yazımız bu konular üzerine olacak.
1. Management Studio üzerinde tablolara sağ tuşla tıkladığımız zaman karşımıza çıkan Edit Top 200 Rows ve Select Top 1000 Rows

2. Save changes not permitted ..

İlk başılığı inceleyecek olursak, Eskiden Open Table dediğimizde tabloda bulunan bütün kayıtlar emirimize amade geliyordu. Bu ekran hem select hemde edit amaclı kullanılıyordu. 2008 ile beraber işler biraz değişti. SQL Server üzerindeki veritabanlarında bulunan tablolarda artık eskisi gibi binlerle ifade edilen sayıda kayıt bulunmuyor. Milyonlara ve milyarlara varan kayıt sayıları açısından baktığımızda ise bilinçsiz bir kullanıcının eski gibi acaba bu tabloda ne var dediğini düşenelim. Çok zaman alacak ve kaynakları gereksiz yere tüketecek bir süreç. Bu risk yeni yapıda dikkate alınarak Microsoft tarafından sınırlandırılmıştır.
Bu noktada arzu edene kullanıcılar için yinede bu kısıtları değiştirme imkanı mevcuttur. Management Studio’a ait menüden Tools->Options tıklandığında karşımıza çıkacak ekran bir çok derdimizin dermanı. Burda SQL Server Object Explorer sekmesine girdiğimizde karşımıza çıkan ekrandan gerekli ayarlamaları yapabiliriz. Eğer eski günlere dönelim diyorsanız 0 değerini vererek bütün kayıtları getir yapabilirsiniz.

İkinci başlığımıza baktığımızda ise çok daha büyük bir tehlikenin Management Studio tarafından engellendiğini görmekteyiz. Veritabanı üzerinde bulunan tabloların tasarımını bitirdikten hatta veri girdikten sonra bazı sebeplerden tablo üzerinde yapısal değişiklikler yapmaya karar verebiliriz. Bazı değişiklikler sistem tarafından ALTER marifeti ile kolayca ve zahmetsiz olarak gerçekleştirilebilir. Fakat bazı değişikler vardırki bunlar ALTER operasyonu ile yapılamaz şimdi bu işlemlere örnek olması açısından aşağıdaki durumları inceleyelim.
a. Varolan bir tabloya Deneme adından nvarchar(50) bir alan eklemeye çalıştığımızda Management Studio bu işlemi ALTER marifetiyle sorunsuz bir şekilde halletmektedir.

Bu işlem için Managment Studionun ürettiği kodu incelediğimizde durumu daha net görebiliriz.
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.SeciliRenkler ADD
Deneme nvarchar(50) NULL
GO
ALTER TABLE dbo.SeciliRenkler SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
b. Peki ya varolan tablodaki Renk alanını nvarchar(50) den nvarchar(100) değiştirmeye kalktığımızda! Management Studionun bizi bu işlemin Re-Creation (Tablonun Tekrar Yaratılması) gerektirdiği şeklinde uyardığını ve varsayılan ayar olarak buna izin vermediğini görüyoruz. Nedir bu durum?
Managment Studio bu değişiklik işlemimi ALTER komutu marifetiyle gerçekleştiremektedir. Bu değişiklik için
1. Geçici dbo.Tmp_SeciliRenkler ismiyle yeni duruma uygun bir tablo oluşturmakta
2. Varolan SeciliRenkler tablosundaki bütün kayıtları buraya eklemekte
3. Eski tabloyu silmekte ve Yeni Tablonun adını eskisiyle değiştirmektedir.
Bu işlemin içerisinde 30 Milyon satır veri olan bir tablo üzerinde gerçekleştirilmeye çalışıldığını bir düşünsenize, Microsoft bu durumu engellemekte haklı değilmi? Konuya dair değişim kodunu aşağıda bulabilirsiniz.
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_SeciliRenkler
(
RenkID int NOT NULL,
Renk nvarchar(100) NOT NULL,
Deneme nvarchar(50) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SeciliRenkler SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.SeciliRenkler)
EXEC('INSERT INTO dbo.Tmp_SeciliRenkler (RenkID, Renk, Deneme)
SELECT RenkID, Renk, Deneme FROM dbo.SeciliRenkler WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.SeciliRenkler
GO
EXECUTE sp_rename N'dbo.Tmp_SeciliRenkler', N'SeciliRenkler', 'OBJECT'
GO
ALTER TABLE dbo.SeciliRenkler ADD CONSTRAINT
PK_SeciliRenkler PRIMARY KEY CLUSTERED
(
RenkID
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
Siz tabiki bu değişikliği yinede yapmak isteyebilirsiniz. Bu durumda bu engellemeyi ortadan kaldırmak gerekecektir. Bunun için menüden tekrar Tools->Options alanına girelim. Burdan resimde belirtilen seçeneğin check kaldıralım. Bu bize istediğimizi verecektir.

Veritabanı tasarımlarında mümkün olan herşeyi önceden hesaplamak ve tasarımı ona göre yapmak sizi daha sonra doğabilecek bir çok sorundan kurtaracaktır. Başka bir yazıda görüşmek üzere.