Visual Studio 2013 and Database Projects: Create a Database Project with Folder Structure
Data base projects in Visual Studio is a bit of an after thought on application development. It started with Gert Drapers (the data dude) and became SSDT (SQL Server Data Tools) that had to be installed (as an add-on) to Visual Studio. This had some varying function over the years, but was aimed at reducing the difficulty of database development in Visual Studio and keep database changes in synch across a solution (matching database and application versions) and multiple server environments through the application life-cycle.
Creating a Database Project
This is quite easy using Visual Studio 2013. On the first landing page (can be turned off) a Start section has the option from which to create a new project, or the traditional FILE menu is just as simple.
Be mindful that if a project is created and Team Foundation Server (TFS) is being used to take care of how the solution and projects contained by the solution are demarcated. It is not in the scope of this article to explain how to do this, but suffice to say that where solutions are stored separately from projects, to first create an empty solution and check it in. Then the projects that are added back to the solution so that all are checked into TFS in their correct locations.
Further take not of the Visual Studio boxes, viz. Solution Explorer, SQL Server Object Explorer, and Properties for example. These should be orientated (docked) in positions that make sense, I.e. for easy reference. Below is an example of an instance that contains a Solution with three projects.
The two most important boxes are the Solution Explorer and the SQL Server Object Explorer. The former depicts the Solutions and the database projects. Where no database actually exists (this is where you create it) SQL Server Objects can be created/ added to the project, or (where a database already exists) imported by a few means. The first is using a DACPAC (SQL Server Data-tier application extract file), or connecting directly to a SQL Server database, or create one using a script file containing all the object definitions.
Choosing a Folder Structure
Importing a database allows for the folder structure in the project to be changed. The project folder structure should allow for ease of maintenance and readability. The folder structure does not influence deployment.
An import of an existing database (where no structure is chosen, or defined dumps all files in the root of the project, which is moderately messy, so it must be carefully considered. A folder is not created where an imported database does not have objects, e.g. Stored Procedures. If subsequent objects are required, the folder will first have to be created.
Organising the database advances readability, consequently also maintenance, because developers are able to find things quicker. Any database objects without any discernable grouping are dumped in the root of the project on import.
NOTE:Things that impact the display of objects and what access rights are differentiated in practice, bears on the configuration of the naming scheme. Making use of database schemas (to group objects and assign login permissions) is an effective strategy for data architecture over using prefixes on objects like sp or pr for a Stored Procedure (source). The folder structure in Visual Studio and SQL Server Management Studio already informs the object type and with an added schema denotes an organisational name space for such objects. SQL Server uses a four-part naming scheme: Server.Database.DatabaseSchema.DatabaseObject. Objects in a schema are owned by the security principle that owns the schema and a schema can contain objects owned by different users. Any predefined schema (dbo, sys, etc) can be dropped from the model database if not required consequently preventing them from being created in new databases. A schema owner can be changed without breaking the code, but if an object owner, say Tommy.Object is removed, an ownership change must first be performed before Tommy’s account can be deleted. However, any fully qualified references will break in the code, e.g. Server.Database.[tommy[.DatabaseObject. The default dbo schema is owned by the dbo user. Users assigned to the dbo schema do not inherit dbo user account permissions, but the database objects contained in the schema (source). Using dbo as the owner of all object can greatly simplify managing objects (source).
Previous article (1) [Installation]. . . Next Article (3) [Working the Project]