<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'Administration' and 'catalog views'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=Administration,catalog+views&amp;orTags=0</link><description>Search results matching tags 'Administration' and 'catalog views'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Using the catalog views : clearing out a &amp;quot;botched&amp;quot; schema</title><link>http://sqlblog.com/blogs/aaron_bertrand/archive/2011/07/07/using-the-catalog-views-clearing-out-a-botched-schema.aspx</link><pubDate>Thu, 07 Jul 2011 15:16:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:36703</guid><dc:creator>AaronBertrand</dc:creator><description>&lt;p&gt;A user on StackOverflow had populated a custom schema with a bunch of tables, and needed to replace them with a new set of tables due to various changes. But he couldn't just drop them all in any arbitrary order, because there were foreign keys in place. His workaround was to just run a "drop all tables" script multiple times until there were no more errors. As you can imagine, on a complicated enough schema, this can be really tedious. Even on a small schema, this just doesn't feel like the right way.&lt;br&gt;&lt;br&gt;Let's assume the following case:&lt;/p&gt;

&lt;blockquote&gt;
&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;USE &lt;/font&gt;&lt;font color="black"&gt;[tempdb]&lt;/font&gt;&lt;font color="gray"&gt;;&lt;br&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font color="blue"&gt;GO&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="black"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;CREATE SCHEMA &lt;/font&gt;&lt;font color="black"&gt;[blat] &lt;/font&gt;&lt;font color="blue"&gt;AUTHORIZATION &lt;/font&gt;&lt;font color="black"&gt;[dbo]&lt;/font&gt;&lt;font color="gray"&gt;;&lt;br&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font color="blue"&gt;GO&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="black"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;CREATE TABLE &lt;/font&gt;&lt;font color="black"&gt;[blat].A&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;id &lt;/font&gt;&lt;font color="blue"&gt;INT PRIMARY KEY&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;);&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;CREATE TABLE &lt;/font&gt;&lt;font color="black"&gt;[blat].B&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;id &lt;/font&gt;&lt;font color="blue"&gt;INT PRIMARY KEY FOREIGN KEY &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REFERENCES &lt;/font&gt;&lt;font color="black"&gt;[blat].A&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;id&lt;/font&gt;&lt;font color="gray"&gt;)&lt;br&gt;);&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;CREATE TABLE &lt;/font&gt;&lt;font color="black"&gt;[blat].C&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;id &lt;/font&gt;&lt;font color="blue"&gt;INT FOREIGN KEY &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REFERENCES &lt;/font&gt;&lt;font color="black"&gt;[blat].B&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;id&lt;/font&gt;&lt;font color="gray"&gt;)&lt;br&gt;);&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="green"&gt;-- let's also create a table in another schema&lt;br&gt;-- that points at tables in this schema:&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;CREATE TABLE &lt;/font&gt;&lt;font color="black"&gt;[dbo].D&lt;br&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;id1 &lt;/font&gt;&lt;font color="blue"&gt;INT FOREIGN KEY &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REFERENCES &lt;/font&gt;&lt;font color="black"&gt;[blat].A&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;id&lt;/font&gt;&lt;font color="gray"&gt;),&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="black"&gt;id2 &lt;/font&gt;&lt;font color="blue"&gt;INT FOREIGN KEY &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REFERENCES &lt;/font&gt;&lt;font color="black"&gt;[blat].B&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;id&lt;/font&gt;&lt;font color="gray"&gt;)&lt;br&gt;);&lt;br&gt;&lt;/font&gt;&lt;font&gt;&lt;font color="blue"&gt;GO&lt;/font&gt;&lt;/font&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;


&lt;p&gt;Initially if you try this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;DROP TABLE &lt;/font&gt;&lt;font color="black"&gt;[blat].A&lt;/font&gt;&lt;font color="gray"&gt;;&lt;/font&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;



You get this error message:

&lt;blockquote&gt;
&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div style="color:red;padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;
Msg 3726, Level 16, State 1, Line 1&lt;br&gt;Could not drop object 'blat.A' because it is referenced by a FOREIGN KEY constraint. &lt;br&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;



