Geliştirdiğimiz uygulamaları yayınlama aşamasına geldiğimizde karşılaşmamız muhtemel en önemli sorunların başında veritabanının sunucuya atılması gelir. Hele de kendi veritabanımız SQL Express edition ise. Veritabanı kopyalamak için birçok yöntem var: Backup-Restore, Detach-Copy-Attach, Copy Database komutu, DTS ya da SSIS. Bunların dışında Generate Scripts aracını da kullanabiliriz. Bu araçların herbiri çeşitli durumlara göre potansiyel kullanım olanaksızlıkları barındırıyor:
• Backup-Restore ve Detach-Copy-Attach yöntemlerini sunucunun klasör yapısına erişimimizin olmaması durumunda kullanamayız.
• Copy Database komutu ” sp_enum_sqlagent_subsystems” nesnesi için yetki problemi ile engellenebilir.
• DTS / SSIS araçları SQL Express Edition’da mevcut değil
• Generate Scripts aracı, primary key ve foreign key’leri üretmede başarısız. Dahası tablo içeriklerini kopyalamıyor.
Oldukça karamsar bir tablo değilmi. Peki bütün bu kısıtlamalar altında veritabanımızı nasıl sunucuya atabiliriz. Çözüm için MS SQL Code Factory gibi birçok 3.parti yazılım mevcut ancak bu makalede bir Microsoft çözümü olan SQL Server Database Publishing Wizard’dan bahsetmek istedim.
SQL Server Database Publishing Wizard yazılımı, veritabanınızın hem data yapısını hem de içindeki bilgileri scripte dönüştürmeye yarıyor. Üstelik Generate Scripts komutunun aksine constraint’leri yok etmeden.
Bu faydalı yazılımı buradan indirebilirsiniz.

Programı kurduktan sonra start menüye C:\Program Files\Microsoft SQL Server\90\Tools\Publishing\SqlPubWiz.exe uygulamasının kısayolunu kuruyor ve Visual Studio içinde Server Explorer tabında bağlantıların sağ menüsüne yeni bir seçenek ekleniyor (Publish to provider).
Bu seçeneğe tıkladığımızda karşımıza Database Publishing Wizard ekranı geliyor.

Bu sihirbazı yönergeler doğrultusunda ilerletip sonlandırdığımızda elimizde veritabanımızı View’lar, Stored Procedure’ler, Function’lar hatta UserDefinedDataType’lar dahil tüm nesneleriyle ve içerik verileriyle yeniden oluşturabileceğimiz bir script yığını oluyor. Bu aşamadan sonra yapacağımız şey, eğer bağlanabiliyorsak Sql Server Management Studio üzerinden remote bağlantı kurarak ya da direkt sunucu panel uygulamasından hedefimizdeki veritabanı üzerinde bu scripti çalıştırmak. Veritabanımız böylece sağlıklı bir şekilde kopyalanmış olacak.
SQL Server Database Publishing Wizard uygulamasının exe dosyası, yolunu yukarıda verdiğim “SqlPubWiz.exe” dosyasıdır. Bu uygulamayı komut satırında da çalıştırmak mümkün. Örneğin aynı anda birden fazla veritabanınızı başka başka yerlere publish etmek ya da sadece script yığınını oluşturmak istiyorsunuz. Herbiri için tek tek grafik arayüzünü çalıştırmak yerine bu işi tek seferde halledebilirsiniz.
SqlPubWiz.exe’nin komut satırı kullanımları şöyledir :
Basit Windows Authentication ile (lokal bilgisayarda çalışıyorsak) :
sqlpubwiz script -d BenimDatabaseim C:\BurayaOlustur.sql
ConnectionString belirterek (böylece TCP/IP üzerinden bağlanma yetkisine sahip olduğumuz Sql Server’larda bile script oluşturabiliriz.)
sqlpubwiz script -C “connection_string” C:\database.sql
SQL Server Authentication (ConnectionString ile yapılanın biraz daha basit olanı)
sqlpubwiz script -d [DB ADI] -S [SERVER] -U [USER ID] -P [PASSWORD] C:\database.sql
SqlPubWiz tüm komut satırı parametreleri
sqlpubwiz script ( -C connection_string | -d local_database_name ) (output_file) [switches]
switches:
Output options:
[-f] : Overwrite existing files
[-noschemaqualify] : Output script does not qualify object names with schema name.
[-schemaonly] : Only script schema
[-dataonly] : Only script data
[-targetserver] : Specifies what version of SQL Server the script should target. Valid versions are “2000″, “2005″. Default Value: 2005
[-q] : Suppress output
[-nodropexisting] : Default Value: False
Local connection related:
[-C connection_string] : Connection string
[-d local_database_name] : Database name to script
[-U local_user_name] : Username
[-P local_password] : Password
[-S local_server_name] : Server name
sqlpubwiz publish ( -C connection_string | -d local_database_name ) ( web_service_options ) [switches]
switches:
Web service options:
[-R hoster_name] : Name of hoster as specifying in configuration file.
[-RW remote_web_service_addr] : Specifies the web service address.
[-RWP remote_service_password] : Specifies password for publishing web service.
[-RWU remote_service_username] : Specifies username for publishing web service.
[-RS remote_database_server ] : Specifies the remote database server.
[-RD remote_database_name] : Specifies the database name to publish to on the remote database server.
[-RU remote_database_username] : Specifies the username to login with on the remote database.
[-RP remote_database_password] : Specifies the password to login with on the remote database.
[-notransaction] : Specifies that the publish operation will not occur in single transaction. Default Value: False
Output options:
[-noschemaqualify] : Output script does not qualify object names with schema name.
[-schemaonly] : Only script schema
[-dataonly] : Only script data
[-targetserver] : Specifies what version of SQL Server the script should target. Valid versions are “2000″, “2005″. Default Value: 2005
[-q] : Suppress output
[-nodropexisting] : Default Value: False
Local connection related:
[-C connection_string] : Connection string
[-d local_database_name] : Database name to script
[-U local_user_name] : Username
[-P local_password] : Password
[-S local_server_name] : Server name
Makalemi sonlandırmadan önce Database Publishing Wizard ile ilgili başka ne anlatabilirim diye biran düşündüm ve bir fikir geldi aklıma. Onu da paylaşarak bu yazımı da bitireyim: SQL Server’ın Shrink aracını bilirsiniz, silinmiş verilerle şişen veritabanımızı “tıraşlayan” güzel bir yardımcıdır. Veritabanımızın LOG dosyasının GB’lar seviyesinde aşırı şiştiği durumlarda Shrink’i kullanarak yerden tasarruf etmeye çalışırız. Fakat LOG dosyasını tamamen resetleyemeyiz. Backup-Restore da LOG dosyasını olduğu gibi yüklediğinden ondan da umut yok. İşte Database Publishing Wizard burada işimize yarayabilir. Şöyleki script’e dönüştürdükten sonra database’imizi silersek ve sonra scriptimizi çalıştırarak yeniden oluşturursak tüm verileri içinde fakat LOG dosyası tertemiz bir veritabanımız olur. Ben denedim, sonuç harika.
Son olarak bu yazılımın web service uygulamasının da olduğunu belirteyim. Buradan inceleyebilirsiniz.


#0