Makaleler
Sunumlar
Duyurular
Etkinlik Programı
Web Seminerler
Etkinlik Kayıtları
Videolar
Podcast
Kayıtlı İçerik
Forum
İletişim
Hakkımızda
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)
Ekleyen: Mehmet GÜZEL Türkiye Finans Katılım Bankası SQL Server DBA
Yiğit Aktan
19.12.2011 11:21
Selamlar, İki konuda ufak bilgi vereyim. ALTER Script'lerinde ki son satırı şu şekilde değiştirirsek daha iyi olacaktır. Aksi halde gözden kaçıracak arkadaşlar olabilir. alter database [databasename_new] set multi_user with rollback immediate Birde session'ları KILL etmek için yazdığınız script'te local variable'ı direk declaration'da set edersek bu sadece 2K8+ kullanımı için geçerli olacaktır. Günümüzde 2K5'in yaygın kullanımını göz önünde bulundurursak code'u aşağıdaki gibi değiştirebiliriz. declare @tsql varchar(max) set @tsql = ''
Üye Girişi
Kullanıcı Adınız
Şifreniz
Beni Hatırla
Arkadaşına Tavsiye Et
Tavsiye edebilmek için siteye giriş yapmalısınız