DMV etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
DMV etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

2012-12-26

Silinen Bir SQL Modülünün Kodunu Geri Kurtarma

İki tarih arasında sildiğiniz trigger, stored procedure, view, function'ın kodunu aşağıdaki T-SQL kodu ile alabilirsiniz:

declare @StartDate Datetime='2012-01-01',
@EndDate Datetime='2013-01-01'

select convert(varchar(max),substring([rowlog contents 0],33,len([rowlog contents 0]))) as [script]
from fn_dblog(null,null)
where [operation]='lop_delete_rows' and [context]='lcx_mark_as_ghost'
and [allocunitname]='sys.sysobjvalues.clst'
and [transaction id] in (select distinct [transaction id] from    sys.fn_dblog(null, null)
where context ='LCX_NULL'
and operation ='LOP_BEGIN_XACT'
and [transaction name]='DROPOBJ'
and  convert(nvarchar(11),[Begin Time]) between @StartDate AND @EndDate)
and substring([RowLog Contents 0],33,len([RowLog Contents 0]))<>0

Not: T-SQL kod SQL Server 2012 ile test edildi.

2011-10-02

Windows Authentication Olarak Bağlanan Kullanıcının Security Grubunu Bulma

SQL Server veritabanı sistemine windows authentication olarak bağlanan bir kullanıcının security grubunu iki farklı şekilde bulabilirsiniz.

2011-08-18

Veritabanı Adını Değiştirme - Change Database Name

Bir çok yerde ismi değiştirilecek veritabanı önce single_user mode alınıp ardından isim değişikliği yapacak T-SQL kodlar paylaşılıyor. Evet, ismi değiştirilecek veritabanı adını single_user mode alıp değiştirebilirsiniz hatta SQL Server ile ilgili bir çok kaynakta Master veritabanını seçtirerek single_user moda alma şeklinde yapılmış. Fakat sakın ola master veritabanı seçili iken ismini değiştireceğiniz veritabanını single_user moda almayın; aşağıdaki gibi hata mesajları alırsınız:

Hata Mesajı-1:
“Msg 5064, Level 16, State 1, Line 1
Changes to the state or options of database 'databasename' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.”

Hata Mesajı-2:
"Msg 1205, Level 13, State 68, Line 1
Transaction (Process ID XXX) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed."

Bu durumda ilgili veritabanına tüm erişimleri kesmeden veritabanı ismini değiştirip multi_user moda alamazsınız. Önce single_user  moda alıp veritabanını ismini değiştirecekseniz ilgili scriptinizi ismini değiştirmek istediğiniz veritabanını seçerek(USE) single_user mode alınız. Bu durumda single_user sizin mevcut bağlantınız olur. Bu tür sorunları ve sistem kesintisine mahal vermemek için aşağıdaki iki scripten dilediğinizi kullanıp uygulayabilirsiniz:

Script-1:

use [master]
go
-- set database to restricted_user mode
alter database [databasename] set restricted_user with rollback immediate

-- rename database name
alter database [databasename] modify name = [databasename_new]

--set database to multi-user mode
alter database [databasename] set multi_user with rollback immediate

Script-2:
use [databasename]
go

-- set database to restricted_user mode
alter database [databasename] set single_user with rollback immediate

-- rename database name
alter database [databasename] modify name = [databasename_new]
--set database to multi-user mode
alter database [databasename] set multi_user with rollback immediate


Not:  İlgili veritabanını kullanmaya çalışan session'ları aşağıdaki kod ile sonlandırabilirsiniz:

declare @tsql varchar(max)=''

select distinct @tsql = @tsql + 'kill ' + cast(request_session_id as varchar(16)) +';
'
from sys.dm_tran_locks
where resource_database_id=db_id('databasename')
group by request_session_id

exec(@tsql)

2011-07-04

LOGINPROPERTY

Login policy ayarları hakkında bilgi verir.


Syntax:
LOGINPROPERTY ( 'login_name' , 'property_name' )

Parametreler:
login_name: Hakkında bilgi alınacak SQL Server login adı
propertyname: Login için bazı özellik bilgileri geri döndürür. Propertyname aşağıdaki değerlerden birini olabilir:

BadPasswordCount : Yanlış bir parola ile girişlerin ardışık denemelerinin sayısını döndürür.

BadPasswordTime : Yanlış bir parola ile giriş yapmak için son girişim zamanını döndürür.

