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)

Hiç yorum yok:

.::YASAL UYARI::.

©2004-2016 Mehmet GÜZEL, http://www.mehmetguzel.net/ & http://www.mehmetguzel.com/

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