&lt;p&gt;So I put together a quick script that would allow you to drop all of the tables in the schema, by first removing all of the foreign key constraints. In this case order within each set of statements is unimportant, so we can use lazy string concatenation instead of more complicated FOR XML queries that allow you to dictate order:&lt;/p&gt;
&lt;blockquote&gt;
&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;DECLARE &lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#434343"&gt;@schema_to_empty &lt;/font&gt;&lt;font color="blue"&gt;SYSNAME &lt;/font&gt;&lt;font color="gray"&gt;=&lt;/font&gt;&lt;font&gt;&lt;font color="#434343"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="blue"&gt; &lt;/font&gt;&lt;font color="red"&gt;N'blat'&lt;/font&gt;&lt;font color="gray"&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#434343"&gt;@sql &lt;/font&gt;&lt;font color="blue"&gt;             NVARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="magenta"&gt;MAX&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="gray"&gt;=&lt;/font&gt;&lt;font&gt;&lt;font color="#434343"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="blue"&gt; &lt;/font&gt;&lt;font color="red"&gt;N''&lt;/font&gt;&lt;font color="gray"&gt;;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="green"&gt;-- drop all references to tables in the blat schema,&lt;br&gt;-- even FKs on tables in other schemas.&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="#434343"&gt;@sql &lt;/font&gt;&lt;font color="gray"&gt;+=&lt;/font&gt;&lt;font color="blue"&gt; &lt;/font&gt;&lt;font color="red"&gt;N'&lt;br&gt;	ALTER TABLE '&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;+ &lt;/font&gt;&lt;font color="magenta"&gt;QUOTENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font&gt;&lt;font color="magenta"&gt;OBJECT_SCHEMA_NAME&lt;/font&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;k.parent_object_id&lt;/font&gt;&lt;font color="gray"&gt;))&lt;br&gt;&amp;nbsp;&amp;nbsp; + &lt;/font&gt;&lt;font color="red"&gt;'.' &lt;/font&gt;&lt;font color="gray"&gt;+ &lt;/font&gt;&lt;font color="magenta"&gt;QUOTENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="magenta"&gt;OBJECT_NAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;k.parent_object_id&lt;/font&gt;&lt;font color="gray"&gt;))&lt;br&gt;&amp;nbsp;&amp;nbsp; + &lt;/font&gt;&lt;font color="red"&gt;' DROP CONSTRAINT ' &lt;/font&gt;&lt;font color="gray"&gt;+ &lt;/font&gt;&lt;font color="magenta"&gt;QUOTENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;k.[name]&lt;/font&gt;&lt;font color="gray"&gt;) + &lt;/font&gt;&lt;font color="red"&gt;';'&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;FROM &lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;sys&lt;/font&gt;&lt;/font&gt;&lt;font color="black"&gt;.&lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;foreign_keys&lt;/font&gt;&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;k&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;INNER JOIN &lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;sys&lt;/font&gt;&lt;/font&gt;&lt;font color="black"&gt;.&lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;tables&lt;/font&gt;&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;t&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;ON &lt;/font&gt;&lt;font color="black"&gt;k.referenced_object_id &lt;/font&gt;&lt;font color="gray"&gt;=&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="black"&gt;t.[object_id]&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;WHERE &lt;/font&gt;&lt;font color="black"&gt;t.[schema_id] &lt;/font&gt;&lt;font color="gray"&gt;=&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font&gt;&lt;font color="magenta"&gt;SCHEMA_ID&lt;/font&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="#434343"&gt;@schema_to_empty&lt;/font&gt;&lt;font color="gray"&gt;);&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="green"&gt;-- then drop all the tables.&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="#434343"&gt;@sql &lt;/font&gt;&lt;font color="gray"&gt;+=&lt;/font&gt;&lt;font color="blue"&gt; &lt;/font&gt;&lt;font color="red"&gt;N'&lt;br&gt;	DROP TABLE ' &lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;+ &lt;/font&gt;&lt;font color="magenta"&gt;QUOTENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="#434343"&gt;@schema_to_empty&lt;/font&gt;&lt;font color="gray"&gt;) + &lt;/font&gt;&lt;font color="red"&gt;'.'&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="gray"&gt;+ &lt;/font&gt;&lt;font color="magenta"&gt;QUOTENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;[name]&lt;/font&gt;&lt;font color="gray"&gt;) + &lt;/font&gt;&lt;font color="red"&gt;';'&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;FROM &lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;sys&lt;/font&gt;&lt;/font&gt;&lt;font color="black"&gt;.&lt;/font&gt;&lt;font color="black"&gt;&lt;font color="green"&gt;tables&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;WHERE &lt;/font&gt;&lt;font color="black"&gt;[schema_id]&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="gray"&gt;=&lt;/font&gt;&lt;font color="blue"&gt; &lt;/font&gt;&lt;font&gt;&lt;font color="magenta"&gt;SCHEMA_ID&lt;/font&gt;&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="#434343"&gt;@schema_to_empty&lt;/font&gt;&lt;font color="gray"&gt;);&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;-- if the output is &amp;lt; 8K, you can inspect it using PRINT:&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;PRINT &lt;/font&gt;&lt;font color="#434343"&gt;@sql&lt;/font&gt;&lt;font color="gray"&gt;;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="green"&gt;-- in case it's too big for PRINT (&amp;gt; 8K), but still less than 64K&lt;br&gt;-- you can run this in grid mode, click on the output, and copy the&lt;br&gt;-- script from the new window that is created:&lt;br&gt;&lt;br&gt;-- SELECT CONVERT(XML, @sql);&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font&gt;&lt;font color="green"&gt;-- or you can just trust me and run it, MWAHAHAHAHA!:&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="green"&gt;-- EXEC sp_executeSQL @sql;&lt;/font&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;




&lt;p&gt;You may also want / need to clear out other objects, such as views that reference objects in this schema, or triggers on tables in other schemas that reference objects in this schema. Those bring about other complications I'll address in a future post, if there is enough interest. &lt;/p&gt;
&lt;p&gt;In the meantime, wouldn't it be great if we had CREATE OR REPLACE functionality that would, in addition to preventing us from having to drop all the objects first or write complex existence checks and alter commands, also sever these dependencies for us? You can vote for this functionality at &lt;a href="http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace" title="http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace" target="_blank"&gt;Connect #127219&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;It would also be nice to have a DROP SCHEMA command that did the same type of thing as I manually do above. Instead of just complaining that the schema is not empty, I'd love to see a DROP SCHEMA ... WITH FORCE option, or something similar, where it took care of all the objects for you - much like DROP DATABASE does. Of course this would be easy to implement in a simple case, but not when schemas have cross-dependencies and references that are embedded in module definitions rather than straightforward DRI and similar constructs.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;br&gt;&lt;/p&gt;</description></item></channel></rss>