最近嘗試了一下subversion,覺得還不錯,於是將現有專案的所有檔案都新增到了版本庫中。不過在對sql server的資料庫檔案進行版本控制時出現了一點小麻煩,大家都知道當sql server的資料庫檔案附加到資料庫引擎上時是不能複製的,在這個時候subversion的客戶端工具甚至不能檢測到這些檔案!於是在每次簽入、簽出的時候都要開啟sql server management studio進行資料庫的分離與附加,非常麻煩。
恰好sql server提供了乙個命令列工具sqlcmd,於是我想能不能借助這個工具編寫批處理檔案,將資料庫的分離和附加自動化呢?經過嘗試之後發現這是可行的,下面介紹一下如何將此自動化。
首先說明一下我的專案目錄的樹形結構:
articlecenter是專案名稱,在該資料夾下有乙個database子資料夾,裡面只有mdf和ldf兩個資料庫檔案。attach.bat和detach.bat分別是附加和分離資料庫的批處理檔案,直接雙擊這兩個檔案就可以執行相應的操作。
接下來看看如何使用sqlcmd,這個工具擁有很多的命令引數,但這裡只使用了其中的幾個:
sqlcmd -i 《檔名》
-i引數後面跟乙個sql檔案的檔名,表示執行這個sql檔案裡的sql語句。
sqlcmd -q -q引數後面跟一條sql語句,表示執行該sql語句。注意sql語句要用雙引號括起來,而且q不能是小寫。
另外,一般執行sql語句之前都要連線和登入資料庫引擎,這是通過-e,-s等引數指定的,如果省略這些引數,就是使用window身份驗證連線本地資料庫引擎。關於sqlcmd就介紹到這裡,如果對這個工具有興趣的話,可以執行sqlcmd -?命令獲取更多的幫助。
附加資料庫的sql語句如下:
use [master]
gocreate database [articlecenter_database] on
( filename = n'e:\zplutor\documents\projects\articlecenter\database\articlecenter_database.mdf' ),
( filename =n'e:\zplutor\documents\projects\articlecenter\database\articlecenter_database_log.ldf' )
for attach
go這裡有兩條語句,而且比較長,我們可以先動態構造出這些語句,存放在檔案中,然後通過sqlcmd -i命令來執行。下面就是attach.bat檔案的完整內容:
@echo off
echo use [master] >> create.sql
echo go >> create.sql
for %%i in (*.mdf) do echo create database [%%~ni] on >> create.sql
for %%i in (*.mdf) do echo (filename = n'%%~dpnxi'), >> create.sql
for %%i in (*.ldf) do echo (filename = n'%%~dpnxi') >> create.sql
echo for attach >> create.sql
echo go >> create.sql
sqlcmd -i create.sql
del create.sql
echo.
pause
為了讓這個批處理更通用,不能將資料庫名稱和資料庫檔案路徑硬編碼到**中,而是通過在執行時動態獲取這些資訊。對於批處理來說,for語句是最佳的選擇。
for語句會遍歷滿足括號中條件的所有檔案,將每個檔案的完整檔名(這裡的完整檔名指檔名加上副檔名)儲存到指定的變數中(在這裡這個變數就是%%i),然後執行do後面的批處理語句。在這個語句中可以使用%%i標記,它將會被替換成完整檔名。
%%~ni
該標記將被替換成檔名,不包括副檔名。
%%~xi
該標記將被替換成檔案的副檔名。
%%~pi
該標記將被替換成檔案的路徑,該路徑不包括驅動器碟符以及檔名。
%%~di
該標記將被替換成檔案所在驅動器的碟符。
以上標記可以任何搭配使用,例如%%~dpnxi將被替換成檔案的完整路徑。
第一條for語句對當前資料夾中的所有mdf檔案執行do後面的批處理語句,也就是將echo後面的內容輸出到檔案中,%%~ni將會被替換成檔名,不包含副檔名。第二條和第三條語句也是一樣,其中%%~dpnxi將會被替換成檔案的完整路經。
attach.bat檔案的內容就是如此簡單,而detach.bat就更簡單了。分離資料庫的sql語句是:
exec master.dbo.sp_detach_db @dbname = n'articlecenter_database',@keepfulltextindexfile=n'true'
由於只有一條語句,就不需要輸出到檔案中了,使用sqlcmd -q命令即可。以下是detach.bat檔案中的內容:
@echo off
for %%i in (*.mdf) do sqlcmd -q "exec master.dbo.sp_detach_db @dbname = n'%%~ni', @keepfulltextindexfile=n'true'"
echo.
pause
SQL Server 自動化功能
為了保證安全,資料庫每天都要備份很多次,如果讓人來按時按點的進行備份,是很不現實的。這時,我們可以通過sql server 自動化的功能來完成資料庫的備份操作。自動化功能包括 了解了自動化的功能,接下來我們了解一下自動化管理元素都有哪些。自動化管理元素 使用自動化過程中,會使用警報將錯誤的操作資訊報...
SQL Server 自動化運維系列
本系列為sql server自動化運維的一些操作技巧點,所有內容都是根據日常運維過程中最經常遇到的問題,並為此形成了一些自動化運維的方式,皆為原創.供部分dba和開發人員瀏覽借鑑,所應用平台基於微軟server平台,所利用技術為power shell,所關注的點為sql server.1 sql s...
SQL Server 自動化運維系列
本系列為sql server自動化運維的一些操作技巧點,所有內容都是根據日常運維過程中最經常遇到的問題,並為此形成了一些自動化運維的方式,皆為原創.供部分dba和開發人員瀏覽借鑑,所應用平台基於微軟server平台,所利用技術為power shell,所關注的點為sql server.1 sql s...