使用指令建立 SQL LocalDB mdf 檔
2 | 5,418 |
SQL LocalDB 是開發測試 SQL 程式的好夥伴,免費,比 SQL Server 輕巧,行為模式比照標準 SQL Server,很適合裝在開發主機扮演 SQL 資料庫角色。(延伸閱讀:SQL Server 2012 Express LocalDB (SqlLocalDB) 深入剖析 by 保哥)
想新增 LocalDB 資料庫(建立 mdf 檔),最簡單的方法是透過 Visual Studio 的 SQL Server Object Exploere:
如果是用 VSCode 寫 .NET 6 程式,要怎麼生出 mdf 給 EF Core 使用?
以下示範建立名為 DummyTest 的 LocalDB 資料庫,放在 D:\LocalDB\DummyTest.mdf 及 DummyTest.ldf。
開始前先確認有安裝 SQL Server LocalDB,找得到 SQLLocalDB.exe,使用 SQLLocalDB.exe info 查詢 LocalDB 的預設個體名稱,一般會是 MSSQLLocalDB。
接下來只需連上 Data Source=(local)\MSSQLLocalDB,執行以下指令即可建立空白資料庫及 mdf、ldf 檔案:
CREATE DATABASE <db_name>
ON PRIMARY (
NAME=<db_name>_data,
FILENAME = '<path>\<db_name>_data.mdf'
)
LOG ON (
NAME=<db_name>_log,
FILENAME = '<paht>\<db_name>_log.ldf'
)
既然知道原理,實作的選擇很多,可以用 PowerShell 建 SqlConnection("Data Source=(localdb)\MSSQLLocalDB") 再 CreateCommand() 跑指令,或是直接用 ODBC 工具 sqlcmd 簡單搞定:(以下範例將 mdf 建在目前所在路徑(透過 %cd% 取得))
set /P DB_NAME=資料庫名稱:
set MDF_PATH=%cd%
sqlcmd -S "(localdb)\MSSQLLocalDB" -Q "CREATE DATABASE [%DB_NAME%] ON PRIMARY ( NAME=[%DB_NAME%_data], FILENAME = '%MDF_PATH%\%DB_NAME%_data.mdf') LOG ON (NAME=[%DB_NAME%_log], FILENAME = '%MDF_PATH%\%DB_NAME%_log.ldf');"
至於要移除 LocalDB 資料庫,sqlcmd -S "(localdb)\MSSQLLocalDB" -Q "DROP DATABASE DummyTest"
即可。(注意:DROP DATABASE 時,mdf/ldf 檔會被刪除)
將 .mdf 檔部署至其他已安裝 SQL LocalDB 機器執行時,使用連線字串 Data Source=("(localdb)\MSSQLLocalDB;AttachDBFileName=<path_to_mdf>
建立 SqlConnection,MDF 檔將會以全大寫路徑名自動掛載成 LocalDB 資料庫(如下圖),.ldf 檔不用提供,系統將自動生成 *_log.ldf 檔,之後資料庫即可使用。
Tips of how to create SQL LocalDB .mdf file with command.
Comments
# by 菜雞
請教黑大 在PC上用 Visual Studio 以 ASP.NET Web Forms + EF6 Code First 開發的網站 (類似 https://learn.microsoft.com/en-us/aspnet/web-forms/overview/presenting-and-managing-data/model-binding/retrieving-data 所示範的開發流程) 開發測試過程中會在專案的App_Data子目錄下建立 mdf、ldf 檔 那麼當開發完成要佈署上伺服器給公司同仁用時 (假設就簡單一次性的人工佈署,不考慮什麼CI/CD那種高深的scenario的話...) 資料庫的部份是不是只要把該 mdf、ldf 檔複製到 SQL server 伺服器 然後使用SSMS的「附加」功能就可以呢? (當然後續須建立帳號賦予讀寫權限、web server 端搭配修改connection string)
# by Jeffrey
to 菜雞,官方標準做法應該是 SSMS 開好新 DB,改好連線字串,在正式環境跑 update-database。但實務上直接 Attach dbf 應該也是可行的,但要確認 DB 的相關設定符合要求(例如:還原模式、相容版本等)。