<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQLKnowledge.com &#187; DDL_DATABASE_LEVEL_EVENTS</title>
	<atom:link href="http://sqlknowledge.com/tag/ddl_database_level_events/feed/" rel="self" type="application/rss+xml" />
	<link>http://sqlknowledge.com</link>
	<description>Life is SQLized..</description>
	<lastBuildDate>Wed, 27 Jul 2011 20:53:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Audit databases &#8211; Using DDL triggers</title>
		<link>http://sqlknowledge.com/2010/06/audit-databases-using-ddl-triggers/</link>
		<comments>http://sqlknowledge.com/2010/06/audit-databases-using-ddl-triggers/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 08:31:12 +0000</pubDate>
		<dc:creator>Deepak</dc:creator>
				<category><![CDATA[Scripts]]></category>
		<category><![CDATA[SQL DBA]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[change log]]></category>
		<category><![CDATA[DDL Triggers]]></category>
		<category><![CDATA[DDL_DATABASE_LEVEL_EVENTS]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event_instance]]></category>
		<category><![CDATA[msdb]]></category>
		<category><![CDATA[sql audit]]></category>

		<guid isPermaLink="false">http://sqlknowledge.com/2010/06/audit-databases-using-ddl-triggers/</guid>
		<description><![CDATA[As a DBA, do you ever wonder what is going inside your production database? Who is changing database schema during production time without informing you. Now, you need not to worry, you can setup DDL triggers to easily records all changes in table; like what was changed, when and by whom etc. Given is two [...]]]></description>
			<content:encoded><![CDATA[<p>As a DBA, do you ever wonder what is going inside your production database? Who is changing database schema during production time without informing you. Now, you need not to worry, you can setup DDL triggers to easily records all changes in table; like what was changed, when and by whom etc. Given is two set of commands that you need to use and leave all worries aside. Also, you can prepare customized email alerts on top of data table to notify you as soon as an event occurs.  </p>
<p>Create a table that will store all records. For example I am using MSDB database to store this table. <br />a DDL trigger need to created inside database; for that you want to enable audit. This trigger will capture all DDL events and save in table. Test and check process by creating test procedure, tables etc.  </p>
<p><strong>1. Script to create table</strong></p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">USE</span> [msdb] </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> ANSI_NULLS <span class="kwrd">ON</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> QUOTED_IDENTIFIER <span class="kwrd">ON</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> ANSI_PADDING <span class="kwrd">ON</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> [dbo].[DatabaseChangeLog]( </pre>
<pre>    [LogId] [<span class="kwrd">int</span>] <span class="kwrd">IDENTITY</span>(1,1) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, </pre>
<pre class="alt">    [DatabaseName] [<span class="kwrd">varchar</span>](256) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, </pre>
<pre>    [EventType] [<span class="kwrd">varchar</span>](50) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, </pre>
<pre class="alt">    [ObjectName] [<span class="kwrd">varchar</span>](256) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, </pre>
<pre>    [ObjectType] [<span class="kwrd">varchar</span>](25) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, </pre>
<pre class="alt">    [SqlCommand] [<span class="kwrd">varchar</span>](<span class="kwrd">max</span>) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>, </pre>
<pre>    [EventDate] [datetime] <span class="kwrd">NOT</span> <span class="kwrd">NULL</span> <span class="kwrd">CONSTRAINT</span> [DF_DBChangeLog_EventDate]  <span class="kwrd">DEFAULT</span> (getdate()), </pre>
<pre class="alt">    [LoginName] [<span class="kwrd">varchar</span>](256) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span> </pre>
<pre>) <span class="kwrd">ON</span> [<span class="kwrd">PRIMARY</span>] </pre>
<pre class="alt"><span class="kwrd">GO</span> </pre>
<pre><span class="kwrd">SET</span> ANSI_PADDING <span class="kwrd">OFF</span> </pre>
<pre>&nbsp;</pre>
</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p><a href="http://sqlknowledge.com/wp-content/uploads/2010/06/clip_image00241.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://sqlknowledge.com/wp-content/uploads/2010/06/clip_image0024_thumb1.jpg" width="678" height="300"/></a></p>
<p>&nbsp; <br /><strong>2. Script to create database trigger</strong></p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">USE</span> [SQLKnowledge] </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> ANSI_NULLS <span class="kwrd">ON</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> QUOTED_IDENTIFIER <span class="kwrd">ON</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">CREATE</span> <span class="kwrd">trigger</span> [TrgDBChangeLog] </pre>
<pre><span class="kwrd">on</span> <span class="kwrd">database</span> </pre>
<pre class="alt"><span class="kwrd">for</span> DDL_DATABASE_LEVEL_EVENTS </pre>
<pre><span class="kwrd">as</span> </pre>
<pre class="alt"><span class="kwrd">set</span> nocount <span class="kwrd">on</span> </pre>
<pre><span class="kwrd">If</span> Object_ID(<span class="str">'msdb.dbo.DatabaseChangeLog'</span>) <span class="kwrd">IS</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span> </pre>
<pre class="alt"><span class="kwrd">BEGIN</span> </pre>
<pre><span class="kwrd">declare</span> @<span class="kwrd">data</span> xml </pre>
<pre class="alt"><span class="kwrd">set</span> @<span class="kwrd">data</span> = EVENTDATA() </pre>
<pre>insert <span class="kwrd">into</span> msdb.dbo.DatabaseChangeLog(databasename, eventtype, objectname, objecttype, sqlcommand, loginname) </pre>
<pre class="alt"><span class="kwrd">values</span>( </pre>
<pre>@<span class="kwrd">data</span>.<span class="kwrd">value</span>(<span class="str">'(/EVENT_INSTANCE/DatabaseName)[1]'</span>, <span class="str">'varchar(256)'</span>), </pre>
<pre class="alt">@<span class="kwrd">data</span>.<span class="kwrd">value</span>(<span class="str">'(/EVENT_INSTANCE/EventType)[1]'</span>, <span class="str">'varchar(50)'</span>), </pre>
<pre>@<span class="kwrd">data</span>.<span class="kwrd">value</span>(<span class="str">'(/EVENT_INSTANCE/ObjectName)[1]'</span>, <span class="str">'varchar(256)'</span>), </pre>
<pre class="alt">@<span class="kwrd">data</span>.<span class="kwrd">value</span>(<span class="str">'(/EVENT_INSTANCE/ObjectType)[1]'</span>, <span class="str">'varchar(25)'</span>), </pre>
<pre>@<span class="kwrd">data</span>.<span class="kwrd">value</span>(<span class="str">'(/EVENT_INSTANCE/TSQLCommand)[1]'</span>, <span class="str">'varchar(max)'</span>), </pre>
<pre class="alt">@<span class="kwrd">data</span>.<span class="kwrd">value</span>(<span class="str">'(/EVENT_INSTANCE/LoginName)[1]'</span>, <span class="str">'varchar(256)'</span>) </pre>
<pre>) </pre>
<pre class="alt"><span class="kwrd">END</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> ANSI_NULLS <span class="kwrd">OFF</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt"><span class="kwrd">SET</span> QUOTED_IDENTIFIER <span class="kwrd">OFF</span> </pre>
<pre><span class="kwrd">GO</span> </pre>
<pre class="alt">ENABLE <span class="kwrd">TRIGGER</span> [TrgDBChangeLog] <span class="kwrd">ON</span> <span class="kwrd">DATABASE</span> </pre>
</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>&nbsp;</p>
<p><a href="http://sqlknowledge.com/wp-content/uploads/2010/06/clip_image0041.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image004" border="0" alt="clip_image004" src="http://sqlknowledge.com/wp-content/uploads/2010/06/clip_image004_thumb1.jpg" width="593" height="300"/></a></p>
<p><strong>3. Script to test process and check Audit records<br /></strong></p>
<div class="csharpcode">
<pre class="alt"><span class="rem">-- Test table creation </span></pre>
<pre><span class="kwrd">use</span> SQLKnowledge </pre>
<pre class="alt"><span class="kwrd">create</span> <span class="kwrd">table</span> test (fname <span class="kwrd">varchar</span>(10), lname <span class="kwrd">varchar</span>(10)) </pre>
<pre>&nbsp;</pre>
<pre class="alt"><span class="rem">-- Test procedure creation </span></pre>
<pre><span class="kwrd">create</span> <span class="kwrd">proc</span> test1 </pre>
<pre class="alt"><span class="kwrd">as</span> </pre>
<pre><span class="kwrd">select</span> * <span class="kwrd">from</span> msdb.dbo.DatabaseChangeLog </pre>
<pre class="alt">&nbsp;</pre>
<pre><span class="rem">-- Check table records in msdb database </span></pre>
<pre class="alt"><span class="kwrd">select</span> * <span class="kwrd">from</span> msdb.dbo.DatabaseChangeLog </pre>
<pre>&nbsp;</pre>
</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p><a href="http://sqlknowledge.com/wp-content/uploads/2010/06/clip_image0061.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://sqlknowledge.com/wp-content/uploads/2010/06/clip_image006_thumb1.jpg" width="640" height="300"/></a></p>
<p>Please leave a comment, if you have questions or need suggestions</p>
]]></content:encoded>
			<wfw:commentRss>http://sqlknowledge.com/2010/06/audit-databases-using-ddl-triggers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

