- SQL Server Reference Guide
- Introduction
- SQL Server Reference Guide Overview
- Table of Contents
- Microsoft SQL Server Defined
- SQL Server Editions
- SQL Server Access
- Informit Articles and Sample Chapters
- Online Resources
- Microsoft SQL Server Features
- SQL Server Books Online
- Clustering Services
- Data Transformation Services (DTS) Overview
- Replication Services
- Database Mirroring
- Natural Language Processing (NLP)
- Analysis Services
- Microsot SQL Server Reporting Services
- XML Overview
- Notification Services for the DBA
- Full-Text Search
- SQL Server 2005 - Service Broker
- Using SQL Server as a Web Service
- SQL Server Encryption Options Overview
- SQL Server 2008 Overview
- SQL Server 2008 R2 Overview
- SQL Azure
- The Utility Control Point and Data Application Component, Part 1
- The Utility Control Point and Data Application Component, Part 2
- Microsoft SQL Server Administration
- The DBA Survival Guide: The 10 Minute SQL Server Overview
- Preparing (or Tuning) a Windows System for SQL Server, Part 1
- Preparing (or Tuning) a Windows System for SQL Server, Part 2
- Installing SQL Server
- Upgrading SQL Server
- SQL Server 2000 Management Tools
- SQL Server 2005 Management Tools
- SQL Server 2008 Management Tools
- SQL Azure Tools
- Automating Tasks with SQL Server Agent
- Run Operating System Commands in SQL Agent using PowerShell
- Automating Tasks Without SQL Server Agent
- Storage – SQL Server I/O
- Service Packs, Hotfixes and Cumulative Upgrades
- Tracking SQL Server Information with Error and Event Logs
- Change Management
- SQL Server Metadata, Part One
- SQL Server Meta-Data, Part Two
- Monitoring - SQL Server 2005 Dynamic Views and Functions
- Monitoring - Performance Monitor
- Unattended Performance Monitoring for SQL Server
- Monitoring - User-Defined Performance Counters
- Monitoring: SQL Server Activity Monitor
- SQL Server Instances
- DBCC Commands
- SQL Server and Mail
- Database Maintenance Checklist
- The Maintenance Wizard: SQL Server 2000 and Earlier
- The Maintenance Wizard: SQL Server 2005 (SP2) and Later
- The Web Assistant Wizard
- Creating Web Pages from SQL Server
- SQL Server Security
- Securing the SQL Server Platform, Part 1
- Securing the SQL Server Platform, Part 2
- SQL Server Security: Users and other Principals
- SQL Server Security – Roles
- SQL Server Security: Objects (Securables)
- Security: Using the Command Line
- SQL Server Security - Encrypting Connections
- SQL Server Security: Encrypting Data
- SQL Server Security Audit
- High Availability - SQL Server Clustering
- SQL Server Configuration, Part 1
- SQL Server Configuration, Part 2
- Database Configuration Options
- 32- vs 64-bit Computing for SQL Server
- SQL Server and Memory
- Performance Tuning: Introduction to Indexes
- Statistical Indexes
- Backup and Recovery
- Backup and Recovery Examples, Part One
- Backup and Recovery Examples, Part Two: Transferring Databases to Another System (Even Without Backups)
- SQL Profiler - Reverse Engineering An Application
- SQL Trace
- SQL Server Alerts
- Files and Filegroups
- Partitioning
- Full-Text Indexes
- Read-Only Data
- SQL Server Locks
- Monitoring Locking and Deadlocking
- Controlling Locks in SQL Server
- SQL Server Policy-Based Management, Part One
- SQL Server Policy-Based Management, Part Two
- SQL Server Policy-Based Management, Part Three
- Microsoft SQL Server Programming
- An Outline for Development
- Database
- Database Services
- Database Objects: Databases
- Database Objects: Tables
- Database Objects: Table Relationships
- Database Objects: Keys
- Database Objects: Constraints
- Database Objects: Data Types
- Database Objects: Views
- Database Objects: Stored Procedures
- Database Objects: Indexes
- Database Objects: User Defined Functions
- Database Objects: Triggers
- Database Design: Requirements, Entities, and Attributes
- Business Process Model Notation (BPMN) and the Data Professional
- Business Questions for Database Design, Part One
- Business Questions for Database Design, Part Two
- Database Design: Finalizing Requirements and Defining Relationships
- Database Design: Creating an Entity Relationship Diagram
- Database Design: The Logical ERD
- Database Design: Adjusting The Model
- Database Design: Normalizing the Model
- Creating The Physical Model
- Database Design: Changing Attributes to Columns
- Database Design: Creating The Physical Database
- Database Design Example: Curriculum Vitae
- NULLs
- The SQL Server Sample Databases
- The SQL Server Sample Databases: pubs
- The SQL Server Sample Databases: NorthWind
- The SQL Server Sample Databases: AdventureWorks
- The SQL Server Sample Databases: Adventureworks Derivatives
- UniversalDB: The Demo and Testing Database, Part 1
- UniversalDB: The Demo and Testing Database, Part 2
- UniversalDB: The Demo and Testing Database, Part 3
- UniversalDB: The Demo and Testing Database, Part 4
- Getting Started with Transact-SQL
- Transact-SQL: Data Definition Language (DDL) Basics
- Transact-SQL: Limiting Results
- Transact-SQL: More Operators
- Transact-SQL: Ordering and Aggregating Data
- Transact-SQL: Subqueries
- Transact-SQL: Joins
- Transact-SQL: Complex Joins - Building a View with Multiple JOINs
- Transact-SQL: Inserts, Updates, and Deletes
- An Introduction to the CLR in SQL Server 2005
- Design Elements Part 1: Programming Flow Overview, Code Format and Commenting your Code
- Design Elements Part 2: Controlling SQL's Scope
- Design Elements Part 3: Error Handling
- Design Elements Part 4: Variables
- Design Elements Part 5: Where Does The Code Live?
- Design Elements Part 6: Math Operators and Functions
- Design Elements Part 7: Statistical Functions
- Design Elements Part 8: Summarization Statistical Algorithms
- Design Elements Part 9:Representing Data with Statistical Algorithms
- Design Elements Part 10: Interpreting the Data—Regression
- Design Elements Part 11: String Manipulation
- Design Elements Part 12: Loops
- Design Elements Part 13: Recursion
- Design Elements Part 14: Arrays
- Design Elements Part 15: Event-Driven Programming Vs. Scheduled Processes
- Design Elements Part 16: Event-Driven Programming
- Design Elements Part 17: Program Flow
- Forming Queries Part 1: Design
- Forming Queries Part 2: Query Basics
- Forming Queries Part 3: Query Optimization
- Forming Queries Part 4: SET Options
- Forming Queries Part 5: Table Optimization Hints
- Using SQL Server Templates
- Transact-SQL Unit Testing
- Index Tuning Wizard
- Unicode and SQL Server
- SQL Server Development Tools
- The SQL Server Transact-SQL Debugger
- The Transact-SQL Debugger, Part 2
- Basic Troubleshooting for Transact-SQL Code
- An Introduction to Spatial Data in SQL Server 2008
- Performance Tuning
- Performance Tuning SQL Server: Tools and Processes
- Performance Tuning SQL Server: Tools Overview
- Creating a Performance Tuning Audit - Defining Components
- Creating a Performance Tuning Audit - Evaluation Part One
- Creating a Performance Tuning Audit - Evaluation Part Two
- Creating a Performance Tuning Audit - Interpretation
- Creating a Performance Tuning Audit - Developing an Action Plan
- Understanding SQL Server Query Plans
- Performance Tuning: Implementing Indexes
- Performance Monitoring Tools: Windows 2008 (and Higher) Server Utilities, Part 1
- Performance Monitoring Tools: Windows 2008 (and Higher) Server Utilities, Part 2
- Performance Monitoring Tools: Windows System Monitor
- Performance Monitoring Tools: Logging with System Monitor
- Performance Monitoring Tools: User Defined Counters
- General Transact-SQL (T-SQL) Performance Tuning, Part 1
- General Transact-SQL (T-SQL) Performance Tuning, Part 2
- General Transact-SQL (T-SQL) Performance Tuning, Part 3
- Performance Monitoring Tools: An Introduction to SQL Profiler
- Performance Tuning: Introduction to Indexes
- Performance Monitoring Tools: SQL Server 2000 Index Tuning Wizard
- Performance Monitoring Tools: SQL Server 2005 Database Tuning Advisor
- Performance Monitoring Tools: SQL Server Management Studio Reports
- Performance Monitoring Tools: SQL Server 2008 Activity Monitor
- The SQL Server 2008 Management Data Warehouse and Data Collector
- Performance Monitoring Tools: Evaluating Wait States with PowerShell and Excel
- Practical Applications
- Choosing the Back End
- The DBA's Toolbox, Part 1
- The DBA's Toolbox, Part 2
- Scripting Solutions for SQL Server
- Building a SQL Server Lab
- Using Graphics Files with SQL Server
- Enterprise Resource Planning
- Customer Relationship Management (CRM)
- Building a Reporting Data Server
- Building a Database Documenter, Part 1
- Building a Database Documenter, Part 2
- Data Management Objects
- Data Management Objects: The Server Object
- Data Management Objects: Server Object Methods
- Data Management Objects: Collections and the Database Object
- Data Management Objects: Database Information
- Data Management Objects: Database Control
- Data Management Objects: Database Maintenance
- Data Management Objects: Logging the Process
- Data Management Objects: Running SQL Statements
- Data Management Objects: Multiple Row Returns
- Data Management Objects: Other Database Objects
- Data Management Objects: Security
- Data Management Objects: Scripting
- Powershell and SQL Server - Overview
- PowerShell and SQL Server - Objects and Providers
- Powershell and SQL Server - A Script Framework
- Powershell and SQL Server - Logging the Process
- Powershell and SQL Server - Reading a Control File
- Powershell and SQL Server - SQL Server Access
- Powershell and SQL Server - Web Pages from a SQL Query
- Powershell and SQL Server - Scrubbing the Event Logs
- SQL Server 2008 PowerShell Provider
- SQL Server I/O: Importing and Exporting Data
- SQL Server I/O: XML in Database Terms
- SQL Server I/O: Creating XML Output
- SQL Server I/O: Reading XML Documents
- SQL Server I/O: Using XML Control Mechanisms
- SQL Server I/O: Creating Hierarchies
- SQL Server I/O: Using HTTP with SQL Server XML
- SQL Server I/O: Using HTTP with SQL Server XML Templates
- SQL Server I/O: Remote Queries
- SQL Server I/O: Working with Text Files
- Using Microsoft SQL Server on Handheld Devices
- Front-Ends 101: Microsoft Access
- Comparing Two SQL Server Databases
- English Query - Part 1
- English Query - Part 2
- English Query - Part 3
- English Query - Part 4
- English Query - Part 5
- RSS Feeds from SQL Server
- Using SQL Server Agent to Monitor Backups
- Reporting Services - Creating a Maintenance Report
- SQL Server Chargeback Strategies, Part 1
- SQL Server Chargeback Strategies, Part 2
- SQL Server Replication Example
- Creating a Master Agent and Alert Server
- The SQL Server Central Management System: Definition
- The SQL Server Central Management System: Base Tables
- The SQL Server Central Management System: Execution of Server Information (Part 1)
- The SQL Server Central Management System: Execution of Server Information (Part 2)
- The SQL Server Central Management System: Collecting Performance Metrics
- The SQL Server Central Management System: Centralizing Agent Jobs, Events and Scripts
- The SQL Server Central Management System: Reporting the Data and Project Summary
- Time Tracking for SQL Server Operations
- Migrating Departmental Data Stores to SQL Server
- Migrating Departmental Data Stores to SQL Server: Model the System
- Migrating Departmental Data Stores to SQL Server: Model the System, Continued
- Migrating Departmental Data Stores to SQL Server: Decide on the Destination
- Migrating Departmental Data Stores to SQL Server: Design the ETL
- Migrating Departmental Data Stores to SQL Server: Design the ETL, Continued
- Migrating Departmental Data Stores to SQL Server: Attach the Front End, Test, and Monitor
- Tracking SQL Server Timed Events, Part 1
- Tracking SQL Server Timed Events, Part 2
- Patterns and Practices for the Data Professional
- Managing Vendor Databases
- Consolidation Options
- Connecting to a SQL Azure Database from Microsoft Access
- SharePoint 2007 and SQL Server, Part One
- SharePoint 2007 and SQL Server, Part Two
- SharePoint 2007 and SQL Server, Part Three
- Querying Multiple Data Sources from a Single Location (Distributed Queries)
- Importing and Exporting Data for SQL Azure
- Working on Distributed Teams
- Professional Development
- Becoming a DBA
- Certification
- DBA Levels
- Becoming a Data Professional
- SQL Server Professional Development Plan, Part 1
- SQL Server Professional Development Plan, Part 2
- SQL Server Professional Development Plan, Part 3
- Evaluating Technical Options
- System Sizing
- Creating a Disaster Recovery Plan
- Anatomy of a Disaster (Response Plan)
- Database Troubleshooting
- Conducting an Effective Code Review
- Developing an Exit Strategy
- Data Retention Strategy
- Keeping Your DBA/Developer Job in Troubled Times
- The SQL Server Runbook
- Creating and Maintaining a SQL Server Configuration History, Part 1
- Creating and Maintaining a SQL Server Configuration History, Part 2
- Creating an Application Profile, Part 1
- Creating an Application Profile, Part 2
- How to Attend a Technical Conference
- Tips for Maximizing Your IT Budget This Year
- The Importance of Blue-Sky Planning
- Application Architecture Assessments
- Transact-SQL Code Reviews, Part One
- Transact-SQL Code Reviews, Part Two
- Cloud Computing (Distributed Computing) Paradigms
- NoSQL for the SQL Server Professional, Part One
- NoSQL for the SQL Server Professional, Part Two
- Object-Role Modeling (ORM) for the Database Professional
- Business Intelligence
- BI Explained
- Developing a Data Dictionary
- BI Security
- Gathering BI Requirements
- Source System Extracts and Transforms
- ETL Mechanisms
- Business Intelligence Landscapes
- Business Intelligence Layouts and the Build or Buy Decision
- A Single Version of the Truth
- The Operational Data Store (ODS)
- Data Marts – Combining and Transforming Data
- Designing Data Elements
- The Enterprise Data Warehouse — Aggregations and the Star Schema
- On-Line Analytical Processing (OLAP)
- Data Mining
- Key Performance Indicators
- BI Presentation - Client Tools
- BI Presentation - Portals
- Implementing ETL - Introduction to SQL Server 2005 Integration Services
- Building a Business Intelligence Solution, Part 1
- Building a Business Intelligence Solution, Part 2
- Building a Business Intelligence Solution, Part 3
- Tips and Troubleshooting
- SQL Server and Microsoft Excel Integration
- Tips for the SQL Server Tools: SQL Server 2000
- Tips for the SQL Server Tools – SQL Server 2005
- Transaction Log Troubles
- SQL Server Connection Problems
- Orphaned Database Users
- Additional Resources
- Tools and Downloads
- Utilities (Free)
- Tool Review (Free): DBDesignerFork
- Aqua Data Studio
- Microsoft SQL Server Best Practices Analyzer
- Utilities (Cost)
- Quest Software's TOAD for SQL Server
- Quest Software's Spotlight on SQL Server
- SQL Server on Microsoft's Virtual PC
- Red Gate SQL Bundle
- Microsoft's Visio for Database Folks
- Quest Capacity Manager
- SQL Server Help
- Visual Studio Team Edition for Database Professionals
- Microsoft Assessment and Planning Solution Accelerator
- Aggregating Server Data from the MAPS Tool
This is the fifth article in a series of a formal process you can follow to migrate data stored in “departmental data stores” (such as Excel, text files, XML documents and so on) into a Relational Database Management System (RDBMS) like SQL Server. The first article in this series is here, and you can click the “Next” link at the bottom of each subsequent article to bring you here.
In the first article, I explained what these data stores are, what they mean to your organization, and when they should be considered for migration. Some data doesn’t need to be stored in an RDBMS, and other data does. I also explained a few methods you can use to locate that data. That’s the first step.
In the second installment I explained how to take that data and model it so that you can tease out the requirements from the discovery you’ve done and how to model that data so that everyone agrees on its final format. I wasn’t able to complete the entire part of that process there, so I finished that step in the article that followed.
In the third tutorial I covered a Business Requirements document in more depth and I explained how to normalize the model into tables and columns. And in the last article I cleaned up the model and explained how I decided to pick the location for the data.
In the fourth tutorial I explained how to design your Extract, Transform and Load (ETL) process, and what your considerations are for data type conversions and so on.
Here’s the outline of the process and where we are so far:
- Locate the data
- Model the system
- Decide on the Destination
- Design the ETL and Migrate the Data
- Attach the front-ends
- Test and Monitor
In this article I’ll explain how to run the ETL process. Although I used a single process (which I’ll describe) for my project, I’ll give you other options for your own. It’s also not a-typical to see multiple processes used, based on what you need to do.
You have a lot of choices here, so there are a few decision points to think about. I’ll stick with what you have right in the box Assuming that you have SQL Server 2005 or higher, PowerShell, and Excel somewhere in the mix. Of course there are other options if you have third-party solutions as well.
Use Excel
The first, and perhaps easiest (at least for me) solution is just to insert the data into SQL Server directly with Transact-SQL statements. But writing them for a lot of data would be a real pain. So I decided to have Excel do it for me.
You can have Excel talk to SQL Server, especially in a read-only fashion. While Excel can be coded to put data back into SQL Server, it isn’t trivial. But there’s an easier way. You can just have Excel create the code for you.
That’s right using simple concatenations in Excel, I designed a complete insertion script to take care of all of the work. It’s actually quite easy, if not a bit tedious. Here’s the process I followed:
Design the Insert Statements
If you’re doing strait insert statements, you can use the INSERT syntax. If you’ve created stored procedures or functions to do your data insertions, you use the EXEC syntax. Either way, the code ends up looking something like this for the Vendor table in my example:
/* Straight Inserts */ INSERT [dbo].[Vendor] ( [VendorCode] , [VendorName] , [Description] , [Address1] , [Address2] , [City] , [State] , [PostalCode] ) VALUES ( N'21342' , N'Hot wheels Catering' , N'Great food, fast' , N'221 B Baker Street' , N'' , N'Bellevue' , N'WA' , N'98042 ')
Really the only parts of the INSERT statement that change are the actual values themselves.
Write the Formula
So I moved down to an empty spot on my user’s spreadsheet, and then created the following formula:
="INSERT Vendor (VendorCode, VendorName, Description, Address1, Address2, City, State, PostalCode) VALUES ('" & $A2 & "','" & $C2 & "','" & $D2 & "','" & $E2 & "','" & $F2 & "','" & $R2 & "','" & $S2 & "','" & $T2 & "')"
OK, it looks kind of intense, but it really isn’t. It’s a simple matter of finding the cells I wanted for the values, and typing that in where you see the “$” parts. That’s it.
Use the INSERT Statements
From there I copied the formula for all of the rows, and Excel wrote this for me (I’m only showing one line of output here):
INSERT Vendor (VendorCode, VendorName, Description, Address1, Address2, City, State, PostalCode) VALUES ('25364','Acme Office Supplies','Downtown Bellevue','123 7th Avenue South', 'PO Box 34122A','Bellevue','WA','98042')
Easy Peasy. I pasted all of the rows into notepad as a script, and now I can run that whenever and however I want from SQL Server Management Studio, osql, SQLCMD, PowerShell, or any other command-query tool.
Use OpenQuery or OpenRowSet
You might want to transfer the data more often, have more control, or not want to copy the Excel spreadsheet. Or perhaps you’re not allowed to copy the spreadsheet or add to theirs. No problem have SQL Server reach across and read the data directly. From there you can create T-SQL statements (as above) or directly insert the data, or perhaps place it in staging tables if you want to go that route.
The trick is a “remote query.” You have a couple of ways to do this you can use a linked server (not my preference for many reasons) or just use a single query to open a connection to Excel and read the data. If you want to use a linked server (more permanent), read up on the OpenQuery syntax. If you’re like me and just want to open the query and then close it, you can use the OpenRowSet syntax. This treats the Excel spreadsheet as a database, and you can even use rudimentary SQL statements on it.
Before you do this, again let me remind you to read and understand all of the statements I’m showing you here, and test first on a development server. To use these statements you need to allow “Ad Hoc Distributed Queries,” and that might have security implications at your shop. To be safe, bring the data in to a test server, and then transfer that to your “real” SQL Server Instance.
Here’s the statements you can use to open up the Ad Hoc Query functions on your test server:
/* Retrieve Data from Excel */ EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'Ad Hoc Distributed Queries', 1 RECONFIGURE WITH OVERRIDE GO
With that done, and assuming an Excel 2007 spreadsheet in the c:\temp directory with a tab called “Vendors”, here’s a sample query from my SQL Server Instance that reads all of the data for me:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0' , 'Excel 12.0;Database=c:\temp\VendorList.xlsx;HDR=YES', 'SELECT * FROM [Vendors$]')
Now I’ll make it interesting. I’ll take a subset of the data and put it in a temporary table so that you can see the basic syntax for an insert operation with this method:
/* An example using SELECT and INSERT INTO */ CREATE TABLE #Test1 (c1 VARCHAR(255), c2 VARCHAR(255)) INSERT INTO #Test1 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0' , 'Excel 12.0;Database=c:\temp\VendorList.xlsx;HDR=YES', 'SELECT [Vendor Code] , [Vendor Name] FROM [Vendors$] WHERE [Vendor Name] = "Microsoft"') SELECT * FROM #Test1; GO
The keys here are lines that follow just after the OPENROWSET function that’s basically the driver. You’ll need to look that up if you’re not using Excel, or even Excel 2007, since it’s different based on what you want to do. But this method works from sources as varied as Oracle, text files, XML, Access and more.
Use PowerShell
This one was an interesting choice. I’ve been using PowerShell for just about everything these days, so I wondered if I could treat it as a mix between creating the syntax for the inserts using a Stored Procedure, and reading the Excel file like I did with OpenRowSet. Once again, the magic here is in that connection string. Here’s the code I used:
$ExcelConnection= New-Object -com "ADODB.Connection" $ExcelFile="c:\temp\VendorList.xlsx" $strQuery="Select * from [Vendors$]" $ExcelConnection.Open("Provider=Microsoft.ACE.OLEDB.12.0;` Data Source=$ExcelFile;Extended Properties=Excel 12.0;") $ExcelRecordSet=$ExcelConnection.Execute($strQuery) do { Write-Host "EXEC sp_InsertVendors '" $ExcelRecordSet.Fields.Item("Vendor Code").Value "'" $ExcelRecordSet.MoveNext()} Until ($ExcelRecordSet.EOF) $ExcelConnection.Close()
There are actually other ways to do this with PowerShell. In fact, you can use PowerShell to open the spreadsheet, take the data from the changes in it, and update the rows in SQL Server from there, using something called a Dataset. I’m thinking of writing a separate article on that process, but this should get you started.
Use SQL Server Integration Services (SSIS)
Possibly the richest, most powerful way to move the data into SQL Server is to use SQL Server Integration Services, or SSIS. I won’t cover the complete process I followed to make this package for two reasons one is that it is pretty complex, and the other is that a friend helped me do this! (Thanks, Alex Viera).
If you’re not familiar with SSIS to begin with, start here and read up on that first. Alex helped me create a package that had a data flow that looks something like this:
The interesting parts are the “Data Conversion” task, the “Derive Columns” task, and the “Multicast” tasks. I’ll briefly explain why we chose this route.
Excel has various data types in the fields, but in my experience I’ve found that users don’t normally set them unless they are dates or times. It looks fine on the screen, but it isn’t always the data type they think it is. Excel will happily add numbers even when they are text, for instance.
For that reason, you must assume that the data is not in the proper type. Whenever I work with SSIS and Excel, I always start with a Data Conversion task, which basically lists the columns (which in Excel are often “Unicode”) and allows you to put them in the proper data types. Once again, that ERD you created earlier comes into play.
From there, the data streams into a “Derived Column” task. This takes data from the source and can create new columns (which I needed to break out City, State and Zip) or combine them, and so on. I always name those columns such that I can tell that this is what happened.
Now I pass the data on to the “MultiCast” task, so that I can get the entire data set from one place but send it to several tables at once. This handles all of the Primary and Foreign Key relationships for me, since this is a complete new Insert operation. If I already have data in the tables and want to tie out those keys using new data from Excel, I have to use a Lookup Task. You can see why this gets a little more complicated than just using the process I followed in Excel!
One final choice: you could also use the bcp SQL Server utility to move the data in, but that’s its own discussion. As I played around with that, I found it more difficult than the methods I’ve showed you above.
In the next articles I’ll show you how your choices for a front-end for the new data source.
InformIT Articles and Sample Chapters
My article series on database design starts here.
Books and eBooks
Database Design for Mere Mortals is a great book on database design.
Online Resources
You can learn more about Business Process Model Notation here.