![](/img/trans.png)
[英]How can I generate only indexes from a database into a sql file in Microsoft SQL Server 2008 Management Studio?
[英]How can I automate the “generate scripts” task in SQL Server Management Studio 2008?
我想在 SQL Server Management Studio 2008 中自動生成腳本。
現在我做的是:
有沒有辦法自動化這個任務?
編輯:我想生成創建腳本,而不是更改腳本。
與 SSMS 中的腳本生成相比,SqlPubwiz 的選項非常有限。 相比之下, SMO可用的選項幾乎與 SSMS 中的選項完全匹配,這表明它甚至可能是相同的代碼。 (我希望MS沒寫兩次!)有MSDN上幾個例子像這一次,顯示腳本表作為單獨的對象。 但是,如果您希望所有內容都使用包含“DRI”(聲明性引用完整性)對象(如外鍵)的“完整”模式正確編寫腳本,則單獨編寫表的腳本無法正確處理依賴項。 我發現有必要收集所有 URN 並將它們作為數組交給腳本編寫者。 這段從示例中修改的代碼對我有用(雖然我敢說你可以整理一下並多加評論):
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Sdk.Sfc;
// etc...
// Connect to the local, default instance of SQL Server.
Server srv = new Server();
// Reference the database.
Database db = srv.Databases["YOURDBHERE"];
Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;
scrp.Options.Indexes = true; // To include indexes
scrp.Options.DriAllConstraints = true; // to include referential constraints in the script
scrp.Options.Triggers = true;
scrp.Options.FullTextIndexes = true;
scrp.Options.NoCollation = false;
scrp.Options.Bindings = true;
scrp.Options.IncludeIfNotExists = false;
scrp.Options.ScriptBatchTerminator = true;
scrp.Options.ExtendedProperties = true;
scrp.PrefetchObjects = true; // some sources suggest this may speed things up
var urns = new List<Urn>();
// Iterate through the tables in database and script each one
foreach (Table tb in db.Tables)
{
// check if the table is not a system table
if (tb.IsSystemObject == false)
{
urns.Add(tb.Urn);
}
}
// Iterate through the views in database and script each one. Display the script.
foreach (View view in db.Views)
{
// check if the view is not a system object
if (view.IsSystemObject == false)
{
urns.Add(view.Urn);
}
}
// Iterate through the stored procedures in database and script each one. Display the script.
foreach (StoredProcedure sp in db.StoredProcedures)
{
// check if the procedure is not a system object
if (sp.IsSystemObject == false)
{
urns.Add(sp.Urn);
}
}
StringBuilder builder = new StringBuilder();
System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
foreach (string st in sc)
{
// It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
// Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
builder.AppendLine(st);
builder.AppendLine("GO");
}
return builder.ToString();
Brann 在 Visual Studio 2008 SP1 Team Suite 中提到的是數據庫發布向導的 1.4 版。 它隨 sql server 2008(可能只是專業版?)一起安裝到 \\Program Files\\Microsoft SQL Server\\90\\Tools\\Publishing\\1.4。 來自服務器資源管理器的 VS 調用只是調用它。 您可以通過命令行實現相同的功能,例如:
sqlpubwiz help script
我不知道 v1.4 是否和 v1.1 有同樣的問題(用戶被轉換為角色,約束沒有按正確的順序創建),但這對我來說不是一個解決方案,因為它沒有腳本對象到不同的文件,如 SSMS 中的 Tasks->Generate Scripts 選項。 我目前正在使用 Scriptio 的修改版本(使用 MS SMO API)作為數據庫發布向導 (sqlpubwiz.exe) 的改進替代品。 目前無法從命令行編寫腳本,我可能會在未來添加該貢獻。
Scriptio 最初發布在 Bill Graziano 的博客上,但隨后由 Bill 發布到 CodePlex 並由其他人更新。 閱讀討論以了解如何編譯以用於 SQL Server 2008。
編輯:我已經開始使用 RedGate 的 SQL 比較產品來做到這一點。 它是 sql 發布向導本應具備的所有功能的非常好的替代品。 您選擇一個數據庫、備份或快照作為源,並選擇一個文件夾作為輸出位置,它會將所有內容很好地轉儲到文件夾結構中。 它恰好與他們的其他產品 SQL Source Control 使用的格式相同。
我編寫了一個名為SchemaZen 的開源命令行實用程序來執行此操作。 它比來自管理工作室的腳本要快得多,而且它的輸出對版本控制更友好。 它支持對模式和數據進行腳本編寫。
要生成腳本,請運行:
schemazen.exe script --server localhost --database db --scriptDir c:\somedir
然后從腳本運行重新創建數據庫:
schemazen.exe create --server localhost --database db --scriptDir c:\somedir
您可以使用 SQL Server 管理對象 (SMO) 自動執行 SQL Server 2005 管理任務,包括生成腳本: http://msdn.microsoft.com/en-us/library/ms162169.aspx 。
如果您是開發人員,請務必使用 SMO。 這是 Scripter 類的鏈接,這是您的起點:
我沒有看到這些答案中提到的帶有 SQLPSX 的 powershell ......我個人沒有玩過它,但它看起來非常簡單易用,非常適合此類自動化任務,任務如下:
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter
(參考: http : //www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )
項目頁面: http : //sqlpsx.codeplex.com/
這種方法的主要優點是它結合了直接使用 SMO 的可配置性/可定制性,以及使用簡單的現有工具(如數據庫發布向導)的便利性和可維護性。
在“工具”>“選項”>“設計器”>“表和數據庫設計器”中,有一個“自動生成更改腳本”選項,該選項將為您在保存時所做的每個更改生成一個。
您可以通過使用 INFORMATION_SCHEMA 表的 T-SQL 代碼來完成。
還有第三方工具 - 我喜歡 Apex SQL Script 正是因為您正在談論的用途。 我完全從命令行運行它。
如果您想要 Microsoft 解決方案,您可以嘗試:Microsoft SQL Server Database Publishing Wizard 1.1
它創建了一個批處理,您可以在需要重建腳本的任何時候運行。
嘗試新的 SQL Server 命令行工具來生成 T-SQL 腳本並監控動態管理視圖。
像魅力一樣為我工作。 它是來自 Microsoft 的一個新的基於 Python 的工具,可從命令行運行。 一切都像 Microsoft 頁面上描述的一樣(見下面的鏈接) 使用 SQL 2012 服務器為我工作。
你用 pip 安裝它:
$pip 安裝 mssql 腳本程序
命令參數概覽照常使用 h 尋求幫助:
mssql 腳本程序 -h
提示:如果您通過 Windows 身份驗證登錄 SQL-Server,只需留下用戶名和密碼。
我一直在使用 DB 比較器 - 它是免費的,沒有大驚小怪的整個 DB 腳本,可以與另一個 DB 進行比較,還可以生成一個 Diff 腳本。 非常適合開發到生產更改腳本。 http://www.dbcomparer.com/
我還根據自己的需要構建了這個簡單的命令行工具。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/
它可以導出整個數據庫,並嘗試導出加密對象。 一切都存儲在文件夾和單獨的 sql 文件中,以便於文件比較。
代碼也可以在 github 上找到。
我正在使用 VS 2012(用於 MSSQL Server 2008 上的數據庫)比較數據庫有一個選項來保存它,比較和選項。 這基本上是您的交付設置。 之后,您可以進行更新或生成腳本。
我只是覺得稍后從文件加載它有點尷尬(從 Windows 資源管理器拖放),因為我沒有在解決方案資源管理器中看到該文件。
從 Visual Studio 2008 SP1 TeamSuite :
在服務器資源管理器/數據連接選項卡中,有一個發布到提供程序工具,它的作用與“Microsoft SQL Server 數據庫發布向導”相同,但與 MS Sql Server 2008 兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.