Click here to Skip to main content
Licence BSD
First Posted 2 May 2008
Views 34,765
Downloads 337
Bookmarked 38 times

Check Validity of SQL Server Stored Procedures/Views/Functions (updated)

By | 19 Sep 2008 | Article
Command line tool to check validity of objects in SQL Server databases
 
Part of The SQL Zone sponsored by
See Also

Introduction

This is an updated version of the code posted by IPC2000. The following changes have been made:

  • References to the enterprise library have been removed, allowing for more flexibility in specifying the connection string. Connection strings and verbosity can be specified on the command line.
  • Output is more "spreadsheet friendly", using tab delimited output that can be copy/pasted into Excel
  • Support for SQL 2005 has been introduced. Separation of user from schema in SQL 2005 requires a slightly different SQL statement.
  • Validation logic has been moved to a separate class which allows for referencing/use in another project. This is especially handy for inclusion as an NUnit test.

Background

Please refer to this article for more background on the validation. This is simply a polished version of that piece.

Using the Code

The console executable can be run specifying a /c:<connection string> argument as well as a /v:<verbosity> argument. Verbosity values are:

  • Quiet: Designed for spreadsheets, a tab delimited list of invalid objects
  • Normal (default): Includes some description of what's going on. Version of SQL Server detected and a summary of objects processed and object failures
  • Verbose: Code will list every object processed as it's processing it 

Update

A new switch, /x, has been added to ask the program to actually run any procedure, function, view it thinks is safe.  If CREATE, DROP, INSERT, UPDATE, DELETE, or EXEC/EXECUTE appears in the text of the object it will move on, otherwise, it will add a dummy value for each parameter it finds and execute the object.  Since the logic isn't perfect (stored procs can call functions that do bad things), this is turned off by default, but enabling it should generally be safe if the system was coded using best practices.  This feature has limited testing behind it - please comment below if you find issues and I'll take a look when I can.

You can also reference the executable directly into NUnit and run the corresponding method. Here's an example C# test method:

[TestFixture]
public class DatabaseValidation
{
    [Test]
    public void CheckForDatabaseCompilationProblems()
    {
	Assert.IsTrue(
	DatabaseValidator.Validator.DatabaseIsValid(
	ConfigurationManager.ConnectionStrings
	[MyConnectionString].ConnectionString,
	DatabaseValidator.Verbosity.Normal),
	"Invalid objects found in the database - Run SqlValidator");
    } 
} 

History

  • 2008-05-02: Initial post

License

This article, along with any associated source code and files, is licensed under The BSD License

About the Author

Emil Lerch



United States United States

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionChanges from previous version Pinmembertomvincent9:23 16 Nov '11  
GeneralTriggers Pinmemberps_eric12:26 29 Nov '10  
GeneralRe: Triggers PinmemberEmil Lerch17:37 5 Mar '11  
GeneralRuns on SQL 2008 But does not catch everything PinmemberVaccano13:41 25 Mar '09  
GeneralConnection string and SSPI Security context [modified] PinmemberC.D. Hilton4:11 23 Sep '08  
GeneralNice! Pinmembermsmits19:55 26 May '08  
GeneralSome welcome additions... Pinmembermsmits20:07 26 May '08  
GeneralRe: Some welcome additions... PinmemberEmil Lerch13:00 19 Sep '08  
GeneralVery useful/clever Pinmemberpap196420:35 6 May '08  
Thank both writers for the nice tool. The idea is simple, clever and effective!
 
Just as small correction for SQL Server 2000: schema is a reserved word, so it must be quoted when used as a column name, i.e. in GetProcedureListSql
 
getObjSql = "select name, OBJECTPROPERTY(id, 'ExecIsQuotedIdentOn') as quoted_ident_on, OBJECTPROPERTY(id, 'ExecIsAnsiNullsOn') as ansi_nulls_on, user_name(o.uid) \"schema\" from sysobjects o where type in ('P', 'V', 'FN') and category = 0";
GeneralRe: Very useful/clever PinmemberWil Hutton5:28 19 May '08  
GeneralRe: Very useful/clever PinmemberEmil Lerch7:50 19 May '08  
General[Message Removed] PinmemberMojtaba Vali20:31 2 May '08  
GeneralHorizontal Scrolling PinmemberChris Meech6:34 2 May '08  
GeneralRe: Horizontal Scrolling PinmemberEmil Lerch6:42 2 May '08  
GeneralRe: Horizontal Scrolling PinmemberChris Meech9:30 2 May '08  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120529.1 | Last Updated 19 Sep 2008
Article Copyright 2008 by Emil Lerch
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid