Do you use database projects in Visual Studio? If not, then now is a good time to start. It is the best way I have found to source control my databases without actually sticking the database file itself in the repository. It is very simple to add to your solution and creates a default directory structure for your create scripts, change scripts and queries. Best of all the project will be recognized by source control and added to the source code repository. This means you can keep versioned scripts for maintainability. It also gives you the option to do the dreaded rollback!

 

Lets start by creating a database project of our own. To start, we will create a blank Visual Studio solution.

screenshot-2008-05-05_18_56_00

 

Now click File -> Add -> New Project.

screenshot-2008-05-05_18_57_08

 

You should get the dialog below. Now we will look in the node of "Other Project Types", click "Database" then select "Database Project". This will give us the opportunity to name our database project. We will call this one by the database we are going to be using, good ol' Northwind.

screenshot-2008-05-05_18_58_44

 

Next you will be asked to setup a database reference. So here all we have to do is add a new reference to the Northwind database.

screenshot-2008-05-05_18_59_29

 

My database will be in SQL Server, yours can be in any of the choices shown below.

screenshot-2008-05-05_19_01_31

 

Now we just set the server name and choose the Northwind database.

screenshot-2008-05-05_19_02_07

 

You should then test your connection (out of good practice) and see the dialog below upon success.

screenshot-2008-05-05_19_02_15

 

Now we will see our database reference shown in the original list of references. Just double click on your newly added reference.

screenshot-2008-05-05_19_02_31

 

Now your project should look something like the shot below.

screenshot-2008-05-05_19_02_51

 

Once we get this far, we need to start filling our folders with database scripts. You can add new folders if you wish, but I think the default folder structure is good enough. Now then, we can use the database publishing wizard to get our first create script into the "Create Scripts" folder.

 

Double click the reference to your database in the database references and it should bounce you to the server explorer window with your data connection all setup.

screenshot-2008-05-05_19_05_20

 

Right click your data connection and click "Publish to provider..." to start the database publishing wizard.

screenshot-2008-05-05_19_05_31 

 

Now we select the database we would like to publish, so again I will choose Northwind.

screenshot-2008-05-05_19_05_52

 

Now with the "Script to file" option chosen, we will browse to the "Create Scripts" folder in our database project to put the outputted .sql file.

screenshot-2008-05-05_19_06_51

 

Now we get to choose some options. I am going to set the output for SQL Server 2005 and select to script the database schema only.

screenshot-2008-05-05_19_07_18

 

Now we can review the summary of what we have configured and click finish.

screenshot-2008-05-05_19_07_26

 

Upon clicking finish, we will see the progress of the .sql file being scripted to the hard drive.

screenshot-2008-05-05_19_08_07

 

Ok, for some reason I couldn't find a refresh button in the database project to see the file that was created so we will right click the "Create Scripts" folder and click "Add Existing Item..."

screenshot-2008-05-05_19_10_15

 

Then browse to our .sql file and click the "Add" button.

screenshot-2008-05-05_19_10_27

 

Now we should see it in our project and we can also see the contents of the generated script by opening it in the editor.

screenshot-2008-05-05_19_12_20

screenshot-2008-05-05_19_12_31

 

It really is just that simple. I mean if nothing else you have a designated place to put all your SQL scripts for your database. The big plus is that your scripts will be source controlled. Also, anyone who opens the solution will know exactly which databases are used by the project.

 

Hope this helps!

 

kick it on DotNetKicks.com

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Related posts

Comments

Kevin Berridge us

Wednesday, May 07, 2008 10:07 AM

Kevin Berridge

I have tried using Visual Studio's database projects as well as Management Studio's database projects but have always been disappointed by both.

Your tutorial on how to set up the solution is great. But I start having problems with it when it comes to keeping it up to date. Here are some of the issues I've had, perhaps you'll have some insight.

Do you update the scripts in the project, or update the database objects directly?
Do you simply regenerate the scripts every time the database changes?
How do you handle "shared database objects" which are likely to be used in many different databases?

Ira us

Wednesday, May 07, 2008 11:04 AM

Ira

Well, I can only speak for myself but the answers to your questions are as follows:

Do you update the scripts in the project, or update the database objects directly?
I update the scripts in my database project and use those scripts to update my database. Then commit the scripts to version control.

Do you simply regenerate the scripts every time the database changes?
Not EVERY time, but in a timely fashion as the database evolves. You should also be using backup tools in SQL as well so you can recover without the scripts. However if you are using a deployable packaged project, your create scripts should be updated by the end of your changes.

How do you handle "shared database objects" which are likely to be used in many different databases?
Shared objects can get tricky. I add a reference to all databases that my project involves. I also create some documentation files in the database project outlining the shared objects and how they are used.

Hope this helps.

Jeff Garoutte us

Wednesday, May 07, 2008 12:39 PM

Jeff Garoutte

It is worth noting that you can also right click on a table, view, stored proedure or function and select "Generate Create Script to Project" from the server explorer in visual studio once you have a database project in the solution.

The script will be named <database>.<owner>.<objectname>.sql in the create scripts folder (for example Northwind.dbo.Employess.sql).

You can select multipule objects and it will generate them in a file called script<number>,sql.

I often generate a script for each object, this allows me to edit it without wading in 10,000 lines of SQL looking for a view that I need to add a column too. It also gives me a clear view of what changed and when in source control.

It takes longer to step up an exisiting database this way, but when starting a new database there is not much difference in speed.

Often I find myself creating a "generate all" script for an exisitng database and the smaller "one object" file as needed.

The fact that you can change the projects database reference or right click a script and select "run on" makes setting up a "temp" testing database a breeze

Will Asrari us

Wednesday, May 07, 2008 4:42 PM

Will Asrari

<3 DB projects

@Ira: Right-click a stored procedure > 'Run On' > Select instance of SQL.

Ira us

Wednesday, May 07, 2008 6:07 PM

Ira

@Will: Thanks for the tip!

VB us

Wednesday, May 07, 2008 8:27 PM

VB

Better use Microsoft SQL Server Management Studio. It has the same level of Source Control support but gives you much more tools to work with your database. There is also a very handy script - "Script table data" in the CodeSmith. I use it very often when I need to script lookup table data.

Simone it

Thursday, May 08, 2008 3:22 AM

Simone

Did you ever try rikmigration or any other "rake:db" style DB versioning tool?

Ira us

Thursday, May 08, 2008 8:10 AM

Ira

Did you ever try rikmigration or any other "rake:db" style DB versioning tool?
No, I have only tried the tools available to me within Visual Studio and Management Studio. I will have a look into it though.

alvinashcraft.com

Thursday, May 08, 2008 9:20 AM

pingback

Pingback from alvinashcraft.com

Dew Drop - May 8, 2008 | Alvin Ashcraft's Morning Dew

Mattias Andersson

Wednesday, July 02, 2008 3:32 AM

Mattias Andersson

I have spent some time reading all posts and I still don't see how I get a changed script or stored procedure in the project to get stored in the actual database. Is there a way of doing this from within the IDE?

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Reamped.NET

throw new InvalidArgumentException();