DaysUntilExpiration : Parolanın süresi kadar gün sayısını döndürür.

DefaultDatabase : Kullanıcının giriş için default veritabanını döndürür.

DefaultLanguage : Kullanıcının giriş için varsayılan dilini döndürür.

HistoryLength : Şifre politikası uygulama mekanizmasını kullanarak, giriş için izlenen parola sayısını döndürür. 0: Password Policy uygulanmıyorsa. 1: Password Policy uygulanıyorsa.

IsExpired : Oturum açma süresinin dolup dolmadığı hakkında bilgi verir.

IsLocked : Loginin kilitli olup olmadığı hakkında bilgi verir.

IsMustChange : Bir sonraki girişte şifrenin değiştirilmesinin gerekip gerekmediğini hakkında bilgi verir.

LockoutTime : Lock tarihini geri döndürür.

PasswordHash : Şifrenin hash halini geri döndürür.

PasswordLastSetTime : Geçerli parolanın set edildiği tarihi döndürür.

Not: Login üzerinde VIEW yetkisini gerektirir. Password Hash için CONTROL SERVER yetkisini gerektirir.

Örnek-1: Mehmet kullanıcısının bir sonraki oturumda şifresinin değiştirilmesinin zorunlu olup olmadığını kontrol edelim

SELECT LOGINPROPERTY('mehmet', 'IsMustChange');

Örnek-2: Mehmet kullanıcısının lock olup olmadığını kontrol edelim

SELECT LOGINPROPERTY('mehmet', 'IsLocked');

Örnek-3: Lock olan tüm kullanıcıların listesini aşağıdaki T-SQL ile alabilirsiniz:

select name
from sys.server_principals
where loginproperty(name, 'IsLocked') =1

2011-01-26

SQL Server Servisinin Başlangıç Tarihini Bulma

SQL Server servisi her start olduğunda tempdb yeniden oluşturulur. Bu yüzden tempdb veritabanının oluşma tarihi bize SQL Server servisinin başlama tarihini verir. SQL Server servisim ne zamandan beri açık diye merak edenler aşağıdaki sorgu ile cevaplarını bulabilirler:

select create_date
from sys.databases
where name = 'tempdb'

Aynı sonuca dm_os_sys_info DMV'sini kullanarak aşağıdaki kod ile de  ulaşabilirsiniz:

select sqlserver_start_time
from sys.dm_os_sys_info

2010-11-11

Index Fragmentation

Bir tablo yada view'daki index ve data fragmantasyonunu sys.dm_db_index_physical_stats DMV'si ile alabilirsiniz.

Örnek-1: Test adlı veritabanımızdaki musteri adlı tablomuzun fragmantasyonu aşağıdaki SQL kodu ile alabiliriz:

select * from sys.dm_db_index_physical_stats(db_id('Test'),object_id('musteri'),null,null,null)

Örnek-2: Test adlı veritabanımızdaki tüm tablo ve view'lerimizin fragmantasyonu aşağıdaki SQL kodu ile alabiliriz:

select * from sys.dm_db_index_physical_stats(db_id('Test'),null,null,null,null)

Örnek-3: Tüm veritabanlarımızdaki tüm tablo ve view'lerimizin fragmantasyonu aşağıdaki SQL kodu ile alabiliriz:

select * from sys.dm_db_index_physical_stats(null,null,,null,null,null)

Fragmente oranı %30 dan büyük olan indexlerinizi rebuild etmenizi; %10-%30 arasında olan indexlerinizi ise reorganize etmenizi tavsiye ederim.

2010-10-26

Logical/Physical CPU Sayısını Bulma

SQL Server 2008 ve SQL Server 2008 R2 sürümlerinde logical/physical cpu sayısını aşağıdaki sql kodu ile alabilirsiniz:

SELECT cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count]
FROM sys.dm_os_sys_info;

2010-10-15

SQL Server'ın Başlatıldığı Zamanı Bulma

SQL Server'ın başlangıç zamanını SQL Server 2008 ile birlikte gelen sys.dm_os_sys_info DMV'i ile aşağıdaki gibi bulabilirsiniz:

SELECT sqlserver_start_time
FROM sys.dm_os_sys_info

.::YASAL UYARI::.

©2004-2024 Mehmet GÜZEL, www.mehmetguzel.net

Site içeriği kaynak gösterilmek koşuluyla yayınlanabilir. Yazılan yazı ve yorumlar sadece yazı ve yorum sahiplerini bağlar.