逐步解說:建立和執行資料產生計劃
在此逐步解說中,您會建立資料產生計劃並加以執行,以便將隨機產生的資料填入測試資料庫中。 首先,您要建立資料庫專案,並將它部署到隔離的測試資料庫。 您可以使用隔離的資料庫來測試資料產生,而不需觸及實際執行資料或資料庫。
必要條件
若要完成本逐步解說,您必須已安裝下列產品:
Visual Studio Premium
SQL Server 2008 或 SQL Server 2005
建立資料庫專案
首先,您要建立資料庫專案,並從指令碼匯入結構描述。
![]() |
---|
在小組環境中,您可以將現有的專案簽出版本控制,以便處理資料庫專案。 如需詳細資訊,請參閱開始進行小組資料庫開發。 |
若要建立資料庫指令碼
在 [檔案] 功能表上指向 [新增],然後按一下 [檔案]。
[新增檔案] 對話方塊隨即開啟。
按一下 [分類] 清單中的 [一般] (若尚未反白顯示)。
在 [範本] 清單中,按一下 [Sql 檔],然後再按 [開啟]。
Transact-SQL 編輯器隨即開啟。
複製下列 Transact-SQL 程式碼,並將其貼入 Transact-SQL 編輯器。
PRINT N'Creating dbo.Customer...'; GO CREATE TABLE [dbo].[Customer] ( [CustomerId] UNIQUEIDENTIFIER NOT NULL, [UserId] UNIQUEIDENTIFIER NOT NULL, [UserName] VARCHAR (256) NOT NULL ); GO PRINT N'Creating dbo.Menu...'; GO CREATE TABLE [dbo].[Menu] ( [MenuId] UNIQUEIDENTIFIER NOT NULL, [RestaurantId] UNIQUEIDENTIFIER NOT NULL, [StartDate] DATETIME NOT NULL, [EndDate] DATETIME NOT NULL, [MenuType] VARCHAR (50) NULL ); GO PRINT N'Creating dbo.MenuItem...'; GO CREATE TABLE [dbo].[MenuItem] ( [MenuItemId] UNIQUEIDENTIFIER NOT NULL, [MenuId] UNIQUEIDENTIFIER NOT NULL, [Name] VARCHAR (128) NULL, [Description] VARCHAR (512) NULL, [ImageLocation] VARCHAR (MAX) NULL, [Price] MONEY NULL, [PreparationTime] INT NULL ); GO PRINT N'Creating dbo.Order...'; GO CREATE TABLE [dbo].[Order] ( [OrderId] UNIQUEIDENTIFIER NOT NULL, [SubmittedDate] SMALLDATETIME NOT NULL, [CustomerID] UNIQUEIDENTIFIER NOT NULL, [Total] MONEY NOT NULL, [ContactTelephone] CHAR (20) NULL, [PostalCode] CHAR (10) NULL, [State] CHAR (2) NULL, [StreetAddress] VARCHAR (75) NULL, [City] VARCHAR (25) NULL ); GO PRINT N'Creating dbo.OrderDetail...'; GO CREATE TABLE [dbo].[OrderDetail] ( [OrderDetailId] UNIQUEIDENTIFIER NOT NULL, [OrderId] UNIQUEIDENTIFIER NOT NULL, [RestaurantId] UNIQUEIDENTIFIER NOT NULL, [MenuItemId] UNIQUEIDENTIFIER NOT NULL, [DeliveryId] UNIQUEIDENTIFIER NOT NULL, [Quantity] INT NOT NULL, [UnitCost] MONEY NOT NULL, [Status] NCHAR (20) NOT NULL, [StatusUpdatedTime] SMALLDATETIME NOT NULL, [WorkflowId] UNIQUEIDENTIFIER NOT NULL, [ETA] SMALLDATETIME NULL ); GO PRINT N'Creating dbo.OrderPayment...'; GO CREATE TABLE [dbo].[OrderPayment] ( [PaymentID] UNIQUEIDENTIFIER NOT NULL, [OrderID] UNIQUEIDENTIFIER NOT NULL, [CreditCardNumber] CHAR (4) NULL, [NameOnCard] VARCHAR (75) NULL, [Address] VARCHAR (50) NULL, [Country] VARCHAR (50) NULL, [City] VARCHAR (50) NULL, [State] VARCHAR (50) NULL, [PostalCode] CHAR (10) NULL, [ExpirationDate] SMALLDATETIME NULL, [CreditCardType] VARCHAR (50) NULL ); GO PRINT N'Creating dbo.Restaurant...'; GO CREATE TABLE [dbo].[Restaurant] ( [RestaurantId] UNIQUEIDENTIFIER NOT NULL, [Name] VARCHAR (256) NULL, [Description] VARCHAR (1024) NULL, [RestaurantCategoryId] UNIQUEIDENTIFIER NOT NULL, [LogoImageLocation] NVARCHAR (MAX) NULL, [SmallLogoImageLocation] NVARCHAR (MAX) NULL, [BannerImageLocation] NVARCHAR (MAX) NULL, [MainImageLocation] NVARCHAR (MAX) NULL, [BackgroundLocation] NVARCHAR (MAX) NULL, [PostalCode] VARCHAR (128) NOT NULL, [StreetAddress] VARCHAR (256) NULL, [City] VARCHAR (512) NULL, [State] VARCHAR (256) NULL ); GO PRINT N'Creating dbo.RestaurantCategory...'; GO CREATE TABLE [dbo].[RestaurantCategory] ( [RestaurantCategoryId] UNIQUEIDENTIFIER NOT NULL, [Description] VARCHAR (255) NOT NULL ); GO PRINT N'Creating dbo.Default_Menu_StartDate...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [Default_Menu_StartDate] DEFAULT GETDATE() FOR [StartDate]; GO PRINT N'Creating dbo.PK_Customer...'; GO ALTER TABLE [dbo].[Customer] ADD CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ([CustomerId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_Menu...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [PK_Menu] PRIMARY KEY CLUSTERED ([MenuId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_MenuItem...'; GO ALTER TABLE [dbo].[MenuItem] ADD CONSTRAINT [PK_MenuItem] PRIMARY KEY CLUSTERED ([MenuItemId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_Order2...'; GO ALTER TABLE [dbo].[Order] ADD CONSTRAINT [PK_Order2] PRIMARY KEY CLUSTERED ([OrderId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_OrderDetail...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [PK_OrderDetail] PRIMARY KEY CLUSTERED ([OrderDetailId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_OrderPayment...'; GO ALTER TABLE [dbo].[OrderPayment] ADD CONSTRAINT [PK_OrderPayment] PRIMARY KEY CLUSTERED ([PaymentID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_Restaurant...'; GO ALTER TABLE [dbo].[Restaurant] ADD CONSTRAINT [PK_Restaurant] PRIMARY KEY CLUSTERED ([RestaurantId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_RestaurantCategory...'; GO ALTER TABLE [dbo].[RestaurantCategory] ADD CONSTRAINT [PK_RestaurantCategory] PRIMARY KEY CLUSTERED ([RestaurantCategoryId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.FK_Menu_Restaurant...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [FK_Menu_Restaurant] FOREIGN KEY ([RestaurantId]) REFERENCES [dbo].[Restaurant] ([RestaurantId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_MenuItem_Menu...'; GO ALTER TABLE [dbo].[MenuItem] ADD CONSTRAINT [FK_MenuItem_Menu] FOREIGN KEY ([MenuId]) REFERENCES [dbo].[Menu] ([MenuId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_Order2_Customer...'; GO ALTER TABLE [dbo].[Order] ADD CONSTRAINT [FK_Order2_Customer] FOREIGN KEY ([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_OrderDetail_MenuItem...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [FK_OrderDetail_MenuItem] FOREIGN KEY ([MenuItemId]) REFERENCES [dbo].[MenuItem] ([MenuItemId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_OrderDetail_Order2...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [FK_OrderDetail_Order2] FOREIGN KEY ([OrderId]) REFERENCES [dbo].[Order] ([OrderId]) ON DELETE CASCADE ON UPDATE CASCADE; GO PRINT N'Creating dbo.FK_OrderDetail_Restaurant...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [FK_OrderDetail_Restaurant] FOREIGN KEY ([RestaurantId]) REFERENCES [dbo].[Restaurant] ([RestaurantId]) ON DELETE NO ACTION ON UPDATE CASCADE; GO PRINT N'Creating dbo.FK_OrderPayment_Order...'; GO ALTER TABLE [dbo].[OrderPayment] ADD CONSTRAINT [FK_OrderPayment_Order] FOREIGN KEY ([OrderID]) REFERENCES [dbo].[Order] ([OrderId]) ON DELETE CASCADE ON UPDATE CASCADE; GO PRINT N'Creating dbo.FK_Restaurant_RestaurantCategory...'; GO ALTER TABLE [dbo].[Restaurant] ADD CONSTRAINT [FK_Restaurant_RestaurantCategory] FOREIGN KEY ([RestaurantCategoryId]) REFERENCES [dbo].[RestaurantCategory] ([RestaurantCategoryId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.CK_Menu_EndDate...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [CK_Menu_EndDate] CHECK (([EndDate] > '01/01/2000') AND ([EndDate] >= [StartDate])); GO PRINT N'Creating dbo.CK_Menu_StartDate...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [CK_Menu_StartDate] CHECK ([StartDate] > '01/01/2000'); GO PRINT N'Creating AutoCreatedLocal...'; GO CREATE ROUTE [AutoCreatedLocal] AUTHORIZATION [dbo] WITH ADDRESS = N'LOCAL'; GO PRINT N'Creating dbo.Menu.EndDate.ExtProp_Menu_EndDate_Description...'; GO EXECUTE sp_addextendedproperty @name = N'ExtProp_Menu_EndDate_Description', @value = 'Date the menu expired. Must be > 01/01/2000 and must be after the StartDate', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Menu', @level2type = N'COLUMN', @level2name = N'EndDate'; GO
按一下 [檔案] 功能表上的 [另存 SqlQuery_1.sql]。
[另存新檔] 對話方塊隨即開啟。
在 [物件名稱] 中,輸入 SampleImportScript.sql。
您可以將此檔案儲存至電腦上的任何位置。 請記下這個位置,以便在下一個程序中使用。
按一下 [儲存]。
在 [檔案] 功能表上,按一下 [關閉方案]。
接著,您要建立資料庫專案,並從您已建立的指令碼匯入結構描述。
若要建立資料庫專案
在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。
[新增專案] 對話方塊隨即出現。
展開 [已安裝的範本] 底下的 [資料庫] 節點,然後按一下 [SQL Server]。
注意事項
如果您正在使用 Visual Studio Professional,請查看 [已安裝的範本],依序展開 [資料庫] 節點、[SQL Server] 節點,然後按一下 [進階]。
在範本清單中,按一下 [SQL Server 2008 資料庫專案]。
注意事項
如果您想要部署到 SQL Server 2008 以外的伺服器,請按一下對應於目標部署環境的範本。
在 [名稱] 中,輸入 WalkthroughDataGenerator,再按一下 [確定]。
即會建立包含 WalkthroughDataGenerator 這個空白專案的方案。 這就是您的資料庫專案。 當您處理您的資料庫專案時,其他人將無法存取它。
在 [方案總管] 中,按一下 [WalkthroughDataGenerator]。
按一下 [專案] 功能表上的 [匯入指令碼]。
在 [匯入 SQL 指令碼檔] 對話方塊中,按 [下一步]。
在 [檔名] 中,輸入您先前在本逐步解說中建立之指令碼的路徑和檔案名稱。
或者,您也可以按一下 [瀏覽] 尋找指令碼檔。
按一下 [完成]。
包含資料庫結構定義的指令碼隨即匯入。
結構描述匯入完成後,按一下 [完成]。
此時,資料庫結構描述已匯入資料庫專案中。 對應於資料庫物件的專案項目會出現在 [方案總管] 和 [結構描述檢視] 中的資料庫專案底下。 接下來,您要設定和建置專案,然後將專案部署至本機開發環境。
部署至隔離的開發環境
接下來,您要將專案部署到新的資料庫。 這項程序會建立具有已匯入之結構描述但不包含任何資料的資料庫。 這個資料庫是一個「隔離的開發環境」(Isolated Development Environment) (或稱為沙箱),您可在其中開發及測試資料庫。
若要建置資料庫專案
在 [方案總管] 中,按一下 [WalkthroughDataGenerator] 資料庫專案。
按一下 [專案] 功能表上的 [WalkthroughDataGenerator 屬性]。
專案屬性隨即出現。
按一下 [部署] 索引標籤。
在 [部署動作] 清單中,按一下 [建立部署指令碼 (.sql) 並部署到資料庫]。
在 [目標資料庫設定] 中,按一下 [編輯] 顯示 [連接屬性] 對話方塊。
針對您要使用的資料庫設定其連接屬性,然後按一下 [確定]。
即會以正確的連接字串填入 [目標連接] 方塊。
警告
您應該在測試伺服器、程式開發伺服器或本機電腦上建立新的資料庫, 您不應該使用實際執行伺服器。
在 [目標資料庫名稱] 文字方塊中,輸入 DinnerNowDataGenerator。
在 [檔案] 功能表上按一下 [全部儲存]。
在 [建置] 功能表上,按一下 [建置方案]。
建置專案時,請確認您可以建立 .dbschema 檔案,而不發生任何錯誤。 建置的狀態會出現在 [輸出] 視窗中,而且 [組建: 1 成功或最新狀態] 應該會出現在最後一行。
若要部署資料庫專案
在 [方案總管] 中,按一下 [WalkthroughDataGenerator] 資料庫專案。
在 [建置] 功能表中,按一下 [部署 WalkthroughDataGenerator]。 您也可以用滑鼠右鍵按一下 [方案總管] 中的專案,然後按一下 [部署]。
警告
您應該針對測試伺服器、程式開發伺服器或本機電腦執行這項部署, 您不應該使用實際執行伺服器。
資料庫專案即會部署到新的資料庫。 部署的狀態會出現在 [輸出] 視窗中,而且 [部署: 1 成功] 應該會出現在最後一行。
注意事項
如果 [輸出] 視窗並未出現,請開啟 [檢視] 功能表,然後按一下 [輸出]。
建立資料產生計劃
接下來,您要建立資料產生計劃。 資料產生計劃會包含您想要將資料填入其中之資料表和資料行的相關資訊。 如需詳細資訊,請參閱 HOW TO:建立資料產生計劃。
若要建立資料產生計劃
以滑鼠右鍵按一下 [方案總管] 中的 [資料產生計劃] 節點,然後指向 [加入],再按一下 [資料產生計劃]。
[加入新項目] 對話方塊隨即出現。
在 [名稱] 文字方塊中,輸入 PartialDGenPlan.dgen。
按一下 [加入]。
即會建立資料產生計劃。 資料產生計劃和 [資料產生預覽] 視窗隨即出現。 資料產生計劃視窗會水平分割成兩個窗格。 上方窗格會列出資料庫專案結構描述中所定義的資料表。 下方窗格會針對在上方窗格中反白顯示的資料表顯示資料行詳細資料。
注意事項
如果沒有開啟 [資料產生預覽] 視窗,您可以透過開啟 [資料] 功能表、指向 [資料產生器],然後按一下 [預覽資料產生],開啟此視窗。 根據預設,[資料產生預覽] 視窗會停駐在資料產生計劃視窗的底部,並以索引標籤形式出現。 若要展開檢視,請按一下此視窗,然後按一下 [視窗] 功能表上的 [停駐做為索引標籤式文件]。 您也可以用滑鼠右鍵按一下標題列,然後按一下 [停駐做為索引標籤式文件]。
在 PartialDGenPlan.dgen 設計工具中,清除所有資料表的核取方塊。
注意事項
您可以使用 [在資料產生中包括所有資料表] 和 [從資料產生中排除所有資料表] 命令,選取或清除所有資料表的核取方塊。 若要存取這兩個命令,請以滑鼠右鍵按一下資料產生計劃視窗中的任何資料列,或指向 [資料] 功能表上的 [資料產生器]。
在 PartialDGenPlan.dgen 設計工具中,選取 dbo.Restaurant 資料表的核取方塊。
系統也會自動選取 dbo.RestaurantCategory 資料表的核取方塊。 由於 Restaurant 資料表具有 RestaurantCategory 資料表的外部索引鍵,所以您必須填入其他資料表,才能填入 Restaurant 資料表。 如需詳細資訊,請參閱 HOW TO:指定要產生資料的資料表。
在 [檔案] 功能表上按一下 [全部儲存]。
指定資料產生的詳細資料
接下來,您要指定如何將資料填入資料行的詳細資料。 如需詳細資訊,請參閱為資料行指定資料產生的詳細資料。
若要指定資料產生的詳細資料
請遵循下列步驟來設定要產生的資料列數:
在 PartialDGenPlan.dgen 設計工具中,按一下 Restaurant 資料表的資料列。
按一下 [關聯資料表] 資料行,然後使用下拉箭號指定 RestaurantCategories 資料表。
按一下 [關聯資料表的相對比例] 資料行,並輸入 10:1。
根據這些設定,您將會針對所產生的每一個分類產生 10 個餐廳。 如需詳細資訊,請參閱 HOW TO:指定要產生的資料列數。
請遵循下列步驟來設定要產生的 NULL 資料列數:
在 PartialDGenPlan.dgen 設計工具中,按一下 Restaurant 資料表的資料列。
在 [資料行詳細資料] 視窗中,按一下 [描述] 資料行的資料列。
請在 [屬性] 視窗中,將 [百分比 Null] 屬性設定為 10。
根據這些設定,[描述] 資料行中所產生的 10% 資料將會包含 NULL。 您可以開啟 [資料產生預覽] 視窗,並驗證 [描述] 資料行有包含某些 null 值。
請遵循下列步驟來設定要產生之資料的文字:
在 PartialDGenPlan.dgen 設計工具中,按一下 Restaurant 資料表的資料列。
在 [資料行詳細資料] 視窗中,按一下 [名稱] 資料行的資料列。
按一下 [產生器] 資料行,然後使用下拉箭號指定 RegularExpression 資料產生器。
在 [屬性] 視窗中,將 Expression 屬性設定為下列其中一個值:
(Delicious|Golden|Family|Sweet|Dancing|Magic|Thai) (Ginger|Duck|Flower|Potato|Pumpkin|Kitchen|Grill|Onion|Corral)
ProductName 資料行中所產生的資料將會包含兩個字的名稱。 您可以開啟 [資料產生預覽] 視窗,並確認 [名稱] 資料行有包含隨機產生的餐廳名稱。 如需詳細資訊,請參閱規則運算式產生器。
在 [檔案] 功能表上按一下 [全部儲存]。
執行資料產生計劃
最後,您會執行資料產生計劃。 在您產生資料之後,您可以使用不同的工具來登入資料庫,並驗證新的資料。
若要執行資料產生計劃
在 [方案總管] 中,按兩下 [PartialDGenPlan.dgen]。
注意事項
此資料產生計劃必須開啟。 如果計劃沒有開啟,您就無法產生資料。
指向 [資料] 功能表上的 [資料產生器],然後按一下 [產生資料]。
[連接至資料庫] 對話方塊隨即出現。
在 [資料產生連接資訊] 清單中,指定您之前在這個逐步解說中部署的資料庫連接,再按一下 [確定]。
當系統提示您是否要在插入新的資料列之前,清除資料表的內容時,請按一下 [是]。
資料隨即產生。 在擴展視窗中,狀態資料行會隨著資料產生的狀態更新。 狀態列會摘要列出所有資料表的資料產生。
(選擇性) 使用不同的工具來登入資料庫。 在這個步驟中,您可以使用 Visual Studio Premium 所提供的 Transact-SQL 編輯器。 如需詳細資訊,請參閱 Microsoft 網站上的使用 Transact-SQL 編輯器編輯資料庫指令碼和物件。 執行下列查詢來檢視新的資料:
use DinnerNowDataGenerator select * from [dbo].[RestaurantCategory] select * from [dbo].[Restaurant]
確認針對 Restaurant 資料表所產生的資料列數目是 RestaurantCategory 資料表的 10 倍。 確認 Restaurant 資料表中的 [描述] 資料行有包含 NULL 值。 確認 Restaurant 資料表中的 [名稱] 資料行包含符合您所指定之規則運算式的資料。
後續步驟
您通常會針對資料庫的其他資料行和資料表設定資料產生。 完成該項設定之後,您就可以透過將專案 (包括資料產生計劃) 簽入版本控制,提供此專案給小組使用。 如需詳細資訊,請參閱 將檔案加入至版本控制。