In my previous post, “Automating Deployments with SQL Compare command line” I looked at how teams can automate
the deployment and post deployment validation of SQL Server databases using
the command line versions of
Red Gate tools. In this post I’m looking at another use for
the command line tools, namely using them to generate up-to-date documentation with every database change.
There are many reasons why up-to-date documentation is valuable. For example when somebody new has to work on or administer a database for
the first time, or when a new database comes into service. Having database documentation reduces
the risks of making incorrect decisions when making changes. Documentation is very useful to business intelligence analysts when writing reports, for example in SSRS. There are a couple of great examples talking about why up to date documentation is valuable on this site: Database Documentation – Lands of Trolls: Why and How? and Database Documentation Using SQL Doc.
The short answer is that it can save you time and reduce risk when you need that most!
SQL Doc is a fast simple tool that automatically generates database documentation. It can create documents in HTML, Word or pdf files.
The documentation contains information about object definitions and dependencies, along with any other information you want to associate with each object.
The SQL Doc GUI, which is included in
Red Gate’s SQL Developer Bundle and SQL Toolbelt, allows you to add additional notes to objects, and customise which objects are shown in
the docs. These settings can be saved as a .sqldoc project file.
The SQL Doc command line can use this project file to automatically update
the documentation every time
the database is changed, ensuring that documentation that is always up to date.
The simplest way to keep documentation up to date is probably to use a scheduled task to run a script every day. However if you have a source controlled database, or are using a Continuous Integration (CI) server or a build server, it may make more sense to use that instead.
If you’re using SQL Source Control or SSDT Database Projects to help version control your database, you can automatically update
the documentation after each change is made to
the source control repository that contains your database. To get this automation in place, you can use
the functionality of a Continuous Integration (CI) server, which can trigger commands to run when a source control repository has changed. A CI server will also capture and save
the documentation that is created as an artifact, so you can always find
the exact documentation for a specific version of
the database. This forms an always up to date data dictionary.
If you don’t already have a CI server in place there are several you can use, such as
the free open source Jenkins or
the free starter editions of TeamCity. I won’t cover setting these up in this article, but there is information about using CI servers for automating database tasks on
the Red Gate Database Delivery webpage. You may be interested in
Red Gate’s SQL CI utility (part of
the SQL Automation Pack) which is an easy way to update a database with
the latest changes from source control.
The PowerShell example below shows how to create
the documentation from a database. That database might be your integration database or a shared development database that is always up to date with
the latest changes.
$serverName = "server\instance"
$databaseName = "databaseName" # If you want to document multiple databases use a comma separated list
$userName = "username"
$password = "password"
# Path to SQLDoc.exe
$SQLDocPath = "C:\Program Files (x86)\Red Gate\SQL Doc 3\SQLDoc.exe"
$arguments = @(
"/server:$($serverName)",
"/database:$($databaseName)",
"/username:$($userName)",
"/password:$($password)",
"/filetype:html",
"/outputfolder:.",
# "/project:$args[0]", # If you already have a .sqldoc project file you can pass it as an argument to this script. Values in
the project will be overridden with any options set on
the command line
"/name:$databaseName Report",
"/copyrightauthor:$([Environment]::UserName)"
)
write-host $arguments
& $SQLDocPath $arguments
There are several options you can set on
the command line to vary how your documentation is created. For example, you can document multiple databases or exclude certain types of objects. In
the example above, we set
the name of
the report to match
the database name, and use
the current Windows user as
the documentation author. For more examples of how you can customise
the report from
the command line please see
the SQL Doc command line documentation
If you already have a .sqldoc project file, or wish to further customise
the report by including or excluding specific objects, you can use this project on
the command line. Any settings you specify on
the command line will override
the defaults in
the project. For details of what you can customise in
the project please see
the SQL Doc project documentation.
In
the example above,
the line to use a project is commented out, but you can uncomment this line and then pass a path to a .sqldoc project file as an argument to this script.
Conclusion
Keeping documentation about your databases up to date is very easy to set up using SQL Doc and PowerShell. By using a CI server to run this process you can trigger
the documentation to be run on every change to a source controlled database, and keep historic documentation available.
If you are considering more advanced database automation, e.g. database unit testing, change script generation, deploying to large numbers of targets and backup/verification, please email me at
[email protected] for further script samples or if you have any questions.