1 Ocak 2019 Salı

Sql Server‘da belli bir veri tabanında en büyük tabloları bulmak

Sql Server‘da belli bir veri tabanında en büyük tabloları bulmak için aşağıdaki sorguyu çalıştırabiliriz;
DECLARE @TabloBoyutlari TABLE (TabloAdi VARCHAR(50), SatirSayisi INT, AyrilmisAlan VARCHAR(50), KullanilanAlan VARCHAR(50), IndexBoyu VARCHAR(50), KullanilmayanAlan VARCHAR(50))

INSERT INTO @TabloBoyutlari EXECUTE sp_MSforeachtable 'sp_spaceused [?]'

SELECT * FROM @TabloBoyutlari ORDER BY CONVERT(INT, REPLACE(AyrilmisAlan, 'KB', '')) DESC

28 Eylül 2018 Cuma

MsSql Log dosyasını küçültme

--1. Adım Veritabanı kurtarma modelini SIMPLE olarak değiştirecek.
USE   DATABASE_ISMI
ALTER DATABASE  DATABASE_ISMI
SET RECOVERY SIMPLE
GO

--2. Adım Kesilmiş günlük dosyasını 100 MB'ye küçültün.
USE   DATABASE_ISMI
DBCC SHRINKFILE (DATABASE_ISMI_log, 100)
GO

--3. Adım Veritabanı kurtarma modelini sıfırlayın.
USE   DATABASE_ISMI
ALTER DATABASE  DATABASE_ISMI
SET RECOVERY FULL
GO

4 Ekim 2017 Çarşamba

MSSQL üzerindeki tablolarda INDEX bakımı

Zaman zaman sizlerinde başına gelmiştir, çeşitli veritabanları ile çalışırken gayet düzgün çalışan bir veritabanı bir anda kararsız duruma düşebilir ya da yavaşlayabilir.
Bunun temel nedenlerinden bir tanesi tablolarda kullanılan INDEX yapılarının fragmantasyonlarının bozulmasıdır.
Peki bu durumları nasıl tespit edebiliriz ya da index yapısı bozuldu diyelim. Bunu nasıl düzeltebiliriz?
Normal şartlarda her tablonun index özelliklerine girip ilgili fragmantasyon değerinin kontrol edilmesi ve buna göre yine aynı menü üzerinden REPAIR ya da REBUILD işleminin yapılması gerekir.
Fakat veritabanı sayınız 5 den fazla ve her DB üzerindeki tablo sayınızda 20 den fazla ise çok işim var! demekte haklısınız 
Malumunuz programcı dediğin ya çok tembel olur (kendine göre) ya da çok pratik olur (diğerlerine göre) bu durumda da mutlaka bir çözüm bulabilir 
İlk olarak yapılması gereken işlem: Query Editor üzerinde
select * from sys.dm_db_index_physical_stats (DB_ID(),null,null,null,'LIMITED') WHERE avg_fragmentation_in_percent >10.0 and index_id>0
komutu ile veritabanlarımız üzerindeki dağılmış indexlerin (%10 dan  fazla) durumunu öğreniriz.
ancak gelen sorgu sonucunda da görebileceğiniz gibi kolonlarda ne bir DB adı ne de Index adı bulunmuyor, peki bu bilgileri nasıl öğrenebiliriz.
Çözüm
CREATE FUNCTION dbo.index_name (@object_id int, @index_id int)
RETURNS sysname
AS
BEGIN
RETURN(SELECT name FROM sys.indexes WHERE
object_id = @object_id and index_id = @index_id)
END;
GO
ile öncelikle fonksiyonumuzu yaratıyoruz. Sonra da;
SELECT
OBJECT_NAME(object_id) AS tabloadi
,dbo.index_name(object_id, index_id) AS indexadi
,avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL)
WHERE avg_fragmentation_in_percent > 20
AND index_type_desc IN('CLUSTERED INDEX', 'NONCLUSTERED INDEX')
ile hangi tablonun hangi index verisi ne oranda bozulmuş görebiliyoruz.
Artık hangi tabloda hangi index bozulmuş gördüğümüze göre bunları elimizle düzeltebiliriz. Yok ben yine tembelliğimden şaşmak istemiyorum 
Aşağıdaki kod ile tüm veritabanlarında yer alan tüm index yapıları kontrol ediliyor ve fragmantasyon yapılıyor
DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE @fillfactor INT

SET @fillfactor = 90 
DECLARE DatabaseCursor CURSOR FOR
SELECT name FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')
ORDER BY 1

OPEN DatabaseCursor

FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS = 0
BEGIN

SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
table_name + '']'' as tableName FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES
WHERE table_type = ''BASE TABLE'''

/* create table cursor  */
EXEC (@cmd)
OPEN TableCursor

FETCH NEXT FROM TableCursor INTO @Table
WHILE @@FETCH_STATUS = 0
BEGIN

IF (@@MICROSOFTVERSION / POWER(2, 24) >= 9)
BEGIN
/* SQL 2005 veya sonrası*/
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
EXEC (@cmd)
END
ELSE
BEGIN
/* SQL 2000 */
DBCC DBREINDEX(@Table,' ',@fillfactor)
END

FETCH NEXT FROM TableCursor INTO @Table
END

CLOSE TableCursor
DEALLOCATE TableCursor

FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor 
İşte hepsi bu kadar…
Siteden SQL komutlarını kopyala yapıştır ile alırken sorun yaşayan kullanıcılar için bu kodları TXT formatında kaydettim isteyenler SQL Server Index Bakımı adresinden ulaşabilir.


12 Kasım 2014 Çarşamba

MVC 4 ve 5 ÜYELİK SİSTEMİ (Membership) VERİTABANI OLUŞTURMA

Yapılması Gerekenler
1. C:\Windows\Microsoft.NET\Framework\v4.0.30319 dizini alltındaki "Aspnet_regsql.exe"  uygulamasını yönetici olarak çalıştırıyoruz.

2. Yapılandırma için ekleme seçeneğini seçin ve ileri yapın.

3. SQL Server bilgilerini girin ve ilgili Veritabanınızı seçin

4. İşlem başarı ile gerçekleşti (İnşallah) bitişe tıklıyoruz.

5. Gördüğünüz gibi veritabanımıza gerekli tablolar eklendi.
6. Sıra geldi Web.Config dosyasında bulunan  DefaultConnection cümlemizi oluşturmaya,
add name="DefaultConnection" connectionString="Data Source=Server_Adı; Initial Catalog=Database_adı; Persist Security Info=True; User Id=User_Adı; Password=Sifre" providerName="System.Data.SqlClient"

7 Nisan 2014 Pazartesi

21 Eylül 2013 Cumartesi

Mvc 4 Basit Üyelik Sağlayıcı (SimpleMembershipProvider) Sql server çalışma sorunu

Herkese merhaba Mvc ile çok makale paylaşamıyorum ama yıllar önce fark ettiğim gerçekler bu gün net olarak kendini gösteriyor mvc 1,2 derken 4 oldu şuan 5 de çıktı. Bence büyük küçük tüm web projelerinin vazgeçilmezi. Büyük projelerin tek tek Mvc ye döndüğü günümüzde yeni başlayan arkadaşlara önerim teknolojideki gelişmeleri yakından takip etmeleri. Yeni bir teknoloji çıktığında ilk bilenlerden olun bu heyecanı hiç bir zaman kaybetmeyin. Yeni yazılım teknikleri biz kod yazarlara kolaylık ve güvenlik getirdiği için kullanmadan faydasını anlayamazsınız.

Gelelim mvc 4 SimpleMembershipProvider sql serverde çıkacak basit hatasına.

ilk önce bir tane MVC 4 projesi oluşturalım sizinde fark ettiğiniz gibi register dan yeni üyelik işlemi yaptığınızda proje içinde yeni Database oluşacak. Bu database içinde olan 5 tabloyu kendi sql db içinde oluşturun.

Sıra geldi Web.Config dosyasında bulunan  DefaultConnection cümlemizi oluşturmaya,
add name="DefaultConnection" connectionString="Data Source=Server_Adı; Initial Catalog=Database_adı; Persist Security Info=True; User Id=User_Adı; Password=Sifre" providerName="System.Data.SqlClient"

Filters altındaki InitializeSimpleMembershipAttribute.cs içindeki
//WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); Satırını Global.asax içine taşıyacağız. Aslında buna gerek yok sorun yaşarsanız yapın. Ama en çok açtığınız user isimlerinin büyük harfle ve ing olmasına dikkat edin hata almazsınız.


Bu işlemlerden sonra yeni üyeler sizin belirtiğiniz Database'e kayıt olacaktır.
  

SQL Serverda Yılın,Ayın ve Haftanın İlk ve Son Günleri

Örneğin bugünün 29.12.2011 olduğunu düşünürsek ayın ilk günü bulmak için öncelikle bu tarihin ayın kaçıncı günü olduğu DAY fonksiyonu ile bulup daha sonra çıkan gün kadar eksi gün sayısını elimizdeki tarih değerine eklersek ayın ilk gününü bulmuş oluruz. Şimdi bugünün tarihini baz alarak örneklerimizi yapalım.

DECLARE @tarih DATETIME=GETDATE() SELECT 'Onceki Ayın Son Gunu' Aciklama,CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(@tarih)),@tarih),112) Tarih UNION ALL SELECT 'Ayın İlk Günü',CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(@tarih)-1),@tarih),112) AS Date_Value UNION ALL SELECT 'Bugunun Tarihi',CONVERT(VARCHAR(10),@tarih,112) AS Date_Value UNION ALL SELECT 'Ayın Son Günü',CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(DATEADD(mm,1,@tarih))),DATEADD(mm,1,@tarih)),112) UNION ALL SELECT 'Sonraki Ayın İlk Günü',CONVERT(VARCHAR(10),DATEADD(dd,-(DAY(DATEADD(mm,1,@tarih))-1),DATEADD(mm,1,@tarih)),112) UNION ALL SELECT 'Haftanın İlk Günü', DATEADD(ww, DATEDIFF(ww,0,GETDATE()), 0) UNION ALL SELECT 'Sonraki Haftanın İlk Günü', DATEADD(ww, DATEDIFF(ww,0,GETDATE())+1, 0) UNION ALL SELECT 'Yılın İlk Günü',DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) UNION ALL SELECT 'Yılın Son Günü',DATEADD(dd,-1,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0)))